Kubernetes进阶:理解CNI和CNI插件

3,509 阅读3分钟

理解典型网络插件工作原理,掌握CNI插件的使用。

什么是 CNI

  • Container Network Interface,容器网络的 API 接口
  • Kubelet 通过这个标准的 API 调用不同的网络插件配实现置网络
  • CNI 插件:一系列实现了 CNI API 接口的网络插件

Kubernetes 中如何使用

  1. 配置 CNI 配置文件(/etc/cni/net.d/xxnet.conf)
  2. 安装 CNI 二进制插件(/opt/cni/bin/xxnet)
  3. 在这个节点上创建 Pod
  4. Kubelet 会根据 CNI 配置文件执行 CNI 插件
  5. Pod 的网络就配置完成了

如果只是使用 CNI 插件,大部分 CNI 插件的提供者都可以一键安装,非常容易。例如 Flannel 安装,只需要一个命令,配置和二进制自动安装配置:

For Kubernetes v1.7+                      
# kubectl apply -f http://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Flannel 会通过 Daemonset 自动把配置和二进制拷贝到 Node 的配置文件夹中

如何选择 CNI 插件

CNI 插件通常有三种模式

社区那么多插件,需要如何选择?

  1. 环境限制:
    不同环境支持的底层能力不同
    • 虚拟化 网络限制多,需要选择支持 Overlay 的插件:Flannel-vxlan,Calico-ipip,Weave 等。
    • 物理机 选择 Underlay 或路由的插件。例如:calico-bgp,flannel-hostgw,sriov等。
    • 公有云 如果有则选云厂商支持的。例如:Aliyun 的 Terway。
  2. 功能需求: 不同实现支持的功能不同
    • 安全 NetworkPolicy 支持 Pod 网络间的访问策略,Calico,Weave。
    • 集群外资源互联互通 选择 Underlay 的网络,例如 sriov,calico-bgp。
    • 服务发现与负载均衡 很多 Underlay 的插件不支持 K8s service 服务发现。
  3. 性能需求: 不同实现的性能损失不同
    • Pod 创建速度 Overlay 或者路由模式的网络插件创建快,Underlay 模式网络插件创建慢。
    • Pod 网络性能 Overlay 性能相对较差,Underlay 模式和路由模式网络插件性能好。

如何开发自己的 CNI 插件

CNI 插件实现通常需要两个部分:

  • 一个二进制的 CNI 插件去配置 Pod 的网卡和 IP 等 ——> 给 Pod 插上网线
  • 一个 Daemon 进程去管理 Pod 之间的网络打通 ——> 给 Pod 连上网络

给 Pod 插上网线

  1. 给 Pod 准备虚拟网卡
    • 创建"veth"虚拟网卡对
    • 将一端的网卡挪到 Pod 中
  2. 给 Pod 分配 IP 地址
    • 给 Pod 分配集群中唯一的 IP 地址
    • 一般会把 Pod 网段按 Node 分段
    • 每个 Pod 再从 Node 段中分配 IP
  3. 配置 Pod 的 IP 和路由
    • 给 Pod 的虚拟网卡配置分配到的 IP
    • 给 Pod 的网卡上配置集群网段的路由
    • 在宿主机上配置到 Pod 的 IP 地址的路由到对端虚拟网卡上

给 Pod 连上网线:让每一个 Pod 的 IP 在集群中都能被访问到

  1. CNI Daemon 进程学习到集群所有 Pod 的 IP 和其所在节点
    • 通常通过请求 K8S APIServer 拿到现有 Pod 的 IP 地址和节点。
    • 监听 K8S APIServer 新的 Node 和 Pod 的创建自动配置。
  2. CNI Daemon 配置网络来打通 Pod 的 IP 的访问
    • 创建到所有 Node 的通道:Overlay 隧道,VPC 路由表,BGP 路由等。
    • 将所有 Pod 的 IP 地址跟其所在 Node 的通道关联起来:Linux 路由,Fdb 转发表,OVS流表等。

如果对你有帮助,记得互相鼓励,帮忙点赞收藏或转发~