K8s网络插件选型配置讲解:教你K8s网络插件选型与配置
搭建K8s网络前的环境准备
动手前,请确保你已经有一个可用的Kubernetes集群(单节点或多节点均可),并且kubectl能正常连接集群。
如果还没建集群,建议先用kubeadm或minikube快速搭一个。
另外,所有节点之间要能互相通信(防火墙或安全组放行必要端口),并且每个节点的主机名不能重复,否则CNI插件可能报错。
主流网络插件选型对比
K8s网络插件的核心任务是为Pod分配唯一IP、实现跨节点Pod互通。
目前社区最常用的是以下三个:
- Flannel:简单轻量,基于VXLAN/Overlay封装,好上手,但性能一般,不支持网络策略。适合测试环境或对隔离要求不高的场景。
- Calico:支持BGP和IPIP两种模式,性能好,自带Network Policy,生产环境首选。配置略复杂,但文档完整。
- Cilium:基于eBPF技术,性能和功能最强,但学习曲线陡。推荐在大型或对安全要求极高的集群中使用。
对于刚入门的用户,我建议直接选Calico,既能跑生产,又能顺便学习网络策略。
实战配置Calico网络插件
以下操作在所有节点执行,但只需在主控节点初始化一次配置。
- 下载Calico的YAML文件(以v3.27为例):
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.27/manifests/calico.yaml
- 如果你使用pod CIDR不是默认的
10.96.0.0/12和10.244.0.0/16,需要修改calico.yaml中的CALICO_IPV4POOL_CIDR环境变量。例如改为你的Pod网段172.16.0.0/16:
- name: CALICO_IPV4POOL_CIDR
value: "172.16.0.0/16"
- 应用配置:
kubectl apply -f calico.yaml
- 监控所有calico-node Pod是否变成Running状态:
kubectl get pods -n kube-system -l k8s-app=calico-node -w
如果全部Running,说明Calico安装成功。
避坑指南:常见报错与解决办法
坑1:Pod一直处于ContainerCreating
执行kubectl describe pod 查看事件,如果报NetworkPlugin cni failed to set up pod,通常是kubelet的cni配置目录(默认为/etc/cni/net.d)被其他插件覆盖。
先备份再清理。
坑2:Pod跨节点ping不通
检查Calico的BGP路由是否已发布。
在任一节点执行:
ip route | grep <你的Pod网段>
若没有路由,检查BGP邻居状态:
calicoctl node status
坑3:NodePort服务访问不了
如果防火墙没放开NodePort端口(30000-32767),或iptables规则被其他工具误改,都会导致服务不可达。
建议临时关闭防火墙测试:
systemctl stop firewalld # CentOS/RHEL
验证K8s网络插件是否正常工作
创建两个测试Pod,分别调度到不同节点:
kubectl run test-a --image=busybox -- sleep 3600
kubectl run test-b --image=busybox -- sleep 3600
查询Pod的IP:
kubectl get pods -o wide
进入test-a并ping test-b的IP:
kubectl exec -it test-a -- sh
/ # ping
如果持续有回应(无丢包),说明跨节点Pod通信正常。
再用kubectl delete pod test-a test-b清理。
如果遇到连通性问题,先回顾避坑指南中的排查点,或者查看Calico的日志:kubectl logs -n kube-system 。
本文从选型对比到配置验证已全部讲完,核心思路是:新手请优先选Calico,严格按照官方YAML部署,遇到异常先看Pod事件和路由表。
只要按步骤来,K8s网络插件的配置并不难。