0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學(xué)習在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區
會(huì )員中心
創(chuàng )作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內不再提示

Kubernetes Pod如何獨立工作

Linux愛(ài)好者 ? 來(lái)源:Linux愛(ài)好者 ? 2023-05-16 14:29 ? 次閱讀

在學(xué)習 Kubernetes 網(wǎng)絡(luò )模型的過(guò)程中,了解各種網(wǎng)絡(luò )組件的作用以及如何交互非常重要。本文就介紹了各種網(wǎng)絡(luò )組件在 Kubernetes 集群中是如何交互的,以及如何幫助每個(gè) Pod 都能獲取 IP 地址。

Kubernetes 網(wǎng)絡(luò )模型的核心要求之一是每個(gè) Pod 都擁有自己的 IP 地址并可以使用該 IP 地址進(jìn)行通信。很多人剛開(kāi)始使用 Kubernetes 時(shí),還不清楚如何為每個(gè) Pod 分配 IP 地址。他們了解各種組件如何獨立工作,但不清楚這些組件如何組合在一起使用。例如,他們了解什么是 CNI 插件,但是不知道它們是如何被調用的。本文就介紹了各種網(wǎng)絡(luò )組件在 Kubernetes 集群中是如何交互的,以及如何幫助每個(gè) Pod 都獲取 IP 地址。

在 Kubernetes 中有多種網(wǎng)絡(luò )設置方法,以及 container runtime 的各種選項。這篇文章將使用 Flannel 作為 network provider,并使用 Containered 作為 container runtime。

背景概念

容器網(wǎng)絡(luò ) 同一主機上的容器 在同一主機上運行的容器通過(guò) IP 地址相互通信的方法之一是使用 Linux Bridge,即在 Kubernetes(和 Docker)世界中,創(chuàng )建 veth(虛擬以太網(wǎng))設備。該 veth 設備的一端連接在容器網(wǎng)絡(luò )命名空間,另一端連接到主機網(wǎng)絡(luò )上的 Linux Bridge。同一主機上的所有容器都將這 veth pair 的一端連接到 Linux Bridge,它們可以通過(guò) Bridge 使用 IP 地址相互通信。Linux Bridge 也被分配了一個(gè) IP 地址,它充當從目的地到不同節點(diǎn)的 Pod 流出流量的網(wǎng)關(guān)。

f63430aa-f0d8-11ed-90ce-dac502259ad0.png

不同主機上的容器 在不同主機上運行的容器可以通過(guò)其 IP 地址相互通信的方式之一是使用數據包封裝(packet encapsulation)。Flannel 通過(guò) vxlan 使用該功能,vxlan 將原始數據包封裝在 UDP 數據包中并將其發(fā)送到目的地。 在 Kubernetes 集群中,Flannel 會(huì )在每個(gè)節點(diǎn)上創(chuàng )建一個(gè) vxlan 設備和一些路由表。每個(gè)發(fā)往不同主機上的容器的數據包都會(huì )通過(guò) vxlan 設備,并封裝在 UDP 數據包中。在目標位置,它會(huì )提取封裝的數據包,然后將數據包路由到目的地 Pod。

f6504650-f0d8-11ed-90ce-dac502259ad0.png

注意:這只是配置容器之間網(wǎng)絡(luò )的方法之一。

CRI CRI(容器運行時(shí)接口)是一個(gè)插件接口,允許 kubelet 使用不同的 container runtimes。各種 container runtimes 都實(shí)現了 CRI API,這使用戶(hù)可以在 Kubernetes 安裝中使用他們想要的 container runtimes。 CNI

CNI(容器網(wǎng)絡(luò )接口)項目包含一個(gè)為 Linux 容器提供基于通用插件網(wǎng)絡(luò )解決方案的規則。它由各種插件組成,這些插件在配置 Pod 網(wǎng)絡(luò )時(shí)執行不同的功能。CNI 插件是遵循 CNI 規范的可執行文件。

為節點(diǎn)子網(wǎng)分配 Pod IP 地址

如果要求所有 Pod 具有 IP 地址,那么就要確保整個(gè)集群中的所有 Pod 的 IP 地址是唯一的。這可以通過(guò)為每個(gè)節點(diǎn)分配一個(gè)唯一的子網(wǎng)來(lái)實(shí)現,即從子網(wǎng)中為 Pod 分配節點(diǎn) IP 地址。

節點(diǎn) IPAM 控制器 當nodeipam傳遞給 kube-controller-manager 的--controllers命令行標志時(shí),它將為每個(gè)節點(diǎn)分配來(lái)自集群 CIDR(集群網(wǎng)絡(luò )的 IP 范圍)的專(zhuān)用子網(wǎng)(podCIDR)。由于這些 podCIDR 是不相交的子網(wǎng),因此它可以為每個(gè) Pod 分配唯一的 IP 地址。 當 Kubernetes 節點(diǎn)首次在集群上注冊時(shí),會(huì )被分配一個(gè) podCIDR。要更改分配給集群中節點(diǎn)的 podCIDR,需要先注銷(xiāo)節點(diǎn),然后使用應用于 Kubernetes 控制平面的任何配置更改來(lái)重新注冊節點(diǎn)。podCIDR可以使用以下命令列出節點(diǎn)的名稱(chēng): f6648142-f0d8-11ed-90ce-dac502259ad0.jpg

Kubelet、Container Runtime 和 CNI 插件交互

當在節點(diǎn)上調度 Pod 時(shí),一啟動(dòng) Pod 就會(huì )發(fā)生很多事情。這里我們僅關(guān)注與 Pod 配置網(wǎng)絡(luò )有關(guān)的動(dòng)態(tài)。一旦在節點(diǎn)上調度了 Pod,將配置網(wǎng)絡(luò )并啟動(dòng)應用程序容器。

f67526fa-f0d8-11ed-90ce-dac502259ad0.png

參考:容器式 cri 插件架構 Container Runtime 與 CNI 插件的交互 每個(gè) network provider 都有一個(gè) CNI 插件,container runtime 會(huì )調用該插件,在 Pod 啟動(dòng)時(shí)配置網(wǎng)絡(luò )。使用容器化作為 container runtime,容器化 CRI 插件將調用 CNI 插件。每個(gè) network provider 都在每個(gè) Kubernetes 節點(diǎn)上安裝了一個(gè)代理,以配置 Pod 網(wǎng)絡(luò )。安裝 network provider agent 后,它會(huì )隨 CNI 一起配置或者在節點(diǎn)上創(chuàng )建,CRI 插件會(huì )使用它來(lái)確定要調用哪個(gè) CNI 插件。 CNI 配置文件的位置是可配置的,默認值為/etc/cni/net.d/。集群管理員需要在每個(gè)節點(diǎn)上交付 CNI 插件。CNI 插件的位置也是可配置的,默認值為/opt/cni/bin。 如果使用 containerd 作為 container runtime,則可以在 containerd config 部分下[plugins."io.containerd.grpc.v1.cri".cni]指定 CNI 配置和 CNI 插件的路徑。 本文中我們將 Flannel 作為 network provider,這里簡(jiǎn)單介紹一下 Flannel 的設置。Flanneld 是 Flannel 守護程序,通常 install-cni 作為帶有初始化容器的守護程序安裝在 Kubernetes 集群上。install-cni 容器創(chuàng )建 CNI 配置文件在每個(gè)節點(diǎn)上/etc/cni/net.d/10-flannel.conflist。Flanneld 創(chuàng )建一個(gè) vxlan 設備,從 apiserver 獲取網(wǎng)絡(luò )元數據,并監控 Pod 上的更新。創(chuàng )建 Pod 時(shí),它將在整個(gè)集群中為所有 Pod 分配路由,這些路由允許 Pod 通過(guò) IP 地址相互連接。 Containerd CRI 插件和 CNI 插件之間的交互可以如下所示:

f6992636-f0d8-11ed-90ce-dac502259ad0.png

如上所述,kubelet 調用 Containered CRI 插件創(chuàng )建容器,再調用 CNI 插件為容器配置網(wǎng)絡(luò )。Network provider CNI 插件調用其他基本 CNI 插件來(lái)配置網(wǎng)絡(luò )。CNI 插件之間的交互如下所述。 CNI 插件之間的交互 有多種 CNI 插件可幫助配置主機上容器之間的網(wǎng)絡(luò ),本文主要討論以下 3 個(gè)插件。 Flannel CNI 插件 當使用 Flannel 作為 network provider 時(shí),Containered CRI 插件使用 CNI 配置文件,調用 Flannel CNI 插件:/etc/cni/net.d/10-flannel.conflist。

f6c1246a-f0d8-11ed-90ce-dac502259ad0.jpg

Fannel CNI 插件與 Flanneld 結合使用,當 Flanneld 啟動(dòng)時(shí),它將從 apiserver 中獲取 podCIDR 和其他與網(wǎng)絡(luò )相關(guān)的詳細信息,并將它們存儲在文件中/run/flannel/subnet.env。

f6d44acc-f0d8-11ed-90ce-dac502259ad0.jpg

Flannel CNI 插件使用/run/flannel/subnet.env的信息來(lái)配置和調用 Bridge CNI 插件。 Bridge CNI 插件 Flannel CNI 插件使用以下配置調用 Bridge CNI 插件:

f6ea7e6e-f0d8-11ed-90ce-dac502259ad0.jpg

當 Bridge CNI 插件第一次調用時(shí),它會(huì )創(chuàng )建一個(gè) Linux Bridge"name": "cni0"在配置文件中,然后為每個(gè) Pod 創(chuàng )建 veth pair,其一端在容器的網(wǎng)絡(luò )命名空間中,另一端連接到主機網(wǎng)絡(luò )上的 Linux Bridge。使用 Bridge CNI 插件,主機上的所有容器都連接到主機網(wǎng)絡(luò )上的 Linux Bridge。 配置完 veth pair 后,Bridge 插件將調用主機本地 IPAM CNI 插件。我們可以在 CNI config 中配置要使用的 IPAM 插件,CRI 插件用于調用 Flannel CNI插件。 主機本地 IPAM CNI 插件 Bridge CNI 插件使用以下配置調用主機本地 IPAM CNI 插件:

f6fd7ad2-f0d8-11ed-90ce-dac502259ad0.jpg

主機本地 IPAM(IP 地址管理)插件從中返回容器的 IP 地址,subnet將分配的 IP 本地存儲在主機下dataDir指定的目錄中/var/lib/cni/networks//。/var/lib/cni/networks//文件包含 IP 分配到的容器 ID。 調用時(shí),主機本地 IPAM 插件返回以下有效負載: f711451c-f0d8-11ed-90ce-dac502259ad0.jpg

總結

Kube-controller-manager 為每個(gè)節點(diǎn)分配一個(gè) podCIDR。從 podCIDR 中的子網(wǎng)值為節點(diǎn)上的 Pod 分配了 IP 地址。由于所有節點(diǎn)上的 podCIDR 是不相交的子網(wǎng),因此它允許為每個(gè) pod 分配唯一的IP地址。

Kubernetes 集群管理員可配置和安裝 kubelet、container runtime、network provider,并在每個(gè)節點(diǎn)上分發(fā) CNI 插件。Network provider agent 啟動(dòng)時(shí),將生成 CNI 配置。在節點(diǎn)上調度 Pod 后,kubelet 會(huì )調用 CRI 插件來(lái)創(chuàng )建 Pod。在容器情況下,容器的 CRI 插件調用 CNI 配置中指定的 CNI 插件來(lái)配置 Pod 網(wǎng)絡(luò )。所有這些都會(huì )影響 Pod 獲取 IP地址。

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權轉載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習之用,如有內容侵權或者其他違規問(wèn)題,請聯(lián)系本站處理。 舉報投訴
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    483

    瀏覽量

    21926
  • 網(wǎng)絡(luò )模型

    關(guān)注

    0

    文章

    39

    瀏覽量

    8359
  • kubernetes
    +關(guān)注

    關(guān)注

    0

    文章

    219

    瀏覽量

    8603

原文標題:圖解 Kubernetes Pod 是如何獲取 IP 地址?

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛(ài)好者】歡迎添加關(guān)注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    PSoC? 6中的兩個(gè)獨立MCU內核如何獨立訪(fǎng)問(wèn)其指令?

    PSoC? 6 中的兩個(gè)獨立 MCU 內核如何獨立訪(fǎng)問(wèn)其指令? 是否有 DUAL_SENSOR_BOX_KIT 內核 PSoC? 6 指令存儲器架構的框圖有助于解釋?zhuān)?在什么條件下,從一個(gè) MCU 獲取的指令會(huì )導致另一個(gè) MCU 等待?
    發(fā)表于 03-04 08:09

    Kubernetes的Device Plugin設計解讀

    工作節點(diǎn),到設備與容器的實(shí)際綁定。首先思考的第一個(gè)問(wèn)題是為什么進(jìn)入alpha.kubernetes.io/nvidia-gpu主干一年之久的GPU功能徹底移除?OutOfTree
    發(fā)表于 03-12 16:23

    Kubernetes Ingress 高可靠部署最佳實(shí)踐

    Ingress Pod的集群節點(diǎn)Ingress Pod:Ingress服務(wù)實(shí)例這三者之間依據標簽node-role.kubernetes.io/ingress=true進(jìn)行關(guān)聯(lián):1.Ingress SLB
    發(fā)表于 04-17 14:35

    阿里云容器Kubernetes監控(二) - 使用Grafana展現Pod監控數據

    kubernetes中承擔的責任遠不止監控數據的采集,還包括控制臺的監控接口、HPA的POD彈性伸縮等都依賴(lài)于Heapster的功能。簡(jiǎn)介在kubernetes的監控方案中
    發(fā)表于 05-10 15:28

    從零開(kāi)始入門(mén) K8s| 詳解 Pod 及容器設計模式

    ?它會(huì )把四個(gè)獨立的進(jìn)程分別用四個(gè)獨立的容器啟動(dòng)起來(lái),然后把它們定義在一個(gè) Pod 里面。所以當 Kubernetes 把 Helloworld 給拉起來(lái)的時(shí)候,你實(shí)際上會(huì )看到四個(gè)容器,
    發(fā)表于 09-20 15:12

    Pod資源配置

    Kubernetes進(jìn)階實(shí)戰》第四章《管理Pod資源對象》
    發(fā)表于 10-22 14:39

    淺談Kubernetes集群的高可用方案

    Kubernetes作為容器應用的管理中心,通過(guò)對Pod的數量進(jìn)行監控,并且根據主機或容器失效的狀態(tài)將新的Pod調度到其他Node上,實(shí)現了應用層的高可用性。針對Kubernetes
    發(fā)表于 10-11 10:04 ?1次下載
    淺談<b class='flag-5'>Kubernetes</b>集群的高可用方案

    深入研究Kubernetes調度

    “本文從 Pod 和節點(diǎn)的配置開(kāi)始,介紹了 Kubernetes Scheduler 框架、擴展點(diǎn)、API 以及可能發(fā)生的與資源相關(guān)的瓶頸,并展示了性能調整設置,涵蓋了 Kubernetes 中調度
    的頭像 發(fā)表于 08-23 10:39 ?1227次閱讀

    Kubernetes組件pod核心原理

    的 IP 地址和主機名 hostname,利用 namespace 進(jìn)行資源隔離,相當于一臺獨立沙箱環(huán)境; pod 相當于一臺獨立主機,內部可以封裝一個(gè)或多個(gè)容器(通常是一組相關(guān)的容器),內部容器之間
    的頭像 發(fā)表于 09-02 09:27 ?1633次閱讀

    Kubernetes Pod多網(wǎng)卡方案MULTUS

    Kubernetes 當前沒(méi)有提供為POD添加額外的接口選項的規定,或支持多個(gè) CNI 插件同時(shí)工作的規定,但是它確實(shí)提供了一種由 API 服務(wù)器擴展受支持的API的機制。使用 "自定義
    的頭像 發(fā)表于 06-22 10:08 ?1126次閱讀

    Kubernetes集群內服務(wù)通信機制介紹

    現在在 Kubernetes 集群中,我們擁有構成集群管理組件和一組工作機器(稱(chēng)為節點(diǎn))的控制平面。這些節點(diǎn)托管 Pod,這些 Pod 將后端微服務(wù)作為容器化服務(wù)運行。
    發(fā)表于 10-04 10:13 ?445次閱讀

    Kubernetes中的Pod簡(jiǎn)易理解

    PodKubernetes中非常重要的概念,也是Kubernetes管理的基本單位。正如其名,Pod像一個(gè)豌豆莢,可以容納多個(gè)container,擁有相同的IP地址。
    的頭像 發(fā)表于 02-15 10:44 ?1017次閱讀

    Kubernetes Pod如何獲取IP地址呢?

    Kubernetes 網(wǎng)絡(luò )模型的核心要求之一是每個(gè) Pod 都擁有自己的 IP 地址并可以使用該 IP 地址進(jìn)行通信。很多人剛開(kāi)始使用 Kubernetes 時(shí),還不清楚如何為每個(gè) Pod
    的頭像 發(fā)表于 07-21 10:00 ?580次閱讀
    <b class='flag-5'>Kubernetes</b> <b class='flag-5'>Pod</b>如何獲取IP地址呢?

    Pod是如何在底層實(shí)現的?如何使用Docker創(chuàng )建Pod?

    剛開(kāi)始接觸 Kubernetes 時(shí),你學(xué)到的第一件事就是每個(gè) Pod 都有一個(gè)唯一的 IP 和主機名,并且在同一個(gè) Pod 中,容器可以通過(guò) localhost 相互通信。所以,顯而易見(jiàn),一個(gè)
    的頭像 發(fā)表于 08-14 10:33 ?930次閱讀
    <b class='flag-5'>Pod</b>是如何在底層實(shí)現的?如何使用Docker創(chuàng  )建<b class='flag-5'>Pod</b>?

    配置KubernetesPod使用代理的兩種常見(jiàn)方式

    的需要。本文將介紹配置KubernetesPod使用代理的兩種常見(jiàn)方式:通過(guò)ConfigMap和直接在應用程序環(huán)境變量中設置。
    的頭像 發(fā)表于 01-05 11:22 ?561次閱讀
    配置<b class='flag-5'>Kubernetes</b>中<b class='flag-5'>Pod</b>使用代理的兩種常見(jiàn)方式
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看