梗概
CNI (Container Network Interface) 是一个规范和库,用于配置 Linux 容器的网络接口。在 Kubernetes 中,CNI 插件负责为 Pod 分配 IP 地址并设置必要的路由,使 Pod 能够相互通信以及与外部网络通信。
详细说明
功能与作用
- 为容器提供标准化的网络配置接口,负责容器网络资源的分配、释放和管理
- 实现 Pod 之间、Pod 与 Node 之间以及 Pod 与外部网络之间的通信
- 支持实现 NetworkPolicy 等网络策略,提供网络隔离和安全控制
- 简化容器网络配置,使网络解决方案可插拔化
工作原理
- CNI 定义了一组接口规范,描述了容器运行时如何与网络插件交互
- 当 Pod 创建或销毁时,Kubernetes 调用 CNI 插件来配置或清理网络资源
- CNI 插件负责为容器分配 IP 地址、设置路由表以及处理 DNS 配置等网络设置
- 插件通常会在 Node 上创建虚拟网络设备(如 veth pair)来连接容器与主机网络
常见 CNI 插件
-
Calico:
- 高性能、可扩展的网络和网络安全解决方案
- 支持网络策略,提供细粒度的访问控制
- 使用 BGP 路由协议,不依赖 overlay 网络,性能较高
-
Flannel:
- 简单易用的 overlay 网络解决方案
- 适合入门级 Kubernetes 集群
- 支持多种后端(如 VXLAN、host-gw 等)
-
Cilium:
- 基于 eBPF 技术的网络解决方案
- 提供高级网络功能和安全特性
- 支持基于 HTTP/gRPC/Kafka 等应用层协议的网络策略
-
Weave Net:
- 创建虚拟网络,连接跨多个主机的容器
- 支持加密通信,提高安全性
- 易于部署和配置
与 Kubernetes 组件的关系
- Kubelet 在创建 Pod 时调用 CNI 插件配置网络
- CNI 插件与 NetworkPolicy 协同工作,实现网络隔离
- CNI 为 Service 和 Kube-proxy 提供底层网络支持
- CNI 与 Ingress 协同工作,处理外部流量
father:: kubernetes