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

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

3天內不再提示

Kubernetes Pod如何獲取IP地址呢?

馬哥Linux運維 ? 來源:IT???/span> ? 2023-07-21 10:00 ? 次閱讀

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

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

背景概念

容器網絡

同一主機上的容器

在同一主機上運行的容器通過 IP 地址相互通信的方法之一是使用 Linux Bridge,即在 Kubernetes(和 Docker)世界中,創(chuàng)建 veth(虛擬以太網)設備。該 veth 設備的一端連接在容器網絡命名空間,另一端連接到主機網絡上的 Linux Bridge。

同一主機上的所有容器都將這 veth pair 的一端連接到 Linux Bridge,它們可以通過 Bridge 使用 IP 地址相互通信。Linux Bridge 也被分配了一個 IP 地址,它充當從目的地到不同節(jié)點的 Pod 流出流量的網關。

0d28ff50-270e-11ee-962d-dac502259ad0.png

不同主機上的容器

在不同主機上運行的容器可以通過其 IP 地址相互通信的方式之一是使用數(shù)據(jù)包封裝(packet encapsulation)。Flannel 通過 vxlan 使用該功能,vxlan 將原始數(shù)據(jù)包封裝在 UDP 數(shù)據(jù)包中并將其發(fā)送到目的地。

在 Kubernetes 集群中,F(xiàn)lannel 會在每個節(jié)點上創(chuàng)建一個 vxlan 設備和一些路由表。每個發(fā)往不同主機上的容器的數(shù)據(jù)包都會通過 vxlan 設備,并封裝在 UDP 數(shù)據(jù)包中。在目標位置,它會提取封裝的數(shù)據(jù)包,然后將數(shù)據(jù)包路由到目的地 Pod。

0d40563c-270e-11ee-962d-dac502259ad0.png

注意:這只是配置容器之間網絡的方法之一。

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

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

為節(jié)點子網分配 Pod IP 地址

如果要求所有 Pod 具有 IP 地址,那么就要確保整個集群中的所有 Pod 的 IP 地址是唯一的。這可以通過為每個節(jié)點分配一個唯一的子網來實現(xiàn),即從子網中為 Pod 分配節(jié)點 IP 地址。

節(jié)點 IPAM 控制器 當nodeipam傳遞給 kube-controller-manager 的--controllers命令行標志時,它將為每個節(jié)點分配來自集群 CIDR(集群網絡的 IP 范圍)的專用子網(podCIDR)。由于這些 podCIDR 是不相交的子網,因此它可以為每個 Pod 分配唯一的 IP 地址。

當 Kubernetes 節(jié)點首次在集群上注冊時,會被分配一個 podCIDR。要更改分配給集群中節(jié)點的 podCIDR,需要先注銷節(jié)點,然后使用應用于 Kubernetes 控制平面的任何配置更改來重新注冊節(jié)點。podCIDR可以使用以下命令列出節(jié)點的名稱:

0d4f688e-270e-11ee-962d-dac502259ad0.jpg

Kubelet、Container Runtime 和 CNI 插件交互

當在節(jié)點上調度 Pod 時,一啟動 Pod 就會發(fā)生很多事情。這里我們僅關注與 Pod 配置網絡有關的動態(tài)。一旦在節(jié)點上調度了 Pod,將配置網絡并啟動應用程序容器。

0d6bc416-270e-11ee-962d-dac502259ad0.png

參考:容器式 cri 插件架構 Container Runtime 與 CNI 插件的交互 每個 network provider 都有一個 CNI 插件,container runtime 會調用該插件,在 Pod 啟動時配置網絡。使用容器化作為 container runtime,容器化 CRI 插件將調用 CNI 插件。每個 network provider 都在每個 Kubernetes 節(jié)點上安裝了一個代理,以配置 Pod 網絡。

安裝 network provider agent 后,它會隨 CNI 一起配置或者在節(jié)點上創(chuàng)建,CRI 插件會使用它來確定要調用哪個 CNI 插件。 CNI 配置文件的位置是可配置的,默認值為/etc/cni/net.d/。集群管理員需要在每個節(jié)點上交付 CNI 插件。

CNI 插件的位置也是可配置的,默認值為/opt/cni/bin。

如果使用 containerd 作為 container runtime,則可以在 containerd config 部分下[plugins."io.containerd.grpc.v1.cri".cni]指定 CNI 配置和 CNI 插件的路徑。 本文中我們將 Flannel 作為 network provider,這里簡單介紹一下 Flannel 的設置。

Flanneld 是 Flannel 守護程序,通常 install-cni 作為帶有初始化容器的守護程序安裝在 Kubernetes 集群上。install-cni 容器創(chuàng)建 CNI 配置文件在每個節(jié)點上/etc/cni/net.d/10-flannel.conflist。Flanneld 創(chuàng)建一個 vxlan 設備,從 apiserver 獲取網絡元數(shù)據(jù),并監(jiān)控 Pod 上的更新。

創(chuàng)建 Pod 時,它將在整個集群中為所有 Pod 分配路由,這些路由允許 Pod 通過 IP 地址相互連接。 Containerd CRI 插件和 CNI 插件之間的交互可以如下所示:

0d8475a6-270e-11ee-962d-dac502259ad0.png

如上所述,kubelet 調用 Containered CRI 插件創(chuàng)建容器,再調用 CNI 插件為容器配置網絡。Network provider CNI 插件調用其他基本 CNI 插件來配置網絡。CNI 插件之間的交互如下所述。

CNI 插件之間的交互 有多種 CNI 插件可幫助配置主機上容器之間的網絡,本文主要討論以下 3 個插件。

Flannel CNI 插件

當使用 Flannel 作為network provider時,Containered CRI 插件使用 CNI 配置文件,調用 Flannel CNI 插件:/etc/cni/net.d/10-flannel.conflist。

0db448c6-270e-11ee-962d-dac502259ad0.png

Fannel CNI 插件與 Flanneld 結合使用,當 Flanneld 啟動時,它將從 apiserver 中獲取 podCIDR和其他與網絡相關的詳細信息,并將它們存儲在文件中/run/flannel/subnet.env。

0dee6524-270e-11ee-962d-dac502259ad0.png

Flannel CNI 插件使用/run/flannel/subnet.env的信息來配置和調用 Bridge CNI 插件。

Bridge CNI 插件

Flannel CNI 插件使用以下配置調用 Bridge CNI 插件:

0e22c152-270e-11ee-962d-dac502259ad0.png

當 Bridge CNI 插件第一次調用時,它會創(chuàng)建一個 Linux Bridge"name": "cni0"在配置文件中,然后為每個 Pod 創(chuàng)建 veth pair,其一端在容器的網絡命名空間中,另一端連接到主機網絡上的 Linux Bridge。使用 Bridge CNI 插件,主機上的所有容器都連接到主機網絡上的 Linux Bridge。

配置完 veth pair 后,Bridge 插件將調用主機本地 IPAM CNI 插件。我們可以在 CNI config 中配置要使用的 IPAM 插件,CRI 插件用于調用 Flannel CNI插件。

主機本地 IPAM CNI 插件

Bridge CNI 插件使用以下配置調用主機本地 IPAM CNI 插件:

0e6de678-270e-11ee-962d-dac502259ad0.png

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

0e9b0aa4-270e-11ee-962d-dac502259ad0.png

總結

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

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

鏈接:https://www.sohu.com/a/447358313_760387





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux系統(tǒng)

    關注

    4

    文章

    590

    瀏覽量

    27317
  • UDP協(xié)議
    +關注

    關注

    0

    文章

    68

    瀏覽量

    12673
  • 虛擬以太網
    +關注

    關注

    0

    文章

    2

    瀏覽量

    5750
  • CRI
    CRI
    +關注

    關注

    1

    文章

    16

    瀏覽量

    12222

原文標題:帶你搞懂 Kubernetes Pod 如何獲取 IP 地址

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    阿里云容器Kubernetes監(jiān)控(二) - 使用Grafana展現(xiàn)Pod監(jiān)控數(shù)據(jù)

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

    從零開始入門 K8s| 詳解 Pod 及容器設計模式

    一、為什么需要 Pod容器的基本概念我們知道 PodKubernetes 項目里面一個非常重要的概念,也是非常重要的一個原子調度單位,但是為什么我們會需要這樣一個概念?在使用容
    發(fā)表于 09-20 15:12

    Pod資源配置

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

    STM32 DHCP怎么獲取IP地址

    如果我首先開啟的是板子,然后再開啟路由器,那么在初始化的時候dhcp是獲取不到ip的,那么我應該怎么在機器啟動后繼續(xù)獲取IP地址
    發(fā)表于 10-10 14:27

    lwip獲取ip地址說明

    Lwip是由Adam Dunkels 開發(fā)的一個小型開源的TCP/IP協(xié)議棧;目前已經為全球共同開發(fā)的開源協(xié)議。下面來看看lwip是如何能夠獲取ip地址的。
    發(fā)表于 12-11 15:55 ?1.2w次閱讀

    深入研究Kubernetes調度

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

    Kubernetes組件pod核心原理

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

    獲取IP地址的工具介紹

    容易,而當你遇到某些老項目,沒有任何存檔資料,網絡設備的IP地址更是無法知曉,但你還不得不面對這樣的現(xiàn)實,要么不停產維護,要么需要聯(lián)機上載程序,所以,只有想辦法獲取到當前控制器或通信模塊的IP
    的頭像 發(fā)表于 10-08 15:52 ?2.2w次閱讀
    <b class='flag-5'>獲取</b><b class='flag-5'>IP</b><b class='flag-5'>地址</b>的工具介紹

    如何通過一張照片來獲取ip地址

    接著我還想說明一下如何使用SQLi來獲取ip地址。其實使用照片來盜取ip地址十分快捷,我們沒有理由去使用SQLi這種方法,但是為了讓讀者
    的頭像 發(fā)表于 12-14 10:31 ?5111次閱讀

    Kubernetes中的Pod簡易理解

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

    Kubernetes Pod如何獨立工作

    在學習 Kubernetes 網絡模型的過程中,了解各種網絡組件的作用以及如何交互非常重要。本文就介紹了各種網絡組件在 Kubernetes 集群中是如何交互的,以及如何幫助每個 Pod 都能
    的頭像 發(fā)表于 05-16 14:29 ?597次閱讀
    <b class='flag-5'>Kubernetes</b> <b class='flag-5'>Pod</b>如何獨立工作

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

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

    如何綁定ip地址與mac物理地址?

    如何綁定ip地址與mac物理地址? 綁定IP地址與MAC物理
    的頭像 發(fā)表于 12-07 09:33 ?6376次閱讀

    獲取Telegram的用戶IP地址

    最近有個需求,查了些資料發(fā)現(xiàn),Telegram有語音通話功能,也可以類似QQ一樣通過語音通話的連接獲取對方的IP地址, Denis Simonov (原文為俄語)發(fā)表過一篇文章,演示了如何通過 Telegram 語音呼叫
    的頭像 發(fā)表于 01-12 11:35 ?1555次閱讀
    <b class='flag-5'>獲取</b>Telegram的用戶<b class='flag-5'>IP</b><b class='flag-5'>地址</b>

    CentOS虛擬機克隆后開機無法獲取IP地址的解決策略

    克隆虛擬機后出現(xiàn)一臺能獲取IP地址,另外一臺獲取不到IP地址,查看MAC
    的頭像 發(fā)表于 04-17 12:27 ?663次閱讀
    CentOS虛擬機克隆后開機無法<b class='flag-5'>獲取</b><b class='flag-5'>IP</b><b class='flag-5'>地址</b>的解決策略