16.4.4 CNI网络插件与网络模式

CNI网络插件与网络模式#

CNI(Container Network Interface)定义容器网络的标准接口,Kubernetes通过调用CNI插件为Pod创建网络命名空间、分配IP并配置路由。创建Pod时调用ADD,删除Pod时调用DEL

原理草图:CNI调用与数据通路

文章图片

Kubernetes网络模型要点
- 每个Pod拥有独立IP,Pod间可直接通信无需NAT
- 节点与Pod、Pod与Service之间可达
- 服务发现依赖Service虚拟IP与DNS解析


常见CNI插件与特性(示例对比)#

  • Flannel:轻量级覆盖网络,支持VXLAN/host-gw,易部署但策略能力弱
  • Calico:基于路由(BGP)或IPIP/VXLAN,支持NetworkPolicy,性能稳定
  • Cilium:基于eBPF,支持L7策略、可观测性强,性能优
  • Weave Net:简单易用,适合中小规模集群
  • Canal:Flannel + Calico策略组合

网络模式与流量路径(简图)#

文章图片

CNI安装示例(Calico)#

适用场景:需要NetworkPolicy、BGP或VXLAN模式
预期效果:集群Pod互通,可应用网络策略

# 1. 安装 Calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# 2. 验证 calico 组件运行状态
kubectl -n kube-system get pods -l k8s-app=calico-node
kubectl -n kube-system get pods -l k8s-app=calico-kube-controllers

关键命令解释
- kubectl apply -f:应用插件清单创建DaemonSet、CRD、RBAC等
- -n kube-system:CNI组件通常部署在系统命名空间
- -l:按label过滤资源,快速定位CNI相关Pod


CNI配置文件示例(/etc/cni/net.d)#

{
  "cniVersion": "0.3.1",
  "name": "k8s-pod-network",
  "plugins": [
    {
      "type": "calico",
      "log_level": "info",
      "datastore_type": "kubernetes",
      "nodename": "node-01",
      "mtu": 1440
    },
    {
      "type": "portmap",
      "capabilities": {"portMappings": true}
    }
  ]
}

关键参数说明
- type: 指定CNI主插件类型
- mtu: 设置封装后MTU,避免跨节点通信丢包
- plugins: 链式插件,portmap用于端口映射


网络连通性验证与排错示例#

1)验证Pod互通

# 创建两个测试Pod
kubectl run pod-a --image=busybox:1.36 --restart=Never -- sleep 3600
kubectl run pod-b --image=busybox:1.36 --restart=Never -- sleep 3600

# 获取pod-b IP
POD_B_IP=$(kubectl get pod pod-b -o jsonpath='{.status.podIP}')

# 从pod-a ping pod-b
kubectl exec pod-a -- ping -c 3 $POD_B_IP

2)常见故障与定位命令

# 查看CNI日志
kubectl -n kube-system logs -l k8s-app=calico-node --tail=100

# 查看Pod网络命名空间与veth对
ip netns list
ip link | grep veth

# 查看路由与邻居表
ip route
ip neigh

# 抓包定位丢包点
tcpdump -i eth0 icmp

排错提示
- Pod间不通:检查ip route是否缺少跨节点路由或VXLAN设备
- 跨节点丢包:检查MTU,封装时需减小MTU(如1440)
- 节点重启后异常:检查/etc/cni/net.d是否缺失,CNI二进制是否存在


kube-proxy与网络路径示例#

# 查看 kube-proxy 模式
kubectl -n kube-system get configmap kube-proxy -o jsonpath='{.data.config\.conf}' | grep mode

# 查看 iptables 规则(iptables模式)
iptables -t nat -L -n | head

性能基准与优化示例#

# 在Pod中测试网络吞吐(需要iperf镜像)
kubectl run iperf-server --image=networkstatic/iperf3 --restart=Never -- -s
kubectl run iperf-client --image=networkstatic/iperf3 --restart=Never -- -c <SERVER_POD_IP>

# 观察conntrack数量
conntrack -L | wc -l

练习#

  1. 安装Calico后,验证两个不同节点上的Pod是否互通。
  2. 修改CNI配置中的mtu1400,观察跨节点通信是否改善。
  3. 使用tcpdump抓取Pod间ICMP包,确认封装与解封装行为。
  4. 对比iptables与ipvs模式下Service访问路径,记录延迟差异。