Wiki LogoWiki - The Power of Many

Kubernetes 网络: 深入理解 CNI 插件

深入探讨 Kubernetes 网络模型, CNI 工作原理, IPAM 机制以及主流插件 Flannel, Calico, Cilium 的对比与选择.

在 Kubernetes 集群中, 网络是最复杂也是最核心的部分之一. Kubernetes 本身并不实现 Pod 网络, 而是定义了一套规范——CNI (Container Network Interface).


1. Kubernetes 网络模型

1.1 基本要求

Kubernetes 网络模型有三条核心规则:

规则描述
Pod-to-Pod所有 Pod 可以直接通信, 无需 NAT
Node-to-Pod所有节点可以与所有 Pod 直接通信
Pod 看到的 IPPod 看到的自己 IP 与其他 Pod 看到的一致

1.2 网络层次


2. CNI 规范

2.1 什么是 CNI

CNI (Container Network Interface) 是由 CNCF 维护的一套标准:

  • 解耦: 将容器运行时与网络实现隔离
  • 职责: 容器创建时分配 IP, 销毁时释放 IP

2.2 CNI 执行流程

2.3 CNI 配置

{
  "cniVersion": "1.0.0",
  "name": "mynet",
  "type": "bridge",
  "bridge": "cni0",
  "isGateway": true,
  "ipMasq": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/24",
    "routes": [
      { "dst": "0.0.0.0/0" }
    ]
  }
}

2.4 CNI 操作

操作描述
ADD将容器添加到网络
DEL从网络移除容器
CHECK检查容器网络状态
VERSION返回支持的 CNI 版本

3. IPAM (IP 地址管理)

3.1 IPAM 类型

类型描述适用场景
host-local本地文件存储, 每节点独立子网小规模集群
whereabouts分布式 IPAM, 跨节点协调中大规模集群
calico-ipamCalico 内置, 支持 IP 池Calico 用户

3.2 IP 分配机制


4. 网络模式

4.1 Overlay (叠加网络)

技术封装方式特点
VXLANUDP 封装 L2 帧最常用, 兼容性好
GeneveUDP 封装, 可扩展支持元数据
IPIPIP-in-IP开销最小

优点:

  • 对底层网络无要求
  • 部署简单

缺点:

  • 封装开销 (~50 字节)
  • MTU 需要调整
  • 排障困难

4.2 L3 路由

优点:

  • 无封装开销
  • 原生性能
  • 易于排障

缺点:

  • 需要网络设备支持 BGP
  • 路由表规模问题

4.3 eBPF 原生

优点:

  • 绕过 iptables, 极致性能
  • L7 层策略支持
  • 强大的可观测性

缺点:

  • 需要较新内核 (5.4+)
  • 学习曲线陡峭

5. 主流 CNI 插件

5.1 Flannel

# kube-flannel-cfg ConfigMap
net-conf.json: |
  {
    "Network": "10.244.0.0/16",
    "Backend": {
      "Type": "vxlan"
    }
  }
特性
模式VXLAN, host-gw, UDP
NetworkPolicy❌ 不支持
复杂度极低
适用场景开发测试, 小规模集群

5.2 Calico

apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: default-ipv4-ippool
spec:
  cidr: 10.244.0.0/16
  ipipMode: CrossSubnet
  natOutgoing: true
  nodeSelector: all()
特性
模式BGP, IPIP, VXLAN
NetworkPolicy✅ L3/L4
复杂度
适用场景生产环境标准选择

Calico 模式选择:

模式场景
BGP 全模式支持 BGP 的网络环境
IPIP CrossSubnet部分跨子网
VXLAN不支持 BGP

5.3 Cilium

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: l7-policy
spec:
  endpointSelector:
    matchLabels:
      app: api
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: frontend
    toPorts:
    - ports:
      - port: "80"
        protocol: TCP
      rules:
        http:
        - method: GET
          path: "/api/.*"
特性
模式eBPF, 可替换 kube-proxy
NetworkPolicy✅ L3/L4/L7
可观测性Hubble UI
复杂度较高
适用场景云原生尖端, 零信任

Cilium 特性:

  • 替换 kube-proxy (eBPF)
  • Service Mesh (无 Sidecar)
  • Hubble 网络可观测性
  • Tetragon 安全可观测性

6. 插件对比

特性FlannelCalicoCilium
主要模式VXLANBGP/IPIPeBPF
性能极高
NetworkPolicyL3/L4L3/L4/L7
可观测性一般Hubble
替换 kube-proxy
内核要求5.4+
运维难度

7. 云厂商 CNI

CNI特点
AWSamazon-vpc-cniPod 获取 VPC ENI IP
GCPgke-cni原生 VPC 网络
Azureazure-cniVNet 直接 IP
阿里云terwayENI 多 IP 模式

优势:

  • Pod IP 直接是 VPC IP
  • 与云安全组集成
  • 性能最优

8. 网络排障

8.1 常用命令

# 查看 Pod 网络
kubectl exec -it <pod> -- ip addr
kubectl exec -it <pod> -- ip route

# 查看节点路由
ip route show | grep 10.244

# 抓包分析
tcpdump -i any -nn host 10.244.1.5

# Cilium 调试
cilium connectivity test
hubble observe --pod <pod>

8.2 常见问题

问题可能原因
Pod 无法通信CNI 未就绪, NetworkPolicy 阻断
跨节点不通隧道/路由配置错误, 防火墙
DNS 解析失败CoreDNS 问题, NetworkPolicy
性能差MTU 配置错误, 封装开销

总结: 没有最好的 CNI, 只有最适合您基础设施的 CNI. 新手选 Flannel, 成熟团队选 Calico, 追求极致选 Cilium.

On this page