91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

k8s容器互聯flannel?vxlan通信原理是什么

發布時間:2023-04-08 16:21:40 來源:億速云 閱讀:86 作者:iii 欄目:開發技術

這篇文章主要介紹“k8s容器互聯flannel vxlan通信原理是什么”,在日常操作中,相信很多人在k8s容器互聯flannel vxlan通信原理是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”k8s容器互聯flannel vxlan通信原理是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

vxlan 模式通信原理

flannel 在為不同主機的pod分配ip地址的時候,會在一個大的網段范圍內分配ip地址,而同一臺主機上的pod,則是在大的網段下延伸出一個較小的子網,同一臺主機上的ip地址則是在較小的子網范圍內去進行分配。

例如k8s啟動flannel插件時,會通過flannel的配置文件指定大的網段的范圍和flannel啟動方式,我們選用的是vxlan模式

  net-conf.json: |
    {
      "Network": "10.10.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

這樣整個集群的ip地址就是在10.10.0.0/16 網段去進行分配。 而各個主機上的ip地址范圍 則是在例如10.10.1.0/24 ,10.10.2.0/24這樣的網段去進行分配。

跨主機通信的目的,就是讓主機A上的網段10.10.1.0/24 內分配的ip能夠ping通主機B上的 10.10.2.0/24 網段分配的ip。

flannel的xvlan模式是如何辦到的呢?

為了更好的理解vxlan的模式,我搭建了一個真實的3節點集群環境,然后實際的去主機上分析vxlan工作模式

集群網絡模型

集群有3個節點:

master 集群的控制節點,ip地址是 192.168.2.17;

worker1 工作節點 ip地址是 192.168.2.16;

worker2 工作節點 ip 地址是 192.168.2.15 ;

由于工作節點才承擔具體的pod承載認為,所以我們只看工作節點即可。

這里先放一張集群網絡模型的圖,接下來的分析都將會根據這個圖一步步分析網絡包時如何從worker2 的pod到達到worker1的pod的。

k8s容器互聯flannel?vxlan通信原理是什么

查看worker2網絡設備類型

查看網絡接口有哪些

parallels@worker2:~/Desktop$ ifconfig
cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.10.2.1  netmask 255.255.255.0  broadcast 10.10.2.255
       ...
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:41:ce:a9:49  txqueuelen 0  (Ethernet)
        ...
enp0s5: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.15  netmask 255.255.255.0  broadcast 192.168.2.255
        ...
flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.10.2.0  netmask 255.255.255.255  broadcast 0.0.0.0
        inet6 fe80::647c:5aff:fe24:c42e  prefixlen 64  scopeid 0x20<link>
        ether 66:7c:5a:24:c4:2e  txqueuelen 0  (Ethernet)
        ...
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        ...
veth9c0a9a53: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet6 fe80::fc7d:fdff:fe6f:a32e  prefixlen 64  scopeid 0x20<link>
        ether fe:7d:fd:6f:a3:2e  txqueuelen 0  (Ethernet)
        ...
vethd6f08999: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet6 fe80::68b2:41ff:fee2:9074  prefixlen 64  scopeid 0x20<link>
        ether 6a:b2:41:e2:90:74  txqueuelen 0  (Ethernet)
        ...

k8s 在主上創建一個cni0和flannel.1的虛擬網絡設備,cni0是網橋類型的設備,flannel.1是vxlan類型的設備 (準確的說是vtep設備,在vxlan模式下,我們將這個封包解包的設備叫做vtep設備VXLAN Tunnel Endpoints)。

記下這里worker2節點上cni0的ip地址10.10.2.1 ,flannel.1的ip地址 10.10.2.0

parallels@worker2:~/Desktop$ ethtool -i flannel.1
driver: vxlan
...
parallels@worker2:~/Desktop$ ethtool -i cni0
driver: bridge
...

先看下網橋的作用(vxlan設備作用稍后進行分析) 網橋擁有交換機的作用。

我們知道,在同一臺主機上,不同pod的網絡命名空間是不同的,在linux上有一種veth的虛擬網絡設備,它是成對出現的,所以也被叫做veth pair,可以連接不同命名空間。

從veth一端發出去的包能夠被另外一端接收到,通過veth pair能夠連通兩個命名空間。

但是如果一臺主機上,有許多pod,要想讓那么多pod都連通的話,就得兩兩建立veth pair設備,這樣的排列組合數量隨著pod的增加會變得相當大。

而網橋的出現能夠讓這個網絡模型變成 veth pair的一端連通著pod的網絡命名空間,一端是連接在網橋上,讓網橋充當交換機的作用,同一臺主機的不同pod的數據包都經過網橋去進行轉發。

交換機是工作在網絡的第二層,所以只會將數據包解析到數據幀的格式,只認mac地址,如果是廣播幀,轉發給所有接入網橋的設備,如果是單播幀,那么就會發往特定的端口。

但是網橋作為交換機與之不同的一點是,網橋具有將轉發數據包到主機的三層網絡協議棧的功能,如果發往網橋的數據包的mac地址就是網橋自身mac地址的話,那么網橋就會認為數據包是要發往數據的數據包,然后去對其進行轉發。

查看集群pod 信息

再結合 pod 看看pod內部的網絡數據包是如何輸出到網橋上的。我在集群內部啟動了一個3副本的busybox鏡像的 pod。

來看看pod分布的工作節點以及其ip地址

(base) ?  ~ kubectl get pods -o wide
NAME                       READY   STATUS    RESTARTS        AGE     IP          NODE      NOMINATED NODE   READINESS GATES
busybox-8647b8666c-74nmg   1/1     Running   0               3h29m   10.10.1.3   worker1   <none>           <none>
busybox-8647b8666c-bwgh9   1/1     Running   1 (4h39m ago)   12d     10.10.2.4   worker2   <none>           <none>
busybox-8647b8666c-qwzrh   1/1     Running   1 (4h39m ago)   4h67m   10.10.2.5   worker2   <none>           <none>

我們的目的就是讓worker2節點上ip為10.10.2.4 的pod能ping通 worker1節點上ip為10.10.1.3的pod

進入worker2節點上 ip為10.10.2.4 的pod內部看看路由信息。

/ # route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.10.2.1       0.0.0.0         UG    0      0        0 eth0
10.10.0.0       10.10.2.1       255.255.0.0     UG    0      0        0 eth0
10.10.2.0       0.0.0.0         255.255.255.0   U     0      0        0 eth0

還記得剛剛說的worker2節點上的cni0網橋的ip是10.10.2.1 嗎?

通過路由信息,可以看到10.10.2.1正是pod的網關,所以如果在pod內部 ping worker1上的pod ip 10.10.1.3 ,就會匹配上第二條路由信息。

那么worker2 的pod發出去的數據包就指定到達10.10.2.1這個ip上,所以mac地址就是10.10.2.1對應的mac地址,即cni0的mac地址。

正是由于這個原因,觸發了cni0網橋的轉發到主機上的三層網絡協議棧的這個機制,而到達worker2主機后,通過ip要看具體轉發到哪張網卡是看主機的路由信息的,所以,先看下worker2的路由信息。

parallels@worker2:~/Desktop$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.1     0.0.0.0         UG    100    0        0 enp0s5
10.10.0.0       10.10.0.0       255.255.255.0   UG    0      0        0 flannel.1
10.10.1.0       10.10.1.0       255.255.255.0   UG    0      0        0 flannel.1
10.10.2.0       0.0.0.0         255.255.255.0   U     0      0        0 cni0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.2.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s5
192.168.2.1     0.0.0.0         255.255.255.255 UH    100    0        0 enp0s5

我們數據包目的地是worker1上的pod ,ip是10.10.1.3 ,通過路由信息,看到屬于10.10.1.0/24這個網段的數據包都會經過 flannel.1發出,網關是10.10.1.0 ,這個ip也就是對端vtep設備的ip地址

數據包就這樣從worker2的pod來到了worker2節點上的flannel.1 這個網卡上。

flannel.1會對數據包進行一些加工,加工時需要加上對端vtep的mac地址,由于flannel.1 通過路由信息已經知道對端vtep的ip地址,通過查詢本地arp緩存表,得到目的vtep的mac地址。

parallels@worker2:~/Desktop$ ip neigh show dev flannel.1
10.10.1.0 lladdr 72:5a:79:44:22:7b PERMANENT
10.10.0.0 lladdr 62:03:91:cb:cc:36 PERMANENT

k8s是通過flanneld(在flannel插件工作模式下,每個節點上都有一個flanneld的后臺進程,對節點上的一些網絡信息進行配置)在worker2的arp緩存中寫入了mac地址,且永不過期。

同時還會加上vxlan頭部信息,在頭部信息中表明了這是一個vxlan幀,這樣worker1節點收到數據包時,知道這是一個vxlan幀后,會將這個包去進行解包操作,同時頭部信息中也包含一個vni的信息,只有vni相同的網絡設備才有解包的資格。

這樣封裝以后,還需要將這個包發往對端vtep所在的主機節點,怎么發送呢?

worker2的flannel.1用udp格式的數據包再包裹一下vxlan幀,封裝成udp時,需要知道對端的ip地址。

這里封裝成udp包的時候,是如何知道目的節點主機的ip的呢。 flannel.1 通過查詢本機的一個叫做fdb的轉發數據庫獲取目的節點主機的ip。

parallels@worker2:~/Desktop$ bridge fdb show flannel.1 | grep 72:5a:79:44:22:7b
72:5a:79:44:22:7b dev flannel.1 dst 192.168.2.16 self permanent

注意這些配置信息是在woker1節點啟動后,就會在worker2節點自動加上的,而完成配置信息的動作是由各個主機上的flanneld進程完成的

知道了udp的目的ip后,就是一個正常數據包在宿主機上的封包,發送流程了。

這樣,數據包就到達了worker1。

worker1節點的接收過程

worker1 的內核協議棧收到數據包以后,發現有vxlan header以及vni標記是1,就將這個vxlan包發給本機的vni標記也為1的flannel.1設備。

然后flannel.1進行解包,取出數據包的目的ip是10.10.1.3,然后查看worer1本機路由信息。

arallels@worker1:~/Desktop$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.1     0.0.0.0         UG    100    0        0 enp0s5
10.10.0.0       10.10.0.0       255.255.255.0   UG    0      0        0 flannel.1
10.10.1.0       0.0.0.0         255.255.255.0   U     0      0        0 cni0
10.10.2.0       10.10.2.0       255.255.255.0   UG    0      0        0 flannel.1
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.2.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s5
192.168.2.1     0.0.0.0         255.255.255.255 UH    100    0        0 enp0s5
parallels@worker1:~/Desktop$

發現發往10.10.1.0/24這個網段的包要經過cni0網橋,所以flannel.1將解包后的數據包轉發給了cni0網橋。

接下來就是cni0網橋在一個10.10.1.0/24 子網內發送目的ip為 10.10.1.3 的流程了。

cni0網橋先通過10.10.1.3查找本地mac地址,如果有則發往mac地址對應的端口,端口連通的另一端是veth設備也是worker1上的pod的網卡。

如果沒有10.10.1.3的mac地址,則先通過arp協議,在一個局域網內獲得arp響應包后,再發送數據包到對應端口連通的pod veth網卡上。

至此,worker1成功收到了worker2發送的數據包了。

再看flannel xvlan模式

本質上是通過flannel.1這個vxlan設備對主機發出去的數據包進行udp封裝,然后發往經過物理網卡發往對端。

再進一步思考下,udp是可以丟包的,那么經過udp去封裝數據包 的網絡傳輸是可靠的嗎?

答案是不需要可靠,整個flannel的轉發模型,可以看出flannel完成的是網絡模型的第三層次ip層的互通, 這里udp封裝的ip包實際上是充當了第二層鏈路層的工作了,傳輸的可靠性是靠傳輸層實現的,傳輸層的靠是在對應pod所在命名空間中的tcp 的重傳保證的。

到此,關于“k8s容器互聯flannel vxlan通信原理是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

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

AI

苍山县| 德庆县| 尼勒克县| 广丰县| 隆回县| 安阳县| 固始县| 托克逊县| 文昌市| 奉贤区| 韩城市| 开封县| 彩票| 山西省| 新丰县| 奇台县| 绥芬河市| 新津县| 塔城市| 宁武县| 金门县| 治县。| 右玉县| 泰宁县| 大新县| 绵阳市| 固始县| 灌阳县| 赤城县| 泗阳县| 平度市| 卢龙县| 黄平县| 寻甸| 当涂县| 仁化县| 宣恩县| 卫辉市| 麻城市| 甘肃省| 康定县|