跳转至

CNI

在 Kubernetes 中,CNI 网络模型Container Network Interface)是 Kubernetes 用来管理容器网络的一种插件标准,它定义了如何将容器接入网络,以及如何配置网络功能(如 IP 分配、流量控制等)。


CNI 的基本概念

CNI 是一个由 CNCF(Cloud Native Computing Foundation) 制定的开源规范,旨在为容器提供灵活的网络配置。Kubernetes 使用 CNI 插件来实现其 Pod 网络模型,确保每个 Pod 都可以与其他 Pod 进行通信,并与外部网络互通。

CNI 的核心由以下部分组成:

  1. CNI 插件(Plugin): 实现具体的网络功能(如 IP 分配、路由配置)。
  2. CNI 配置文件: 描述插件的使用方式和网络配置。
  3. CNI 二进制文件: 执行具体的网络操作,例如创建 veth 接口、配置路由表等。

Kubernetes 的网络模型

Kubernetes 的网络模型有以下基本要求:

  1. 每个 Pod 都有一个唯一的 IP 地址。
  2. Pod 内的所有容器共享这个 IP 地址。
  3. Pod 之间可以直接通过 IP 通信,而不需要 NAT。
  4. 所有 Pod 都在一个平面网络中互相可达。
  5. 不论 Pod 是否位于同一个节点,它们都应能直接通信。
  6. Pod 与外部网络的互通。
  7. Pod 能够访问集群外部资源,外部资源也可以访问 Pod。

CNI 网络模型的实现原理

CNI 网络插件的工作流程如下:

  1. 创建 Pod 时调用 CNI 插件: 当 Kubernetes 创建一个 Pod,Kubelet 会调用 CNI 插件来配置网络。Kubelet 通过 CRI(Container Runtime Interface)与容器运行时(如 Docker 或 containerd)交互,并通过 CNI 配置网络。
  2. CNI 插件配置网络:
  3. 插件为 Pod 创建一个虚拟网络接口(veth),连接到主机的网桥或网络设备。
  4. 分配一个 IP 地址给 Pod。
  5. 配置路由,使 Pod 的网络能够与集群和外部网络互通。
  6. 数据流转: 配置完成后,Pod 的数据包会通过 veth 接口发送到主机的网络设备,再通过主机网络的规则转发到目标 Pod 或外部资源。

常见的 CNI 插件

Kubernetes 支持多种 CNI 插件,以下是几种常见的选择:

插件名称 特点 适用场景
Flannel 简单易用,采用覆盖网络(overlay network)。 小型集群,简单网络需求。
Calico 提供 BGP 支持,支持网络策略(Network Policy)。 大型集群,强调安全性和性能。
Weave Net 自动发现节点,支持加密流量,配置简单。 小到中型集群,注重安全性。
Cilium 基于 eBPF,支持高性能、动态网络策略和服务网格。 高性能需求,复杂网络策略。
Canal Flannel + Calico 的组合,结合两者优点。 需要网络策略且对配置复杂度敏感的场景。
Kube-Router 集成了网络代理(Kube Proxy)和路由功能,注重性能。 需要极简化网络配置且注重性能的场景。

CNI 的两种主要网络模式

  1. Overlay Network(覆盖网络)

  2. 数据包通过隧道(如 VXLAN、IP-in-IP)封装并传输。

  3. 优点:跨节点通信简单,网络配置透明。
  4. 缺点:封装增加了数据包的开销,性能较低。

典型实现: Flannel(VXLAN 模式)。

  1. Underlay Network(底层网络)

  2. 数据包直接通过物理网络设备传输,无需封装。

  3. 优点:性能更高,网络延迟更低。
  4. 缺点:需要更复杂的网络配置(如 BGP、路由配置)。

典型实现: Calico。


CNI 网络的配置文件示例

以下是一个简单的 CNI 配置文件示例:

{
  "cniVersion": "0.4.0",
  "name": "mynet",
  "type": "bridge",
  "bridge": "cni0",
  "isGateway": true,
  "ipMasq": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/16",
    "routes": [
      { "dst": "0.0.0.0/0" }
    ]
  }
}
  • type: 使用的 CNI 插件类型,例如 bridgecalico
  • bridge: 创建的网桥名称。
  • ipMasq: 是否启用 IP 地址伪装(NAT)。
  • ipam: IP 地址管理模块,用于分配 Pod IP。

CNI 网络模型是 Kubernetes 实现容器网络的核心标准,它定义了如何为容器分配网络资源,并使容器间通信畅通。通过使用不同的 CNI 插件(如 Flannel、Calico 等),Kubernetes 可以满足各种网络需求。选择适合的 CNI 插件需要考虑性能、安全性、复杂性等因素。如果需要更具体的实践指导,请随时告诉我!