理解典型网络插件工作原理,掌握CNI插件的使用。
什么是 CNI
- Container Network Interface,容器网络的 API 接口
- Kubelet 通过这个标准的 API 调用不同的网络插件配实现置网络
- CNI 插件:一系列实现了 CNI API 接口的网络插件
Kubernetes 中如何使用
- 配置 CNI 配置文件(/etc/cni/net.d/xxnet.conf)
- 安装 CNI 二进制插件(/opt/cni/bin/xxnet)
- 在这个节点上创建 Pod
- Kubelet 会根据 CNI 配置文件执行 CNI 插件
- 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 插件通常有三种模式
社区那么多插件,需要如何选择?
-
环境限制:
不同环境支持的底层能力不同- 虚拟化 网络限制多,需要选择支持 Overlay 的插件:Flannel-vxlan,Calico-ipip,Weave 等。
- 物理机 选择 Underlay 或路由的插件。例如:calico-bgp,flannel-hostgw,sriov等。
- 公有云 如果有则选云厂商支持的。例如:Aliyun 的 Terway。
-
功能需求:
不同实现支持的功能不同- 安全 NetworkPolicy 支持 Pod 网络间的访问策略,Calico,Weave。
- 集群外资源互联互通 选择 Underlay 的网络,例如 sriov,calico-bgp。
- 服务发现与负载均衡 很多 Underlay 的插件不支持 K8s service 服务发现。
-
性能需求:
不同实现的性能损失不同- Pod 创建速度 Overlay 或者路由模式的网络插件创建快,Underlay 模式网络插件创建慢。
- Pod 网络性能 Overlay 性能相对较差,Underlay 模式和路由模式网络插件性能好。
如何开发自己的 CNI 插件
CNI 插件实现通常需要两个部分:
- 一个二进制的 CNI 插件去配置 Pod 的网卡和 IP 等 ——> 给 Pod 插上网线
- 一个 Daemon 进程去管理 Pod 之间的网络打通 ——> 给 Pod 连上网络
给 Pod 插上网线
- 给 Pod 准备虚拟网卡
- 创建"veth"虚拟网卡对
- 将一端的网卡挪到 Pod 中
- 给 Pod 分配 IP 地址
- 给 Pod 分配集群中唯一的 IP 地址
- 一般会把 Pod 网段按 Node 分段
- 每个 Pod 再从 Node 段中分配 IP
- 配置 Pod 的 IP 和路由
- 给 Pod 的虚拟网卡配置分配到的 IP
- 给 Pod 的网卡上配置集群网段的路由
- 在宿主机上配置到 Pod 的 IP 地址的路由到对端虚拟网卡上
给 Pod 连上网线:让每一个 Pod 的 IP 在集群中都能被访问到
- CNI Daemon 进程学习到集群所有 Pod 的 IP 和其所在节点
- 通常通过请求 K8S APIServer 拿到现有 Pod 的 IP 地址和节点。
- 监听 K8S APIServer 新的 Node 和 Pod 的创建自动配置。
- CNI Daemon 配置网络来打通 Pod 的 IP 的访问
- 创建到所有 Node 的通道:Overlay 隧道,VPC 路由表,BGP 路由等。
- 将所有 Pod 的 IP 地址跟其所在 Node 的通道关联起来:Linux 路由,Fdb 转发表,OVS流表等。
如果对你有帮助,记得互相鼓励,帮忙点赞收藏或转发~