编程语言及工具
在K8S集群里,多个节点上的Pod相互通信,要通过网络插件来完成,比如Calico网络插件。 使用kubeadm初始化K8S集群时,有指定一个参数--pod-network-cidr=10.18.0.0/16 它用来定义Pod的网段。 而我们在配置Calico的时候,同样也有定义一个CALICO_IPV4POOL_CIDR的参数,它的值同样也是Pod的网段。 容器网络尤其是在跨主机容器间的网络是非常复杂的。目前主流的容器网络模型主要有Docker公司提出的Container Network Model(CNM)模型和CoreOS公司提出的Container Network Interface(CNI)模型,而Kubernetes采用了由CoreOS公司提出的CNI模型。
1)CNI 首先我们介绍一下什么是 CNI,它的全称是 Container Network Interface,即容器网络的 API 接口。 CNI本身并不能提供网络服务,它只是定义了对容器网络进行操作和配置的规范。CNI仅关注在创建容器时分配网络资源,和在销毁容器时删除网络资源,这使得CNI规范非常轻巧、易于实现,得到了广泛的支持。 而真正实现和落地这些规范的是CNI插件。常见的CNI插件包括Calico、flannel、Terway、Weave Net 以及 Contiv。
2)K8S如何使用CNI插件 K8s 通过CNI配置文件来决定使用什么CNI插件。基本的使用方法为:
首先在每个节点上配置 CNI 配置文件(/etc/cni/net.d/xxnet.conf),其中 xxnet.conf 是某一个网络配置文件的名称;
安装 CNI 配置文件中所对应的二进制插件;
在这个节点上创建 Pod 之后,Kubelet 就会根据 CNI 配置文件执行前两步所安装的 CNI 插件;
具体的流程如下图所示:
在集群里面创建一个 Pod 的时候,首先会通过 apiserver 将 Pod 的配置写入。apiserver 的一些管控组件(比如 Scheduler)会调度到某个具体的节点上去。 Kubelet 监听到这个Pod的创建之后,会在本地进行一些创建的操作。当执行到创建网络这一步骤时,它首先会读取刚才我们所说的配置目录中的配置文件,配置文件里面会声明所使用的是哪一个插件,然后去执行具体的CNI插件的二进制文件,再由CNI插件进入Pod的网络空间去配置Pod的网络。配置完成之后,Kuberlet也就完成了整个Pod的创建过程,这个Pod就在线了。
3)基于Calico的Pod网络
说明:
① 每一个Node上都会有一个tunl0的虚拟网卡,这个网卡可以理解成网桥,所有Pod都要基于此网桥来和其它Pod通信。 ② 每生成一个新的Pod,那么在Node上都会生成一个calixxxx的虚拟网卡,这个网卡会对应到Pod里的eth0
编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !