Debian上Kubernetes网络配置实操指南
一 前置条件与内核网络
- 在所有节点完成基础准备:禁用swap(执行swapoff -a并注释**/etc/fstab中的swap行)、确保主机名唯一**、节点间网络互通、开启时间同步(如 chrony)。这些是确保 kubelet 与网络插件正常工作的前提。
- 加载内核模块并设置转发与桥接参数(以 containerd 为例,同样适用于 Docker 场景):
- 加载模块:
sudo modprobe overlay
sudo modprobe br_netfilter
- 开启桥接与转发(写入**/etc/sysctl.d/99-kubernetes-k8s.conf**):
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
应用:sudo sysctl --system
上述内核与转发设置是容器跨主机通信与 Service 正常 NAT 所必需的。
二 初始化集群与Pod网络CIDR规划
- 安装 kubeadm/kubelet/kubectl(略)。在控制平面节点执行初始化,务必显式指定Pod 网络 CIDR,该 CIDR 需与所选 CNI 插件默认或配置一致:
- 示例(Flannel 常用):
sudo kubeadm init --apiserver-advertise-address=<MASTER_IP> --pod-network-cidr=10.244.0.0/16
- 示例(Calico 常用):
sudo kubeadm init --apiserver-advertise-address=<MASTER_IP> --pod-network-cidr=192.168.0.0/16
- 初始化完成后,按提示配置 kubectl(拷贝 admin.conf 到 $HOME/.kube/config)。
- 说明:kubeadm 不会自动安装 CNI,只有在应用了 CNI 插件并完成节点就绪后,节点才会从 NotReady 变为 Ready。
三 安装与配置CNI网络插件
- 选择一种主流 CNI(二选一或按需求选其一),在控制平面节点 apply 对应清单即可完成 Pod 网络打通与跨主机连通。
- Flannel(推荐用于快速上手与通用场景)
- 部署:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 要点:默认使用 10.244.0.0/16 作为 Pod CIDR,需与 kubeadm 的 --pod-network-cidr 保持一致。
- Calico(支持网络策略、可定制性强)
- 部署:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
- 要点:常见默认 192.168.0.0/16;如使用不同 Pod CIDR,需修改清单中的 CALICO_IPV4POOL_CIDR 值后再 apply。
- 验证:
kubectl get nodes(应为 Ready)
kubectl get pods -n kube-system(CNI 相关 Pod 均为 Running)
四 防火墙与安全组放行
- 若使用 UFW,在主控与工作节点放行如下端口(示例命令):
- 主控节点:
sudo ufw allow 6443/tcp
sudo ufw allow 2379:2380/tcp
sudo ufw allow 10250/tcp
sudo ufw allow 10251/tcp
sudo ufw allow 10252/tcp
sudo ufw allow 10255/tcp
sudo ufw reload
- 工作节点:
sudo ufw allow 10250/tcp
sudo ufw allow 30000:32767/tcp(NodePort 范围)
- 如使用云厂商安全组,同样需放行上述端口区间,否则节点与控制平面无法通信、NodePort 无法对外暴露。
五 验证与常见问题排查
- 连通性验证
- 部署测试应用并暴露:
kubectl create deployment nginx-app --image=nginx --replicas=2
kubectl expose deployment nginx-app --name=nginx-web-svc --type=NodePort --port=80 --target-port=80
- 访问测试:
kubectl get svc nginx-web-svc(获取 NodePort,如 31743)
curl http://<任一节点IP>:31743
- 快速排查清单
- 节点未 Ready:kubectl describe node 与 kubectl get pods -n kube-system 查看 CNI Pod 是否 CrashLoop/Error。
- Pod 间不通:确认 CNI 已成功部署、Pod CIDR 规划一致、跨节点路由/安全组无阻断。
- Service 不通:核对 Service 类型、NodePort 范围与安全组/防火墙放行。
- 重置与重装(必要时):
sudo kubeadm reset
sudo rm -rf /etc/cni/net.d
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
重新 init 并 apply CNI 清单。