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
练习#
- 安装Calico后,验证两个不同节点上的Pod是否互通。
- 修改CNI配置中的
mtu为1400,观察跨节点通信是否改善。 - 使用
tcpdump抓取Pod间ICMP包,确认封装与解封装行为。 - 对比iptables与ipvs模式下Service访问路径,记录延迟差异。