在线乱码卡一卡二卡新HD,最近韩国免费观看视频,国产色无码精品视频国产,亚洲男人的天堂久久香蕉

深入探索 Kubernetes 網(wǎng)絡(luò)模型和網(wǎng)絡(luò)通信 焦點(diǎn)消息
來(lái)源:云原生指北    時(shí)間:2022-12-05 09:49:20

Kubernetes 定義了一種簡(jiǎn)單、一致的網(wǎng)絡(luò)模型,基于扁平網(wǎng)絡(luò)結(jié)構(gòu)的設(shè)計(jì),無(wú)需將主機(jī)端口與網(wǎng)絡(luò)端口進(jìn)行映射便可以進(jìn)行高效地通訊,也無(wú)需其他組件進(jìn)行轉(zhuǎn)發(fā)。該模型也使應(yīng)用程序很容易從虛擬機(jī)或者主機(jī)物理機(jī)遷移到 Kubernetes 管理的 pod 中。

這篇文章主要深入探索Kubernetes網(wǎng)絡(luò)模型,并了解容器、pod間如何進(jìn)行通訊。對(duì)于網(wǎng)絡(luò)模型的實(shí)現(xiàn)將會(huì)在后面的文章介紹。


【資料圖】

Kubernetes 網(wǎng)絡(luò)模型

該模型定義了:

每個(gè) pod 都有自己的 IP 地址,這個(gè) IP 在集群范圍內(nèi)可達(dá)Pod 中的所有容器共享 pod IP 地址(包括 MAC 地址),并且容器之前可以相互通信(使用localhost)Pod 可以使用 pod IP 地址與集群中任一節(jié)點(diǎn)上的其他 pod 通信,無(wú)需 NATKubernetes 的組件之間可以相互通信,也可以與 pod 通信網(wǎng)絡(luò)隔離可以通過(guò)網(wǎng)絡(luò)策略實(shí)現(xiàn)

上面的定義中提到了幾個(gè)相關(guān)的組件:

Pod:Kubernetes 中的 pod 有點(diǎn)類似虛擬機(jī)有唯一的 IP 地址,同一個(gè)節(jié)點(diǎn)上的 pod 共享網(wǎng)絡(luò)和存儲(chǔ)。Container:pod 是一組容器的集合,這些容器共享同一個(gè)網(wǎng)絡(luò)命名空間。pod 內(nèi)的容器就像虛擬機(jī)上的進(jìn)程,進(jìn)程之間可以使用localhost進(jìn)行通信;容器有自己獨(dú)立的文件系統(tǒng)、CPU、內(nèi)存和進(jìn)程空間。需要通過(guò)創(chuàng)建 Pod 來(lái)創(chuàng)建容器。Node:pod 運(yùn)行在節(jié)點(diǎn)上,集群中包含一個(gè)或多個(gè)節(jié)點(diǎn)。每個(gè) pod 的網(wǎng)絡(luò)命名空間都會(huì)連接到節(jié)點(diǎn)的命名空間上,以打通網(wǎng)絡(luò)。

講了這么多次網(wǎng)絡(luò)命名空間,那它到底是如何運(yùn)作的呢?

網(wǎng)絡(luò)命名空間如何工作

在 Kubernetes 的發(fā)行版k3s創(chuàng)建一個(gè) pod,這個(gè) pod 有兩個(gè)容器:發(fā)送請(qǐng)求的curl?容器和提供 web 服務(wù)的httpbin容器。

雖然使用發(fā)行版,但是其仍然使用 Kubernetes 網(wǎng)絡(luò)模型,并不妨礙我們了解網(wǎng)絡(luò)模型。

apiVersion: v1kind: Podmetadata: name: multi-container-podspec: containers: - image: curlimages/curl name: curl command: ["sleep", "365d"] - image: kennethreitz/httpbin name: httpbin

登錄到節(jié)點(diǎn)上,通過(guò)lsns -t net?當(dāng)前主機(jī)上的網(wǎng)絡(luò)命名空間,但是并沒(méi)有找到httpbin?的進(jìn)程。有個(gè)命名空間的命令是/pause?,這個(gè)pause進(jìn)程實(shí)際上是每個(gè) pod 中不可見(jiàn)的sandbox

lsns -t net NS TYPE NPROCS PID USER NETNSID NSFS COMMAND4026531992 net 126 1 root unassigned /lib/systemd/systemd --system --deserialize 314026532247 net 1 83224 uuidd unassigned /usr/sbin/uuidd --socket-activation4026532317 net 4 129820 65535 0 /run/netns/cni-607c5530-b6d8-ba57-420e-a467d7b10c56 /pause

既然每個(gè)容器都有獨(dú)立的進(jìn)程空間,我們換下命令查看進(jìn)程類型的空間:

lsns -t pid NS TYPE NPROCS PID USER COMMAND4026531836 pid 127 1 root /lib/systemd/systemd --system --deserialize 314026532387 pid 1 129820 65535 /pause4026532389 pid 1 129855 systemd-network sleep 365d4026532391 pid 2 129889 root /usr/bin/python3 /usr/local/bin/gunicorn -b 0.0.0.0:80 httpbin:app -k gevent

通過(guò)進(jìn)程 PID129889可以找到其所屬的命名空間:

ip netns identify 129889cni-607c5530-b6d8-ba57-420e-a467d7b10c56

然后可以在該命名空間下使用exec執(zhí)行命令:

ip netns exec cni-607c5530-b6d8-ba57-420e-a467d7b10c56 ip a1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever2: eth0@if17: mtu 1450 qdisc noqueue state UP group default link/ether f2:c8:17:b6:5f:e5 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.42.1.14/24 brd 10.42.1.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::f0c8:17ff:feb6:5fe5/64 scope link valid_lft forever preferred_lft forever

從結(jié)果來(lái)看 pod 的 IP 地址10.42.1.14?綁定在接口eth0?上,而eth0?被連接到17號(hào)接口上。

在節(jié)點(diǎn)主機(jī)上,查看17?號(hào)接口信息。veth7912056b?是主機(jī)根命名空間下的虛擬以太接口(vitual ethernet device),是連接 pod 網(wǎng)絡(luò)和節(jié)點(diǎn)網(wǎng)絡(luò)的隧道,對(duì)端是 pod 命名空間下的接口eth0。

ip link | grep -A1 ^1717: veth7912056b@if2: mtu 1450 qdisc noqueue master cni0 state UP mode DEFAULT group default link/ether d6:5e:54:7f:df:af brd ff:ff:ff:ff:ff:ff link-netns cni-607c5530-b6d8-ba57-420e-a467d7b10c56

上面的結(jié)果看到,該veth?連到了個(gè)網(wǎng)橋(network bridge)cni0上。

網(wǎng)橋工作在數(shù)據(jù)鏈路層(OSI 模型的第 2 層),連接多個(gè)網(wǎng)絡(luò)(可多個(gè)網(wǎng)段)。當(dāng)請(qǐng)求到達(dá)網(wǎng)橋,網(wǎng)橋會(huì)詢問(wèn)所有連接的接口(這里 pod 通過(guò) veth 以網(wǎng)橋連接)是否擁有原始請(qǐng)求中的 IP 地址。如果有接口響應(yīng),網(wǎng)橋會(huì)將匹配信息(IP -> veth)記錄,并將數(shù)據(jù)轉(zhuǎn)發(fā)過(guò)去。

那如果沒(méi)有接口響應(yīng)怎么辦?具體流程就要看各個(gè)網(wǎng)絡(luò)插件的實(shí)現(xiàn)了。我準(zhǔn)備在后面的文章中介紹常用的網(wǎng)絡(luò)插件,比如 Calico、Flannel、Cilium 等。

接下來(lái)看下 Kubernetes 中的網(wǎng)絡(luò)通信如何完成,一共有幾種類型:

同 pod 內(nèi)容器間通信同節(jié)點(diǎn)上的 pod 間通信不同節(jié)點(diǎn)上的 pod 間通信Kubernetes 網(wǎng)絡(luò)如何工作

同 pod 內(nèi)的容器間通信

同 pod 內(nèi)的容器間通信最簡(jiǎn)單,這些容器共享網(wǎng)絡(luò)命名空間,每個(gè)命名空間下都有l(wèi)o?回環(huán)接口,可以通過(guò)localhost來(lái)完成通信。

同節(jié)點(diǎn)上的 pod 間通信

當(dāng)我們將curl?容器和httpbin?分別在兩個(gè) pod 中運(yùn)行,這兩個(gè) pod 有可能調(diào)度到同一個(gè)節(jié)點(diǎn)上。curl?發(fā)出的請(qǐng)求根據(jù)容器內(nèi)的路由表到達(dá)了 pod 內(nèi)的eth0?接口。然后通過(guò)與eth0?相連的隧道veth1到達(dá)節(jié)點(diǎn)的根網(wǎng)絡(luò)空間。

veth1?通過(guò)網(wǎng)橋cni0?與其他 pod 相連虛擬以太接口vethX?相連,網(wǎng)橋會(huì)詢問(wèn)所有相連的接口是否擁有原始請(qǐng)求中的 IP 地址(比如這里的10.42.1.9?)。收到響應(yīng)后,網(wǎng)橋會(huì)記錄映射信息(10.42.1.9?=>veth0?),同時(shí)將數(shù)據(jù)轉(zhuǎn)發(fā)過(guò)去。最終數(shù)據(jù)經(jīng)過(guò)veth0?隧道進(jìn)入 podhttpbin中。

不同節(jié)點(diǎn)的 pod 間通信

跨節(jié)點(diǎn)的 pod 間通信會(huì)復(fù)雜一些,且不同網(wǎng)絡(luò)插件的處理方式不同,這里選擇一種容易理解的方式來(lái)簡(jiǎn)單說(shuō)明下。

前半部分的流程與同節(jié)點(diǎn) pod 間通信類似,當(dāng)請(qǐng)求到達(dá)網(wǎng)橋,網(wǎng)橋詢問(wèn)哪個(gè) pod 擁有該 IP 但是沒(méi)有得到回應(yīng)。流程進(jìn)入主機(jī)的路由尋址過(guò)程,到更高的集群層面。

在集群層面有一張路由表,里面存儲(chǔ)著每個(gè)節(jié)點(diǎn)的 Pod IP 網(wǎng)段(節(jié)點(diǎn)加入到集群時(shí)會(huì)分配一個(gè) Pod 網(wǎng)段(Pod CIDR),比如在 k3s 中默認(rèn)的 Pod CIDR 是10.42.0.0/16?,節(jié)點(diǎn)獲取到的網(wǎng)段是10.42.0.0/24、10.42.1.0/24、10.42.2.0/24,依次類推)。通過(guò)節(jié)點(diǎn)的 Pod IP 網(wǎng)段可以判斷出請(qǐng)求 IP 的節(jié)點(diǎn),然后請(qǐng)求被發(fā)送到該節(jié)點(diǎn)。

總結(jié)

現(xiàn)在應(yīng)該對(duì) Kubernetes 的網(wǎng)絡(luò)通信有初步的了解了吧。

整個(gè)通信的過(guò)程需要各種組件的配合,比如 Pod 網(wǎng)絡(luò)命名空間、pod 以太網(wǎng)接口eth0?、虛擬以太網(wǎng)接口vethX?、網(wǎng)橋(network bridge)cni0等。其中有些組件與 pod 一一對(duì)應(yīng),與 pod 同生命周期。雖然可以通過(guò)手動(dòng)的方式創(chuàng)建、關(guān)聯(lián)和刪除,但對(duì)于 pod 這種非永久性的資源會(huì)被頻繁地創(chuàng)建和銷毀,太多人工的工作也是不現(xiàn)實(shí)的。

實(shí)際上這些工作都是由容器委托給網(wǎng)絡(luò)插件來(lái)完成的,而網(wǎng)絡(luò)插件所遵循的規(guī)范 CNI(Container Network Interface)。

網(wǎng)絡(luò)插件都做了什么?

創(chuàng)建 pod(容器)的網(wǎng)絡(luò)命名空間創(chuàng)建接口創(chuàng)建 veth 對(duì)設(shè)置命名空間網(wǎng)絡(luò)設(shè)置靜態(tài)路由配置以太網(wǎng)橋接器分配 IP 地址創(chuàng)建 NAT 規(guī)則

...

參考

https://www.tigera.io/learn/guides/kubernetes-networking/

https://kubernetes.io/docs/concepts/services-networking/

https://matthewpalmer.net/kubernetes-app-developer/articles/kubernetes-networking-guide-beginners.html

https://learnk8s.io/kubernetes-network-packets

關(guān)鍵詞: 命名空間 網(wǎng)絡(luò)模型 網(wǎng)絡(luò)通信 可以使用

上一篇:

下一篇:

X 關(guān)閉

X 關(guān)閉

<蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>