Kubernetes 网络插件深度解析:CNI 与网络方案选型

引言

在 Kubernetes 中,网络是容器通信的基础。Kubernetes 网络模型要求所有 Pod 都能直接通信,而无需 NAT。Container Network Interface (CNI) 是实现这一目标的关键标准,它定义了容器网络配置的接口规范。

CNI 基础概念

什么是 CNI

CNI (Container Network Interface) 是一个用于配置 Linux 容器网络的标准化接口。它允许容器运行时(如 Docker、containerd)动态配置网络。

CNI 的核心组件

  1. CNI 插件:负责实际的网络配置
  2. CNI 配置文件:定义网络参数
  3. 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 插件对于集群的性能和功能至关重要。在实际应用中,需要根据集群规模、性能要求和安全需求选择合适的网络方案,并结合网络策略和性能优化技巧,构建高效可靠的容器网络。


参考文献

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐