在学习Kubernetes网络模型的过程中,了解各个网络组件的作用以及它们之间的交互方式非常重要。本文介绍了各种网络组件如何在Kubernetes集群中进行交互,以及如何帮助每个Pod获取IP地址。Kubernetes网络模型的核心要求之一是每个Pod都有自己的IP地址,并且可以使用该IP地址进行通信。很多人刚开始使用Kubernetes的时候,并不清楚如何给每个Pod分配IP地址。他们了解各个组件如何独立工作,但不了解这些组件如何协同工作。例如,他们了解CNI插件是什么,但不知道它们是如何调用的。本文介绍了Kubernetes集群中各种网络组件如何交互,以及如何帮助每个Pod获取IP地址。在Kubernetes中设置网络有多种方式,容器运行时也有多种选择。本文将使用Flannel作为网络提供者,使用Containerd作为容器运行时。背景概念容器网络同一主机上的容器在同一主机上运行的容器可以通过IP地址相互通信的一种方式是使用LinuxBridge,即在Kubernetes(和Docker)世界中,创建veth(虚拟以太网)设备.veth设备的一端连接到容器网络命名空间,另一端连接到主机网络上的LinuxBridge。同一台主机上的所有容器都有这个veth对的一端连接到LinuxBridge,通过它它们可以使用IP地址相互通信。LinuxBridge也被分配了一个IP地址,它充当从pod到不同节点的传出流量的网关。不同主机上的容器运行在不同主机上的容器可以通过其IP地址相互通信的一种方式是使用数据包封装。Flannel通过vxlan使用这个特性,将原始数据包封装在一个UDP数据包中发送到目的地。在Kubernetes集群中,Flannel在每个节点上创建一个vxlan设备和一些路由表。每个发往不同主机上容器的数据包都会通过vxlan设备并封装在UDP数据包中。在目的地,它提取封装的数据包并将数据包路由到目标Pod。注意:这只是配置容器之间网络的方法之一。CRICRI(ContainerRuntimeInterface)是一个插件接口,允许kubelet使用不同的容器运行时。各种容器运行时实现了CRIAPI,这使用户能够在Kubernetes安装中使用他们想要的容器运行时。CNICNI(容器网络接口)项目包含一个为Linux容器提供基于插件的通用网络解决方案的规则。它由各种插件组成,这些插件在配置pod网络时执行不同的功能。CNI插件是遵循CNI规范的可执行文件。为节点子网分配PodIP地址如果您要求所有Pod都有IP地址,那么请确保整个集群中所有Pod的IP地址是唯一的。这是通过为每个节点分配一个唯一的子网来实现的,从中为Pod分配节点IP地址。节点IPAM控制器当nodeipam被传递给kube-controller-manager的--controllers命令行标志时,它将为每个节点分配一个来自集群CIDR(集群网络的IP范围)的私有子网(podCIDR)。由于这些podCIDR是不相交的子网,它可以为每个Pod分配一个唯一的IP地址。当Kubernetes节点首次注册到集群时,它会被分配一个podCIDR。要更改分配给集群中某个节点的podCIDR,需要取消注册该节点,然后使用应用于Kubernetes控制平面的任何配置更改重新注册。podCIDR可以使用以下方式列出节点的名称:Kubelet、容器运行时和CNI插件交互在节点上调度pod时,一旦pod启动,就会发生很多事情。在这里,我们只关注与Pod配置网络相关的动态。一旦在节点上安排了Pod,网络就会配置好,应用程序容器就会启动。参考:Container-basedcriPlug-inArchitecture中ContainerRuntime与CNIPlug-ins的交互每个网络提供者都有一个CNI插件,在Pod启动时由containerruntime调用来配置网络。使用容器化作为容器运行时,容器化的CRI插件将调用CNI插件。每个网络提供商在每个Kubernetes节点上安装一个代理来配置pod网络。安装网络提供商代理时,它使用CNI配置或在节点上创建,并由CRI插件使用以确定调用哪个CNI插件。CNI配置文件的位置是可配置的,默认是/etc/cni/net.d/
