Kubernetes 网络插件深度解析:CNI 与网络方案选型
Kubernetes 网络插件深度解析:CNI 与网络方案选型
引言
在 Kubernetes 中,网络是容器通信的基础。Kubernetes 网络模型要求所有 Pod 都能直接通信,而无需 NAT。Container Network Interface (CNI) 是实现这一目标的关键标准,它定义了容器网络配置的接口规范。
CNI 基础概念
什么是 CNI
CNI (Container Network Interface) 是一个用于配置 Linux 容器网络的标准化接口。它允许容器运行时(如 Docker、containerd)动态配置网络。
CNI 的核心组件
- CNI 插件:负责实际的网络配置
- CNI 配置文件:定义网络参数
- CNI 运行时:调用插件配置网络
CNI 工作流程
容器创建 → CNI 运行时调用插件 → 配置网络接口 → 分配 IP 地址 → 配置路由 → 返回网络配置
主流 CNI 插件
Calico
Calico 是一个纯三层网络方案,使用 BGP 协议实现 Pod 间通信。
# Calico 配置示例
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
name: default-pool
spec:
cidr: 192.168.0.0/16
ipipMode: Always
natOutgoing: true
优势:
- 高性能路由
- 强大的网络策略
- 支持 BGP 和 IPIP 隧道
适用场景:大规模集群、需要复杂网络策略的场景
Flannel
Flannel 是一个简单的 overlay 网络方案,使用 VXLAN 或 Host-GW 实现 Pod 间通信。
# Flannel 配置示例
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-flannel-cfg
data:
cni-conf.json: |
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
优势:
- 简单易用
- 部署快速
- 轻量级
适用场景:中小规模集群、开发测试环境
Cilium
Cilium 是一个基于 eBPF 的高性能网络方案,提供网络和安全功能。
# Cilium 配置示例
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: deny-all
spec:
endpointSelector:
matchLabels: {}
ingress:
- {}
优势:
- eBPF 驱动的高性能
- 原生网络策略
- 可观测性集成
适用场景:需要高性能网络和高级安全功能的场景
Weave Net
Weave Net 是一个去中心化的 overlay 网络方案。
# Weave Net 配置示例
apiVersion: v1
kind: ConfigMap
metadata:
name: weave-config
data:
weave-npc: "true"
优势:
- 去中心化架构
- 自动网络配置
- 内置 DNS
适用场景:需要自动配置的环境
CNI 网络模式
Overlay 模式
Overlay 网络通过隧道技术在现有网络之上构建虚拟网络。
# VXLAN 配置示例
apiVersion: v1
kind: ConfigMap
metadata:
name: flannel-config
data:
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
Underlay 模式
Underlay 网络直接使用物理网络,Pod IP 是物理网络的一部分。
# Calico BGP 配置示例
apiVersion: crd.projectcalico.org/v1
kind: BGPConfiguration
metadata:
name: default
spec:
logSeverityScreen: Info
nodeToNodeMeshEnabled: true
asNumber: 64512
Hybrid 模式
混合模式结合了 overlay 和 underlay 的优点。
CNI 配置详解
基础配置文件
{
"name": "my-network",
"cniVersion": "0.3.1",
"type": "flannel",
"ipam": {
"type": "host-local",
"subnet": "10.244.0.0/16"
}
}
IPAM 配置
IPAM (IP Address Management) 负责 IP 地址分配。
{
"ipam": {
"type": "host-local",
"subnet": "10.244.1.0/24",
"gateway": "10.244.1.1",
"routes": [
{
"dst": "0.0.0.0/0"
}
]
}
}
多插件配置
{
"name": "my-network",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
},
{
"type": "bandwidth",
"capabilities": {
"bandwidth": true
}
}
]
}
CNI 网络策略
Network Policy 配置
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: frontend-network-policy
spec:
podSelector:
matchLabels:
app: frontend
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 10.0.0.0/8
ports:
- protocol: TCP
port: 80
egress:
- to:
- podSelector:
matchLabels:
app: backend
ports:
- protocol: TCP
port: 8080
Cilium Network Policy
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: l7-policy
spec:
endpointSelector:
matchLabels:
app: api
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "8080"
protocol: TCP
rules:
- http:
paths:
- path: "/api/v1/*"
method: "GET"
CNI 性能优化
选择合适的网络模式
# 使用 Host-GW 模式(适合同网段部署)
apiVersion: v1
kind: ConfigMap
metadata:
name: flannel-config
data:
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "host-gw"
}
}
调整 MTU 大小
apiVersion: v1
kind: ConfigMap
metadata:
name: calico-config
data:
calico_backend: "bird"
veth_mtu: "1440"
启用加速功能
apiVersion: cilium.io/v2
kind: CiliumConfig
metadata:
name: default
spec:
bpf:
enabled: true
tunnel: disabled
CNI 部署与管理
部署 Calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
部署 Flannel
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
部署 Cilium
helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium --namespace kube-system
常见问题与解决方案
问题 1:Pod 无法通信
排查步骤:
# 检查 CNI 插件状态
kubectl get pods -n kube-system -l k8s-app=calico
# 检查 Pod 网络配置
kubectl exec -it my-pod -- ip addr
# 检查路由表
kubectl exec -it my-pod -- ip route
解决方案:
- 确保 CNI 插件正常运行
- 检查网络配置文件
- 验证路由配置
问题 2:网络性能差
排查步骤:
# 测试网络延迟
kubectl exec -it pod1 -- ping -c 10 pod2
# 检查网络带宽
kubectl exec -it pod1 -- iperf3 -c pod2
解决方案:
- 切换到 underlay 模式
- 调整 MTU 大小
- 启用 eBPF 加速
问题 3:网络策略不生效
排查步骤:
# 检查 Network Policy
kubectl describe networkpolicy my-policy
# 检查 CNI 插件是否支持 Network Policy
kubectl get pods -n kube-system -l k8s-app=calico
解决方案:
- 确保使用支持 Network Policy 的 CNI 插件
- 检查 Network Policy 配置
- 验证标签选择器
总结
CNI 是 Kubernetes 网络的核心组件,选择合适的 CNI 插件对于集群的性能和功能至关重要。在实际应用中,需要根据集群规模、性能要求和安全需求选择合适的网络方案,并结合网络策略和性能优化技巧,构建高效可靠的容器网络。
参考文献:
- CNI Specification: https://github.com/containernetworking/cni
- Calico Documentation: https://docs.projectcalico.org/
- Flannel Documentation: https://github.com/flannel-io/flannel
- Cilium Documentation: https://docs.cilium.io/
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)