溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

docker bridge到k8s pod跨節(jié)點網絡通信機制怎么實現

發(fā)布時間:2021-12-13 15:45:34 來源:億速云 閱讀:338 作者:iii 欄目:云計算

這篇文章主要講解了“docker bridge到k8s pod跨節(jié)點網絡通信機制怎么實現”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“docker bridge到k8s pod跨節(jié)點網絡通信機制怎么實現”吧!

1、docker 網絡模式
可以通過如下命令行查看docker網絡模式
[root@localhost ~]# docker network lsNETWORK ID          NAME                 DRIVER              SCOPEc250329fad3c        bridge               bridge              localc7c3d1f77969        compose_extnetwork   bridge              local199b85fbf2fa        host                 host                localb488be9da3d6        none                 null                local
  • 共享主機網絡模式 - host

host指的是共享主機的網絡和端口,但是破壞了 container 的隔離性;

  • 無網絡模式 - none

其中無網絡模式是指加入此模式下的容器都不能通信,比較雞肋;

  • 自定義

自定義主要用于實現DNS解析和服務發(fā)現,特殊場景下定制使用;

  • 默認網絡模式 - bridge

網橋是 docker 默認網絡模式,也是平時用的最多的一種,這里主要對 docker 的 bridge 模式做詳細講解。


2、docker 橋接如何實現同一個宿主機不同容器之間的通信
       其實主要用到兩個技術知識點:
  • docker啟動后建立名為docker0的虛擬網橋。
  • 容器啟動時在主機上創(chuàng)建一對虛擬網卡veth pair設備。這一對虛擬設備完成一組數據完整流通的鏈路,數據從一個設備進入,從另一個設備出來。容器中重命名為eth0,宿主機上的以veth*顯示并插在docker0網橋上??梢酝ㄟ^如下命令查看,docker0上插了 veth52f3f11 和 vethe8589bd 兩張?zhí)摂M設備,見(a)圖。
[root@localhost ~]# brctl showbridge name  bridge id    STP enabled  interfacesbr-c7c3d1f77969    8000.02429160f0dd  no      docker0    8000.02420a13dd3a  no    veth52f3f11                            vethe8589bd
docker bridge到k8s pod跨節(jié)點網絡通信機制怎么實現  
(a)  
那么你可能會有疑問,多個容器之間又是如何通信的呢?如下圖所示:  

docker bridge到k8s pod跨節(jié)點網絡通信機制怎么實現

(b)

其原理也非常簡單,如圖(b)所示,container1 ping container2(172.0.0.3)網絡時,同一宿主機中的兩個容器網絡默認是互通的,其中docker0扮演二層交換機的角色。
通過命令查看container路由信息表,如下所示:
bash-4.4# routeKernel IP routing tableDestination     Gateway         Genmask         Flags Metric Ref    Use Ifacedefault         172.17.0.1      0.0.0.0         UG    0      0        0 eth0172.17.0.0      *               255.255.0.0     U     0      0        0 eth0bash-4.4#
container1 訪問172.17.0.3匹配到第二條路由規(guī)則;網關是0.0.0.0,這是一條直連規(guī)則,意思是匹配到該規(guī)則的網絡地址經過本機eth0網卡,再通過二層網絡doceker0 直接發(fā)送到目的主機。docker0之所以能夠做到從veth虛擬設備中接受數據和發(fā)送數據,是因為veth相當于docker0網橋的從設備,故docker0能夠直接處理來自于veth上網絡數據包,進而直接轉發(fā)到container2,就完成從一個容器到另外一個容器的通信。見(b)圖所示。

如果訪問外部網絡,也非常簡單,數據包先經過docker0網卡,根據宿主機路由規(guī)則連接到eth0網卡,轉發(fā)到外部網絡。見(c)圖所示。

docker bridge到k8s pod跨節(jié)點網絡通信機制怎么實現

(c)

docker 在默認網絡設置情況下,節(jié)點A 的docker0 跟節(jié)點B 的docker0 沒有任何關聯,網絡也是不通的,這就導致不能滿足我們跨節(jié)點通信要求。Kubernetes 的 Pod 又是通過何種方式實現的呢?


3、pod 通信機制

如果要說明 pod 的通信機制,要從一個鏡像說起,在 kubectl 安裝kubernetes 的時候一定會看到 k8s.gcr.io/pause 這個鏡像,不知道有沒有疑問,這個到底是干嘛的?其它幾個鏡像顧名思義,但是這個【暫停】是什么?沒錯,他就是用來 hold 一個 Pod 內部多個 Container 網絡通信。

如果在計算節(jié)點上運行 docker ps 命令
[root@k8s-client1 ~]# docker ps |grep sp-nginxe34adacf9be1        0a81924719d1             "/usr/local/nginx/b…"   3 seconds ago       Up 2 seconds                            k8s_sp_nginx-deployment-84b5d9cb66-hkfp6_default_5c27af26-6b7e-11ea-8d03-70fd45ac3f1f_0f245174b9a51        0a81924719d1             "/usr/local/nginx/b…"   5 seconds ago       Up 4 seconds                            k8s_sp_nginx-deployment-84b5d9cb66-zfbhr_default_5c281ef0-6b7e-11ea-8d03-70fd45ac3f1f_0

如上所示,你可以看到在創(chuàng)建 nginx pod 過程中,不僅創(chuàng)建了一個nginx 容器,并附帶了一個 pause 容器,而且 pause 容器是在 nginx容器之前創(chuàng)建的,這個被暫停的容器把所有的容器收納到一起,一個基礎容器,唯一目的就是保存所有的命名空間。容器中 pod 共享同一個 IP 地址。故同一個 Pod 中 Container 可以做到直接通過 localhost 直接通信,那么同一個節(jié)點多個 Pod 之間如何通信的呢?

docker bridge到k8s pod跨節(jié)點網絡通信機制怎么實現

(d)

pause 容器啟動之前,會為容器創(chuàng)建虛擬一對 ethernet 接口,一個保留在宿主機 vethxxx(插在網橋上),一個保留在容器網絡命名空間內,并重命名為eth0。兩個虛擬接口的兩端,從一端進入,另一端出來。任何 Pod 連接到該網橋的 Pod 都可以收發(fā)數據。如(d)圖所示。



 4、跨 node pod 通信  

跨節(jié)點 Pod 通信,相當于創(chuàng)建一個整個集群公用的【 網橋 】然后把集群中所有的 Pod 連接起來,就可以通信了。

docker bridge到k8s pod跨節(jié)點網絡通信機制怎么實現

(e)

其中跨整個集群的 Pod ip 是唯一的,當報文從一個節(jié)點轉發(fā)到另外一個節(jié)點時,報文首先通過 veth,然后通過網橋,轉發(fā)到物理適配器網卡,最后轉發(fā)到其它節(jié)點的虛擬網橋,進而到達 veth 目標容器。如(e)圖所示。
其實現方式有 Flannel、calico、weave 等。
注意 k8s 的網橋跟 docker0  網橋功能類似,但是 k8s 并沒有復用 docker0 網橋,其原因是   Kubernetes 為了連接 infra 容器更加方便,而是重新實現了 CNI 網絡接口功能,它允許網絡插件使用 CNI 接口,比如 flannel,它本身實現也經過幾個過程,其本質上來說,是基于「隧道」機制實現。示意圖(f)所示:

docker bridge到k8s pod跨節(jié)點網絡通信機制怎么實現

(f)

感謝各位的閱讀,以上就是“docker bridge到k8s pod跨節(jié)點網絡通信機制怎么實現”的內容了,經過本文的學習后,相信大家對docker bridge到k8s pod跨節(jié)點網絡通信機制怎么實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI