当前位置: 首页 > 科技观察

四张图带你看懂KubernetesPod如何获取IP地址

时间:2023-03-15 19:09:20 科技观察

在学习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/。集群管理员需要在每个节点下发CNI插件。CNI插件的位置也是可配置的,默认是/opt/cni/bin。如果您使用containerd作为容器运行时,您可以在containerd配置部分[plugins."io.containerd.grpc.v1.cri".cni]下指定CNI配置和CNI插件的路径。在本文中,我们使用Flannel作为网络提供者。这里简单介绍一下Flannel的设置。Flanneld是Fl??annel守护进程,通常由install-cni作为守护进程安装在Kubernetes集群上,带有init容器。install-cni容器在每个节点上创建CNI配置文件/etc/cni/net.d/10-flannel.conflist。Flanneld创建一个vxlan设备,从apiserver获取网络元数据,并监控pod的更新。当一个Pod创建时,它会为整个集群中的所有Pod分配路由,这些路由允许Pod通过IP地址相互连接。ContainerdCRI插件和CNI插件的交互可以如下图所示:上面提到kubelet调用ContainerdCRI插件创建容器,然后调用CNI插件为容器配置网络。网络提供者CNI插件调用其他基础CNI插件来配置网络。下面介绍CNI插件之间的交互。CNI插件之间的交互??有多种CNI插件可以帮助配置主机上容器之间的网络,本文主要讨论以下3个插件。FlannelCNI插件当使用Flannel作为网络提供者时,ContainerdCRI插件使用CNI配置文件,调用FlannelCNI插件/etc/cni/net.d/10-flannel.conflist。FannelCNI插件与Flanneld结合使用,当Flanneld启动时,它会从apiserver获取podCIDR和其他网络相关详细信息,并将它们存储在文件/run/flannel/subnet.env中。FlannelCNI插件使用来自/run/flannel/subnet.env的信息来配置和调用BridgeCNI插件。BridgeCNIPluginFlannelCNIPlugin调用BridgeCNIPlugin的配置如下:第一次调用BridgeCNIPlugin时,会在配置文件中创建一个LinuxBridge"name":"cni0",然后创建每个Pod都有一个veth对,一端在容器的网络命名空间中,另一端连接到主机网络上的LinuxBridge。使用BridgeCNI插件,主机上的所有容器都连接到主机网络上的LinuxBridge。配置veth对后,Bridge插件会调用主机本地IPAMCNI插件。我们可以在CNIconfig中配置使用IPAM插件,CRI插件用于调用FlannelCNI插件。主机本地IPAMCNI插件BridgeCNI插件使用以下配置调用主机本地IPAMCNI插件:主机本地IPAM(IP地址管理)插件返回容器的IP地址,子网从中存储分配的IPhost/var/lib/cni/networks//下dataDir指定的目录。/var/lib/cni/networks//文件包含分配IP的容器ID。调用时,主机本地IPAM插件返回以下有效负载:摘要Kube-controller-manager为每个节点分配一个podCIDR。节点上的Pod从podCIDR中的子网值分配IP地址。由于所有节点上的podCIDR都是不相交的子网,因此它允许为每个pod分配一个唯一的IP地址。Kubernetes集群管理员配置和安装kubelet、容器运行时、网络提供程序,并在每个节点上分发CNI插件。当网络提供商代理启动时,会生成CNI配置。在节点上调度Pod后,kubelet调用CRI插件创建Pod。在容器的情况下,容器的CRI插件调用CNI配置中指定的CNI插件来配置Pod网络。这些都会影响Pod获取IP地址。