Ubuntu 上 Kubernetes 网络配置要点
一 基础环境与内核参数
- 建议在所有节点完成以下基础配置,确保容器网络与网桥转发正常工作:
- 时间同步:安装并启用 chrony,统一节点时间,避免证书/控制面异常。
- 主机名与 /etc/hosts:为各节点设置唯一 hostname,并在 /etc/hosts 中固化解析,便于集群内稳定通信。
- 禁用交换分区:执行 swapoff -a 并注释 /etc/fstab 中的 swap 条目,或在 systemd 层面禁用与屏蔽,避免 kubelet 异常。
- 防火墙:在测试/实验环境可使用 ufw disable 简化网络连通性;生产环境建议改为精细化放行策略(见下文端口与策略)。
- 内核模块与 sysctl:
- 加载模块:创建 /etc/modules-load.d/k8s.conf,加入 overlay、br_netfilter;执行 modprobe 使其生效。
- 开启桥接流量到 iptables:创建 /etc/sysctl.d/k8s.conf,设置 net.bridge.bridge-nf-call-iptables=1、net.bridge.bridge-nf-call-ip6tables=1、net.ipv4.ip_forward=1,并执行 sysctl --system 使配置生效。
二 网络模型与 CNI 插件
- 理解并遵循 Kubernetes 的 Pod 网络模型:
- 每个 Pod 拥有独立 IP(IP-per-Pod),同一 Pod 内多容器共享网络命名空间,可通过 localhost 互通。
- 集群网络应“扁平化”:任意 Pod ↔ 任意 Pod、节点 ↔ 任意 Pod 之间可直接通信,通常不应依赖 NAT;同一 Pod 内容器通过 localhost 通信。
- 选择并部署 CNI 网络插件(二选一或按场景选择):
- Calico:基于 BGP 或 IPIP,支持 NetworkPolicy,适合需要细粒度网络策略与稳定生产环境的集群。
- Flannel:基于 VXLAN 或 Host-GW,部署简单,适合测试/小规模环境;节点规模较大时 VXLAN 可能成为性能瓶颈。
- 安装示例(择一执行):
- Calico:
- kubectl apply -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
- kubectl apply -f https://docs.projectcalico.org/manifests/custom-resources.yaml
- Flannel:
- kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 初始化控制面时,需与所选插件的 Pod CIDR 保持一致(例如 Flannel 常用 10.244.0.0/16)。
三 Service 与对外暴露
- Service 抽象用于解耦后端 Pod 的动态变化,提供稳定的访问入口与负载均衡:
- ClusterIP:集群内部访问入口,默认类型。
- NodePort:在每个节点开放静态端口,将流量转发到后端 Pod,便于从集群外部访问。
- LoadBalancer:对接云厂商负载均衡器,对外暴露服务。
- Ingress:基于 HTTP/HTTPS 的七层路由,将域名/路径映射到后端 Service,通常与 Ingress Controller 配合使用。
- 示例(NodePort):
- apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: NodePort
四 网络策略与安全
- 使用 NetworkPolicy 控制 Pod 间与 Pod 对外部的通信,遵循“默认拒绝、按需放行”的最小权限原则:
- 示例(仅允许来自带有 app=allowed-client 的 Pod 的入站流量,并允许到 10.0.0.0/8 的出站流量):
- apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: my-network-policy
spec:
podSelector:
matchLabels:
app: my-app
policyTypes:
- Ingress
- Egress
- ingress:
- from:
- podSelector:
matchLabels:
app: allowed-client
- egress:
- to:
- ipBlock:
cidr: 10.0.0.0/8
五 端口与连通性验证
- 端口与防火墙要点(示例为 ufw 场景,生产请按需精细化放行):
- 控制面端口:放行 6443/TCP(kube-apiserver);节点间/组件通信按需放行 10250/TCP(kubelet) 等。
- 示例:sudo ufw allow 6443/tcp
- 快速连通性验证清单:
- 查看节点与系统组件状态:kubectl get nodes;kubectl get pods -A
- 部署测试 Pod 并验证跨 Pod 通信:kubectl run nginx --image=nginx --port=80;kubectl get pods
- 验证 Service 与访问路径:kubectl get services;创建 NodePort/Ingress 后从外部访问验证。