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

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

云計算 云原生 網(wǎng)絡(luò)
在 kubernetes 中設(shè)置網(wǎng)絡(luò)有多種方法,容器運(yùn)行時也有多種選項(xiàng)。在這篇文章中,我將使用 Flannel作為網(wǎng)絡(luò)提供程序, 使用 Containerd作為容器運(yùn)行時。

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

在 kubernetes 中設(shè)置網(wǎng)絡(luò)有多種方法,容器運(yùn)行時也有多種選項(xiàng)。在這篇文章中,我將使用 Flannel作為網(wǎng)絡(luò)提供程序, 使用 Containerd作為容器運(yùn)行時。

一、背景概念

1.容器網(wǎng)絡(luò):非常簡短的概述

有一些非常好的帖子解釋了容器網(wǎng)絡(luò)的工作原理。對于上下文,我將在這里使用涉及 Linux 橋接網(wǎng)絡(luò)和數(shù)據(jù)包封裝的單一方法進(jìn)行非常高層次的概述。在這里跳過細(xì)節(jié)。

2.同一主機(jī)上的容器

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

3.不同主機(jī)上的容器

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

在 kubernetes 集群中,flannel 在每個節(jié)點(diǎn)上創(chuàng)建一個 vxlan 設(shè)備和一些路由表?xiàng)l目。發(fā)往不同主機(jī)上的容器的每個數(shù)據(jù)包都會經(jīng)過 vxlan 設(shè)備并封裝在 UDP 數(shù)據(jù)包中。在目的地,檢索封裝的數(shù)據(jù)包并將數(shù)據(jù)包路由到目標(biāo) Pod。

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

4.什么是 CRI?

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

5.什么是CNI?

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

二、為 Pod IP 地址的節(jié)點(diǎn)分配子網(wǎng)

如果所有 Pod 都需要有一個 IP 地址,那么確保整個集群中的所有 Pod 都具有唯一的 IP 地址非常重要。這是通過為每個節(jié)點(diǎn)分配一個唯一的子網(wǎng)來實(shí)現(xiàn)的,從該子網(wǎng)為 Pod 分配該節(jié)點(diǎn)上的 IP 地址。

1.節(jié)點(diǎn) IPAM 控制器

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

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

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

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

當(dāng) pod 被調(diào)度到節(jié)點(diǎn)上時,會發(fā)生很多事情來啟動 pod。在本節(jié)中,我將僅關(guān)注與為 pod 配置網(wǎng)絡(luò)相關(guān)的交互。

在節(jié)點(diǎn)上調(diào)度 Pod 后,以下交互將導(dǎo)致配置網(wǎng)絡(luò)并啟動應(yīng)用程序容器。

3.容器運(yùn)行時和 CNI 插件之間的交互

每個網(wǎng)絡(luò)提供商都有一個 CNI 插件,容器運(yùn)行時會調(diào)用該插件來在 pod 啟動時為其配置網(wǎng)絡(luò)。使用containerd作為容器運(yùn)行時, Containerd CRI插件調(diào)用CNI插件。每個網(wǎng)絡(luò)提供商還會在每個 kubernetes 節(jié)點(diǎn)上安裝一個代理來配置 pod 網(wǎng)絡(luò)。安裝網(wǎng)絡(luò)提供商代理后,它要么隨 CNI 配置一起提供,要么在節(jié)點(diǎn)上創(chuàng)建一個配置,然后 CRI 插件使用該配置來確定要調(diào)用哪個 CNI 插件。

CNI 配置文件的位置是可配置的,默認(rèn)值為/etc/cni/net.d/. CNI 插件需要由集群管理員發(fā)送到每個節(jié)點(diǎn)上。CNI 插件的位置也是可配置的,默認(rèn)值為/opt/cni/bin。

如果使用containerd作為容器運(yùn)行時,則可以在containerd配置[plugins."io.containerd.grpc.v1.cri".cni]部分 下指定CNI配置和CNI插件二進(jìn)制文件的路徑。

由于我們在這里將 Flannel 稱為網(wǎng)絡(luò)提供商,因此我將稍微討論一下 Flannel 的設(shè)置方式。Flanneld 是 Flannel 守護(hù)進(jìn)程,通常install-cni作為 守護(hù)進(jìn)程集和init 容器安裝在 kubernetes 集群上。容器在每個節(jié)點(diǎn)上install-cni創(chuàng)建 CNI 配置文件。/etc/cni/net.d/10-flannel.conflistFlaneld 創(chuàng)建一個 vxlan 設(shè)備,從 apiserver 獲取網(wǎng)絡(luò)元數(shù)據(jù)并監(jiān)視 Pod 上的更新。創(chuàng)建 Pod 時,它會為整個集群中的所有 Pod 分配路由,這些路由允許 Pod 通過其 IP 地址相互連接。有關(guān)Flannel工作原理的詳細(xì)信息,推薦參考官方描述。

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

如上所述,kubelet 調(diào)用 Containerd CRI 插件來創(chuàng)建 pod,Containerd CRI 插件調(diào)用 CNI 插件為 pod 配置網(wǎng)絡(luò)。網(wǎng)絡(luò)提供商 CNI 插件調(diào)用其他基礎(chǔ) CNI 插件來配置網(wǎng)絡(luò)。CNI 插件之間的交互如下所述。

三、CNI 插件之間的交互

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

Flannel CNI 插件當(dāng)使用 Flannel 作為網(wǎng)絡(luò)提供者時,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 結(jié)合使用。當(dāng) Flaneld 啟動時,它會從 apiserver 獲取 podCIDR 和其他網(wǎng)絡(luò)相關(guān)詳細(xì)信息,并將它們存儲在文件中 - /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來配置和調(diào)用橋接 CNI 插件。

1.橋接 CNI 插件

Flannel CNI 插件使用以下配置調(diào)用 Bridge CNI 插件:

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

當(dāng) 第一次調(diào)用Bridge CNI 插件"name": "cni0"時,它會使用配置文件中指定的內(nèi)容創(chuàng)建一個 Linux 橋。然后,它為每個 pod 創(chuàng)建一個 veth 對 - 該對的一端位于容器的網(wǎng)絡(luò)命名空間中,另一端連接到主機(jī)網(wǎng)絡(luò)上的 linux 橋。使用 Bridge CNI 插件,主機(jī)上的所有容器都連接到主機(jī)網(wǎng)絡(luò)上的 linux 橋。

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

2.主機(jī)本地 IPAM CNI 插件

Bridge CNI 插件 使用以下配置調(diào)用主機(jī)本地 IPAM CNI 插件:

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

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

調(diào)用時,主機(jī)本地 IPAM 插件返回以下有效負(fù)載

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

小結(jié)

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

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

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

責(zé)任編輯:趙寧寧 來源: 云原生運(yùn)維圈
相關(guān)推薦

2021-01-28 10:55:47

Kubernetes IPLinux

2020-11-30 12:15:26

KubernetesPodLinux

2022-07-19 16:03:14

KubernetesLinux

2023-11-02 20:05:17

KubernetesPod管理

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協(xié)議IP

2021-02-22 09:44:03

KubernetesDNSLinux

2025-02-12 09:57:55

2022-03-04 14:32:01

命令行IP 地址Linux

2022-07-18 14:45:22

Kubernetes暴露方案

2024-07-26 09:47:28

2020-04-10 08:00:08

Kubernetes補(bǔ)丁pod

2023-06-28 10:24:04

2023-03-06 21:29:41

mmap技術(shù)操作系統(tǒng)

2025-03-13 06:22:59

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩成人中文字幕 | 91大神xh98xh系列全部 | a视频在线观看 | 欧美阿v | 欧美中文字幕一区二区 | 最新91在线 | 久久久久国产精品午夜一区 | 国产精品一区免费 | 中文字幕一区二区三区精彩视频 | 国产一区亚洲 | 日韩免费1区二区电影 | 一区二区视频在线观看 | 国产精品精品视频一区二区三区 | 欧美亚洲免费 | 国产精品99久久久久久久vr | www.国产精品 | 国产免费观看视频 | 亚洲一区国产精品 | 免费毛片www com cn| 国产成人99久久亚洲综合精品 | 成人欧美一区二区 | 日韩精品一区二区三区中文字幕 | 成人免费视频网站在线看 | 高清国产一区二区 | 国产精品精品久久久 | 久久精品99久久 | 欧美极品在线 | 涩色视频在线观看 | 国产aⅴ精品 | 日韩和的一区二在线 | 超碰在线播 | 91免费视频 | 亚洲欧美日韩精品久久亚洲区 | 黄网站免费在线 | 97伦理电影 | 男女羞羞在线观看 | 欧美精品一区在线 | 国产精品国产精品 | 成人一区二 | 九色在线观看 | 国产精品成人一区二区三区 |