3.3 集群网络搭建
3.3.1 初始阶段
集群的创建是基于专有网络VPC和云服务器ECS的。在创建完VPC和ECS之后,我们基本上可以得到图3-3所示的资源配置。
我们会得到一个网段为192.168.0.0/16的VPC实例,和若干从VPC网段里分配到IP地址的ECS实例。
图3-3 初始阶段集群网络架构
3.3.2 集群阶段
在初始阶段的基础上,集群创建阶段会为集群指定CIDR,如图3-4所示。这个值会以参数的形式传递给集群节点初始化脚本,并被脚本传递给集群节点配置工具Kubeadm。之后Kubeadm会把这个参数固化到控制器管理器的编排文件里。
图3-4 集群创建阶段网络架构
当控制器管理器有了这个参数之后,如果有新节点通过Kubelet注册到集群,节点控制器就会为这个新节点划分一个子网段,而这个子网段就是节点的podCIDR。
如图3-4所示,节点B的子网段是172.16.8.128/25,而节点A的子网段是172.16.0.128/25,这些配置会被记录到对应节点的podCIDR数据项里。
3.3.3 节点阶段
经过以上阶段,Kubernetes就有了集群CIDR,以及为每个节点划分的podCIDR。
在此基础上,集群会把Flanneld部署到每个节点上,进一步为节点搭建Pod使用的网络主干道。这里主要有两个操作,可参考图3-5。
图3-5 节点增加阶段网络架构
第一个是通过Cloud Controller Manager给每个节点配置一个VPC路由项。路由项的作用是,如果VPC收到的数据包的目标地址属于某个节点的podCIDR子网段,那么VPC会把这个数据包转发到对应的节点上。
第二个是Flanneld创建虚拟网桥Cni0,以及Cni0相关的主机路由。这些主机路由的作用是,从节点外部进来的网络包,如果其目标地址属于podCIDR,则该网络包会被主机路由转发到Cni0虚拟局域网内。
这里要注意的是,Cni0其实是在第一个Pod被调度到节点上的时候创建的,但是从逻辑上来说,Cni0属于节点网络,不属于Pod网络,所以在此讲解。
3.3.4 Pod阶段
经过前面三个阶段,集群实际上已经为Pod搭建了网络通信的主干道。
这个时候,如果集群把一个Pod调度到节点上,Kubelet会调用Flannel CNI插件,为这个Pod创建网络命名空间和Veth设备组。其中一个Veth设备会被加入Cni0虚拟网桥,而另一个Veth设备则被安装到Pod上。这样一来,Pod就和网络主干道连接在了一起,如图3-6所示。
这里需要强调的是,前一节的Flanneld和这一节的Flannel CNI完全是两个组件。Flanneld是DaemonSet下发到每个节点的Pod,它的作用是搭建网络主干道。而Flannel CNI是节点创建的时候,通过kubernetes-cni这个Rpm包安装的CNI插件,其作用是,被Kubelet调用为具体的Pod创建网络分支。
理解这两者的区别,有助于我们理解Flanneld和Flannel CNI相关的配置文件的用途。比如/run/flannel/subnet.env,是Flanneld创建的为Flannel CNI提供输入的一个环境变量文件;又比如/etc/cni/net.d/10-flannel.conf,是Flanneld拷贝到节点目录给Flannel CNI使用的子网配置文件。