成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

帶你搞懂 Kubernetes Pod 如何獲取 IP 地址

云計算 云原生 網絡
在 kubernetes 中設置網絡有多種方法,容器運行時也有多種選項。在這篇文章中,我將使用 Flannel作為網絡提供程序, 使用 Containerd作為容器運行時。

Kubernetes 網絡模型的核心要求之一是每個 Pod 都應該有自己的 IP 地址,并且集群中的每個 Pod 都應該能夠使用這個 IP 地址與其進行通信。有多個網絡提供商(flannel、calico、canal 等)實現了這種網絡模型。

在 kubernetes 中設置網絡有多種方法,容器運行時也有多種選項。在這篇文章中,我將使用 Flannel作為網絡提供程序, 使用 Containerd作為容器運行時。

一、背景概念

1.容器網絡:非常簡短的概述

有一些非常好的帖子解釋了容器網絡的工作原理。對于上下文,我將在這里使用涉及 Linux 橋接網絡和數據包封裝的單一方法進行非常高層次的概述。在這里跳過細節。

2.同一主機上的容器

在同一主機上運行的容器可以通過其 IP 地址相互通信的方式之一是通過 Linux 橋。在 kubernetes(和 docker)世界中, 創建了veth(虛擬以太網)設備來實現此目的。該 veth 設備的一端插入容器網絡命名空間,另一端連接到 主機網絡上的Linux 橋。同一主機上的所有容器都將這一 veth 對的一端連接到 linux 網橋,并且它們可以通過網橋使用其 IP 地址相互通信。Linux 網橋還分配有一個 IP 地址,并充當從 pod 發往不同節點的出口流量的網關。

3.不同主機上的容器

在不同主機上運行的容器可以通過其 IP 地址相互通信的方法之一是使用數據包封裝。Flannel 通過 vxlan支持此功能,它將原始數據包包裝在 UDP 數據包中并將其發送到目的地。

在 kubernetes 集群中,flannel 在每個節點上創建一個 vxlan 設備和一些路由表條目。發往不同主機上的容器的每個數據包都會經過 vxlan 設備并封裝在 UDP 數據包中。在目的地,檢索封裝的數據包并將數據包路由到目標 Pod。

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

4.什么是 CRI?

CRI(容器運行時接口)是一個插件接口,允許 kubelet 使用不同的容器運行時。各種容器運行時都實現了 CRI API,這允許用戶在其 kubernetes 安裝中使用他們選擇的容器運行時。

5.什么是CNI?

CNI 項目包含一個 規范,為 Linux 容器提供基于插件的通用網絡解決方案。它還包含各種插件,在配置 Pod 網絡時執行不同的功能。CNI 插件是遵循 CNI 規范的可執行文件,我們將在下面的帖子中討論一些插件。

二、為 Pod IP 地址的節點分配子網

如果所有 Pod 都需要有一個 IP 地址,那么確保整個集群中的所有 Pod 都具有唯一的 IP 地址非常重要。這是通過為每個節點分配一個唯一的子網來實現的,從該子網為 Pod 分配該節點上的 IP 地址。

1.節點 IPAM 控制器

當nodeipam作為選項傳遞給 kube-controller-manager 的 --controllers命令行標志時,它會從集群 CIDR(集群網絡的 IP 范圍)為每個節點分配一個專用子網 (podCIDR)。由于這些 podCIDR 是不相交的子網,因此它允許為每個 pod 分配唯一的 IP 地址。

當 kubernetes 節點首次向集群注冊時,會為其分配一個 podCIDR。要更改分配給集群中節點的 podCIDR,需要取消注冊節點,然后重新注冊節點,并將任何配置更改首先應用于 kubernetes 控制平面。podCIDR可以使用以下命令列出節點。

$ kubectl get no <nodeName> -o json | jq '.spec.podCIDR'
10.244.0.0/24

2.Kubelet、容器運行時和 CNI 插件 - 如何將它們拼接在一起

當 pod 被調度到節點上時,會發生很多事情來啟動 pod。在本節中,我將僅關注與為 pod 配置網絡相關的交互。

在節點上調度 Pod 后,以下交互將導致配置網絡并啟動應用程序容器。

3.容器運行時和 CNI 插件之間的交互

每個網絡提供商都有一個 CNI 插件,容器運行時會調用該插件來在 pod 啟動時為其配置網絡。使用containerd作為容器運行時, Containerd 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 是 Flannel 守護進程,通常install-cni作為 守護進程集和init 容器安裝在 kubernetes 集群上。容器在每個節點上install-cni創建 CNI 配置文件。/etc/cni/net.d/10-flannel.conflistFlaneld 創建一個 vxlan 設備,從 apiserver 獲取網絡元數據并監視 Pod 上的更新。創建 Pod 時,它會為整個集群中的所有 Pod 分配路由,這些路由允許 Pod 通過其 IP 地址相互連接。有關Flannel工作原理的詳細信息,推薦參考官方描述。

Containerd CRI Plugin 和 CNI 插件之間的交互可以可視化如下:

如上所述,kubelet 調用 Containerd CRI 插件來創建 pod,Containerd CRI 插件調用 CNI 插件為 pod 配置網絡。網絡提供商 CNI 插件調用其他基礎 CNI 插件來配置網絡。CNI 插件之間的交互如下所述。

三、CNI 插件之間的交互

有各種 CNI 插件可以幫助配置主機上容器之間的網絡。在這篇文章中,我們將參考 3 個插件。

Flannel CNI 插件當使用 Flannel 作為網絡提供者時,Containerd CRI 插件 使用CNI 配置文件 - /etc/cni/net.d/10-flannel.conflist.

$ cat /etc/cni/net.d/10-flannel.conflist
{
"name": "cni0",
"plugins": [
  {
    "type": "flannel",
    "delegate": {
    "ipMasq": false,
      "hairpinMode": true,
      "isDefaultGateway": true
    }
  }
]
}

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

FLANNEL_NETWORK=10.244.0.0/16 
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450 
FLANNEL_IPMASQ=false

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

1.橋接 CNI 插件

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

{
  "name": "cni0",
  "type": "bridge",
  "mtu": 1450,
  "ipMasq": false,
  "isGateway": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/24"
  }
}

當 第一次調用Bridge CNI 插件"name": "cni0"時,它會使用配置文件中指定的內容創建一個 Linux 橋。然后,它為每個 pod 創建一個 veth 對 - 該對的一端位于容器的網絡命名空間中,另一端連接到主機網絡上的 linux 橋。使用 Bridge CNI 插件,主機上的所有容器都連接到主機網絡上的 linux 橋。

配置 veth 對后,Bridge 插件會調用主機本地 IPAM CNI 插件。使用哪個 IPAM 插件可以在 CNI 配置中配置 CRI 插件用于調用 flannel CNI 插件。

2.主機本地 IPAM CNI 插件

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

{
  "name": "cni0",
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/24",
    "dataDir": "/var/lib/cni/networks"
  }
}

主機本地 IPAM(IP 地址管理)插件從 - 中返回容器的 IP 地址,并將subnet分配的 IP 存儲在主機上本地指定的目錄下。文件包含分配了 IP 的容器 ID。dataDir/var/lib/cni/networks/<network-name=cni0>/<ip>/var/lib/cni/networks/<network-name=cni0>/<ip>

調用時,主機本地 IPAM 插件返回以下有效負載

{
  "ip4": {
    "ip": "10.244.4.2",
    "gateway": "10.244.4.3"
  },
  "dns": {}
}

小結

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

Kubernetes 集群管理員配置并安裝 kubelet、容器運行時、網絡提供商代理并在每個節點上分發 CNI 插件。當網絡提供商代理啟動時,它會生成 CNI 配置。當 pod 被調度到節點上時,kubelet 會調用 CRI 插件來創建 pod。在containerd的情況下,Containerd CRI插件然后調用CNI配置中指定的CNI插件來配置pod網絡。所有這些都會導致 Pod 獲得 IP 地址。

參考:https://ronaknathani.com/blog/2020/08/how-a-kubernetes-pod-gets-an-ip-address/

責任編輯:趙寧寧 來源: 云原生運維圈
相關推薦

2021-01-28 10:55:47

Kubernetes IPLinux

2020-11-30 12:15:26

KubernetesPodLinux

2023-11-02 20:05:17

KubernetesPod管理

2022-07-19 16:03:14

KubernetesLinux

2023-10-19 19:42:25

IstioPodkubernetes

2021-03-11 12:15:37

Kubernetes云原生容器

2024-06-19 09:33:05

2023-09-11 06:32:30

VPAHPA容量

2015-07-10 09:08:52

IP地址IP地址沖突

2009-06-19 17:31:59

Java獲取IP地址

2023-04-12 13:32:34

DHCP協議IP

2021-02-22 09:44:03

KubernetesDNSLinux

2025-02-12 09:57:55

2022-03-04 14:32:01

命令行IP 地址Linux

2023-02-09 16:47:34

KubernetesPod優先級

2024-07-26 09:47:28

2020-04-10 08:00:08

Kubernetes補丁pod

2022-07-18 14:45:22

Kubernetes暴露方案

2025-03-13 06:22:59

2021-12-29 17:29:07

KubernetesEvents集群
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九七午夜剧场福利写真 | 欧美一区免费 | 午夜欧美日韩 | 中文字幕一区在线 | 香蕉二区 | 毛片在线免费 | 日日夜夜免费精品视频 | 成人精品在线视频 | 亚洲九九色 | 日本一区二区三区免费观看 | 精品久久久久久亚洲精品 | 五月免费视频 | 欧美精品二区 | 久久久久久久久久久久久九 | 免费人成激情视频在线观看冫 | 日本三级网 | av国产精品毛片一区二区小说 | ririsao久久精品一区 | 91操操操 | 欧美一区二区三区精品免费 | 国产午夜精品一区二区三区在线观看 | 国产a视频 | 美国av毛片| 国产欧美一区二区三区在线看 | 最新日韩欧美 | 国内精品伊人久久久久网站 | 成人免费视频 | 欧美一区久久 | 亚洲欧美日韩精品 | 久久三级av | 国产精品一区久久久久 | 国产精品欧美一区二区三区不卡 | 中文字幕国产视频 | 亚洲免费在线观看 | 一a一片一级一片啪啪 | 欧美精品一区三区 | 天天操人人干 | 亚洲精品乱码久久久久v最新版 | 中文字幕亚洲一区二区va在线 | www.色综合 | 成人欧美日韩一区二区三区 |