《Kubernetes Pod 是如何获取 IP 地址的.docx》由会员分享,可在线阅读,更多相关《Kubernetes Pod 是如何获取 IP 地址的.docx(10页珍藏版)》请在第壹文秘上搜索。
1、KUberneteS网络模里的核心要求之一是每个Pod都拥有自己的IP地址并可以使用该IP地址进行通信。很多人刚开始使用KUberneteS时,还不消楚如何为每个Pod分配IP地址。他们了解各种组件如何独立工作,但不清烬这些组件如何加合在一起使用。例如他们了解什么是CNI插件,但是不知道它们是如何被调用的“本文就介绍了各种网络组件在Kubemetes集群中是如何交互的,以及如何帮助每个Pod都获取IP地址。在Kubernetes中有多种网络设署方法,以及containerruntime的各种选项.这篇文章将使用Flannel作为networkprovider,并使用Containered作为c
2、ontainerruntime.背景棱念容叁网络同一主机上的容善在同主机上运行的容洪通过IP地址相互通信的方法之一是使用1.inuxBridge,即在Kubernetes(和Docker)世界中,创建veth(虚拟以太网)设备。该Velh设备的端连接在容涔网络命名空间,另一端连接到主机网络上的1.inUXBridRce同一主机上的所有容器都将这vethpair的一端连接到1.inuxBridge,它的可以通过Bridge使用IP地址相互通侑.1.inuxBridge也戢分配了一个IP地址,它充当从目的地到不同打点的Pod流出流量的网关.不同主机上的容导在不同I:机上运行的容器可以通过其IP地址
3、相互通信的方式之一是使用数据包封装(PaCketenCaPSUlatiOn)。FIannel通过vxlan使用该功能,vxlan将原始数据包封装在UDP数据包中并将其发送到目的地。在Kubernetes柒群中,Flannel会在每个节点上创建一个vxlan设备和一些路由表.祗个发往不同主机上的容器的数据包都会通过vxlan设备,并封装在UDP数据包中.在目标位置,它会提取封装的数据包,然后将数据过路由到目的地Pod.注意:这只是配置容器之间网络的方法之一.CRICRK容器运行时接口)是一个插件接口,允许kubelet使用不同的containerruntimes.各种containerrunti
4、mes都实现了CRlAPI,这使用户可以在Kubernetes安装中使用他们想要的containerruntimes.CNlCNI(容洪网络接口)项目包含一个为1.inUX容涔提供基于通用插件网络解决方案的规则.它由各种插件组成,这些插件在配置Pod网络时执行不同的功能.CNl插件是遵循CNI规范的Ur执行文件。为节点子网分配PodIP地址如果要求所有Iod具有IP地址,那么就要确保整个集群中的所有Pod的IP地址是唯一的。这可以通过为每个节点分配一个唯一的子网来实现,即从子网中为Pod分配节点IP地址,节点IPAM控制寿当nodciPaBl假递给kube-controlIvrnnanager
5、的一controllers命令行标志时,它将为每个节点分配来自集群Cn)R(集群网络的IP范围)的专用子网(PodeIDR).由于这些POdClDR是不相交的子网,因此它可以为每个Pod分配唯一的IP地址。当Kubernetes节点首次在集群上注册时,公被分配一个podCIDR.要更改分配给集群中节点的podClDR.需要先注储节点,然后使用应用于KUbernCteS控制平面的任何配置更改来屯新注册节点.PodCIDR可以使用以下命令列出节点的名称:$kubectlgetno-ojsonIjq,.spec.podCIDR1.244.24Kubelet-,CkmtainerRuntime和CNI
6、插件交互当在节点上调度Pod时,一启动Pod就会发生根多事情。这迎我们仅关注与Pod配置网络有关的动态,旦在节点上调度了Pod,将配置网络并启动应用程序容器,Ol(?)IuMMCitoCRiIMtncrMtpodMpodnetMCrtK(7)IUMMM8v-/p911Q0tMCM7KtaMC4*CMu9nZH0konCorMtner参考:容器式cri插件架构COntainerRuntiae与CNI插件的交互每个networkprovider都有一个CNI插件,containerruntime公调用该插件,在Pod启动时配置网络.使用容渊化作为containerruntime.容活化CRI插件将
7、调用CNI插件.每个networkprovider都在每个Kubernetes节点上安装一个代理,以配置Pod网络。安装networkprovideragent后,它会随CNI一起配置或者在节点上创建,CRI插件金使用它来确定要iB)用哪个CNI插件。CNl配置文件的位置是可配置的默认值为etccninet.d.集群管理员需要在每个节点上交付CNI插件.CNI插件的位司也是可配置的,默认值为optcnibin,如果使用Containerd作为containerruntime.则可以在Containerdconfig部分Fplugins,*io.Containerd.grpc.vl.cri*.c
8、ni指定CNI配置和CNI插件的路径.本文中我们将Flannel作为networkprovider,这里简单介绍一下Flannel的设置,Flanneld是Flannel守护程序,通常install-cni作为带有初始化容器的守护程序安装在Kubernetes柒群上。insiall-cni容器创建CNl配理文件在每个节点Jtetccnint.d10-fIannel.conflist.Flanneld创建一个vxlan设备,从apisener获取网络无数据,并监控Pod上的更新.创建Pod时,它将在整个集群中为所有Pod分配路由,这些路由允许Pod通过IP地址相互连接,ContainerdCRI
9、插件和CNI插件之间的交互可以如下所示:KubemetesNodeMCcet.vsBorecnObrw0eOUlMa2nuMmvrllb0*lwcMQrBcftlOX:WM4.lJ4t*MM*,c.M.l如上所述,kubelet调用ContaineredCRI插件创建容器,再调用CNI插件为容器配置网络.NetworkproviderCNI插件调用其他基本CNI插件来配置网络。CNl插件之间的交互如I下所述.CNI插件之间的交互有多种CNl插件可帮助配置主机上容器之间的网络,本文主要讨论以下3个插件,FlannelCNI插件当使用Flannel作为networkprovider时,Contai
10、ncredCRl插件使用CNI配置文件,调用FlannelCNl插件:eccninei.d10flannel.conflist.$catetccninet.dl-fIannel.conflistname:cnirplugins:type:flanneldelegate:ipMasq:falsethairpinMode:true,wIsDefaultGatewaym:true)FannelCNl插件与Flanneld结合使用,当Flanneld启动时,它将从apiserver中获取pdClDR和其他与网络相关的详细信息,并将它们存储在文件中runflannelsubnet.env.F1.ANNE
11、1.-NETWORK=1.244.0.0/16F1.ANNE1._SUBNET=10.244.0.1/24F1.ANNE1._MTU=1450F1.ANNE1._IPMASQ=falseElannelCNI插件使用runfIannel/subnet.env的信息来配置和调用BridgeCNI插件.BridgeCHI插件同annulCNI插件使用以下配置调用BridgeCNI插件:name:cni0type:bridgemtu:1450ripMasq:false,isGateway,*:true,11ipam:type:host-local,subnet:10.244.0.0/24)Bridge
12、CNl插件第一次调用时,它会创建,个1.inuxBridgename”:*Cni0在配置文件中,然后为每个Pod创建vethpair.其一端在容器的网络命名空间中,另一端连接到主机网络上的1.inuxBridge.使用BridgeCNI插件,主机上的所有容器都连接到主机网络上的1.inUXBridge.配置完Vethpair后,Bridge插件将调用主机本地IPAMCNl插件。我们可以在CNIconfig中配置要使用的IPAM插件,CRl插件用于调用FlannelCNl插件。主机本地IPAMCNI插件BridgeCNl插件使用以下配置调用主机本地IPAMCNI插件:name:,cni0nipa
13、m:type:host-local,subnet:,10.244.024h.dataDir:nvarlibcninetworks,主机本地IPAMdP地址管理)插件从中返回容器的IP地址,SUbnet将分配的IP本地存储在主机下datal)ir指定的目录中varlibcninetworksvarlibcninetworks文件包含IP分配到的容器ID.调用时,主机本地IPAM插件返回以下有效负我:,ip4,:ip:10.244.4.2gateway:10.244.4.3m,dns:总结Kube-Controller-Inanager为每个节点分花一个PodCU)Re从POdCn)R中的子网值为节点上的POd分配了IP地址。由于所有节点上的POdCIDR是不相交的子网,因此它允许为鹤个pod分配唯一的IP地址.Kubernetes集群管理员可配置和安装kublet.containerruntime,networkprovider,并在每个节点上分发CNI插件.Networkprovideragent启动时,将生成CNI配区,在节点上两度Pod后,kubelet会潮用CRl插件来创建Pod。在容器情况下,容器的CRl插件调用CNI配置中指定的CNl插件来配置Pod网络。所有这些都公影峋Pod获取【P地址.