CentOS 上 Kubernetes 网络设置方法
一 前置条件与内核网络
- 关闭 Swap(Kubernetes 要求):执行命令:swapoff -a;并在 /etc/fstab 中注释 swap 行,永久生效。
- 加载内核模块:启用 overlay 与 br_netfilter,并配置开机加载:
- 执行:modprobe overlay && modprobe br_netfilter
- 写入:/etc/modules-load.d/k8s.conf
overlay
br_netfilter
- 开启桥接与转发(确保容器跨主机通信与 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
- 容器运行时与 kubelet 建议使用 systemd cgroup 驱动(以 containerd 为例):
- 生成默认配置:containerd config default > /etc/containerd/config.toml
- 编辑:/etc/containerd/config.toml,将 SystemdCgroup = true
- 重启:systemctl enable --now containerd
- 节点互通与时间同步:确保节点间 IP 互通、主机名解析正常,并开启 NTP/chrony 时间同步。
二 初始化集群并指定网段
- 准备 kubectl 配置(在 Master 上):
- 执行:mkdir -p $HOME/.kube && sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config && sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 使用 kubeadm 初始化(示例):
- 命令:kubeadm init --apiserver-advertise-address <Master_IP> --pod-network-cidr 10.244.0.0/16 --service-cidr 10.96.0.0/12
- 说明:
- –pod-network-cidr 必须与所选 CNI 插件的默认网段一致(见下一节)。
- –service-cidr 默认常用 10.96.0.0/12,可按需调整,但需与集群内现有服务网段不冲突。
- 加入工作节点:在 Master 上执行 kubeadm token create --print-join-command 获取加入命令,在 Worker 上执行。
三 安装 CNI 网络插件
- 选择插件与网段匹配:
- Flannel(简单、易上手):默认 Pod CIDR 为 10.244.0.0/16。
- Calico(支持网络策略、规模较大场景):通常使用 192.168.0.0/16 作为 Pod CIDR(以所用清单为准)。
- 部署示例:
- Flannel:
- 执行:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 如需自定义后端/网段,可编辑清单中的 net-conf.json(例如将 “Network” 改为你的 Pod CIDR,“Backend.Type” 可选 vxlan/udp)。
- Calico:
- 执行:kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml(版本可按需选择)。
- 注意:同一集群只能启用 一个 CNI 插件,避免冲突。
四 验证与常见问题
- 验证步骤:
- 查看节点与系统 Pod:kubectl get nodes;kubectl get pods -n kube-system
- 查看 Flannel/Calico 组件是否 Running。
- 连通性测试:
- 运行测试 Pod:kubectl run test-nginx --image=nginx --restart=Never
- 获取 IP:kubectl get pod test-nginx -o wide
- 在集群内另一 Pod 中访问该 IP(例如 curl http://<POD_IP>),确认跨节点与跨 Pod 通信正常。
- 常见问题与处理:
- 节点 NotReady:多因 CNI 未部署或 Pod CIDR 不匹配,核对 kubeadm 的 –pod-network-cidr 与插件清单中的 Network。
- Pod 之间或节点与 Pod 不通:检查 iptables/ipvs、bridge-nf-call-iptables/ip6tables 是否开启,以及云厂商 安全组/ACL 是否放行 VxLAN/8472(UDP) 等流量。
- 路由/网段冲突:确保 Pod CIDR 与 Service CIDR 均不与宿主机网络和其他网络重叠。
- 多 CNI 冲突:卸载已安装插件后再部署新插件,确保只保留 一个 CNI。