CRI

CRI(容器运行时接口)是一个插件接口,允许kubelet使用不同的容器运行时。各种容器运行时都实现了CRI API,这使用户可以在kubernetes安装中使用他们选择的容器运行时。

CNI

CNI项目包含一个规范,可为Linux容器提供基于通用插件的联网解决方案。它还由各种插件组成,这些插件在配置Pod网络时执行不同的功能。 CNI插件是遵循CNI规范的可执行文件,我们将在下面的文章中讨论一些插件。

为节点分配Pod IP地址的子网
如果要求所有Pod具有IP地址,那么确保整个集群中的所有Pod具有唯一的IP地址非常重要。这是通过为每个节点分配一个唯一的子网来实现的,从该子网中为Pod分配了该节点上的IP地址。

一旦在节点上调度了Pod,以下交互将导致配置网络并启动应用程序容器。
image.png

容器运行时与CNI插件之间的交互

每个网络提供商都有一个CNI插件,容器运行时会调用该插件,以在Pod启动时为其配置网络。使用容器化作为容器运行时,容器化CRI插件将调用CNI插件。每个网络提供商都在每个kubernetes节点上都安装了一个代理,以配置pod网络。安装了网络提供商代理后,它要么随CNI配置一起提供,要么在节点上创建一个,然后由CRI插件用来确定要调用哪个CNI插件。

CNI配置文件的位置是可配置的,默认值为/etc/cni/net.d/。集群管理员需要在每个节点上交付CNI插件。 CNI插件的位置也是可配置的,默认值为/opt/cni/ bin。

如果使用容器作为容器运行时,则可以在容器配置的[plugins.”io.containerd.grpc.v1.cri”.cni]部分下指定CNI配置和CNI插件二进制文件的路径。

由于我们在这里将Flannel称为网络提供商,因此我将简要介绍Flannel的设置方式。 Flanneld是Flannel守护程序,通常作为守护程序安装在kubernetes集群上,并以install-cni作为初始化容器。 install-cni容器在每个节点上创建CNI配置文件-/etc/cni/net.d/10-flannel.conflist。 Flanneld创建一个vxlan设备,从apiserver获取网络元数据,并监视pod上的更新。创建Pod时,它将为整个集群中的所有Pod分配路由,这些路由允许Pod通过其IP地址相互连接。

总结

Kube-controller-manager为每个节点分配一个podCIDR。从podCIDR中的子网值中为节点上的Pod分配IP地址。由于所有节点上的podCIDR是不相交的子网,因此它允许为每个pod分配唯一的IP地址。

Kubernetes集群管理员可配置和安装kubelet,容器运行时,网络提供商代理,并在每个节点上分发CNI插件。网络提供商代理启动时,将生成CNI配置。在节点上调度Pod后,kubelet会调用CRI插件来创建Pod。如果是Containerd,则Containered CRI插件会调用CNI配置中指定的CNI插件来配置Pod网络。所有这些都会使Pod获得IP地址。