溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

K8s網(wǎng)絡(luò)組件Flannel的介紹和部署

發(fā)布時(shí)間:2020-06-18 15:06:25 來源:億速云 閱讀:5580 作者:元一 欄目:系統(tǒng)運(yùn)維

Flannel
flannel是一個(gè)網(wǎng)絡(luò)組件,可以為不同node節(jié)點(diǎn)的分配不同的子網(wǎng),實(shí)現(xiàn)容器間的跨機(jī)通信,從而實(shí)現(xiàn)整個(gè)kubenets層級(jí)通信。 由此可知,該組件運(yùn)行于node節(jié)點(diǎn)上,依賴組件為etcd,docker。

其實(shí)k8s網(wǎng)絡(luò)組件flannel和calico主要解決的問題是k8s節(jié)點(diǎn)之間容器網(wǎng)絡(luò)的通信,flannel要保證每個(gè)pod的IP是唯一的,怎么保證是唯一的,大部分組件的做法是在每個(gè)Node上分配一個(gè)唯一的子網(wǎng),node1是一個(gè)單獨(dú)的子網(wǎng),node2是一個(gè)單獨(dú)的子網(wǎng),可以理解是不同網(wǎng)段,不同vlan,所以每個(gè)節(jié)點(diǎn)都是一個(gè)子網(wǎng),所以flannel會(huì)預(yù)先設(shè)置一個(gè)大的子網(wǎng),然后在這個(gè)每個(gè)node上分配子網(wǎng),這些信息都會(huì)由flannel存儲(chǔ)到etcd中,并且每個(gè)子網(wǎng)綁定到node上都有關(guān)系記錄的,然后方便下次進(jìn)行二次的數(shù)據(jù)包傳輸,并且flannel在node上會(huì)啟動(dòng)一個(gè)守護(hù)進(jìn)程并運(yùn)行,守護(hù)進(jìn)程主要維護(hù)的是本地的路由規(guī)則,和維護(hù)etcd中的信息。

1、Flannel 部署

 https://github.com/coreos/flannel 
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

部署好之后會(huì)以daemonset的形式在每個(gè)node上啟動(dòng)一個(gè)pod,來啟動(dòng)一個(gè)flannel的守護(hù)進(jìn)程,主要負(fù)責(zé)本機(jī)路由表的設(shè)定和etcd中的數(shù)據(jù),本地的子網(wǎng)上報(bào)到etcd中,所以守護(hù)進(jìn)程是非常重要的
可以在flannel的配置文件去設(shè)定大的子網(wǎng),還有屬性模式

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

---

這個(gè)配置完之后會(huì)放到cni這個(gè)目錄下,由于flannel是使用網(wǎng)橋的模式,實(shí)現(xiàn)的同節(jié)點(diǎn)數(shù)據(jù)包到達(dá)宿主機(jī)這個(gè)的通信,所以子網(wǎng)信息并沒寫到這個(gè)配置文件里,而是放到了這個(gè) cat /var/run/flannel/subnet.env 下,這個(gè)通過ip a也能看到設(shè)備分配的ip,每個(gè)節(jié)點(diǎn)都會(huì)分配一個(gè)子網(wǎng),網(wǎng)絡(luò)接口設(shè)備為cni0,也就是一個(gè)node上可以分配255個(gè)小的子網(wǎng)

[root@k8s-node2 ~]# cat /var/run/flannel/subnet.env 
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

還有一個(gè)cni的二進(jìn)制文件, /opt/cni/bin,這個(gè)就是kubelet調(diào)用這個(gè)二進(jìn)制接口為創(chuàng)建的每個(gè)pod創(chuàng)建網(wǎng)絡(luò)信息,并且是從我們的配置的子網(wǎng)中去拿IP

配置的話修改的是就是預(yù)先設(shè)定它的子網(wǎng),以及工作模式,另外就是這個(gè)網(wǎng)絡(luò)不能與k8s本身的內(nèi)網(wǎng)沖突,否則導(dǎo)致網(wǎng)絡(luò)不通的狀況

2、 Flannel工作模式及原理
Flannel支持多種數(shù)據(jù)轉(zhuǎn)發(fā)方式:
UDP:最早支持的一種方式,由于性能最差,目前已經(jīng)棄用。
VXLAN:Overlay Network方案,源數(shù)據(jù)包封裝在另一種網(wǎng)絡(luò)包里面進(jìn)行路由轉(zhuǎn)發(fā)和通信
這也是網(wǎng)絡(luò)的虛擬化技術(shù),也就是原來是有一個(gè)包數(shù)據(jù)包,有源IP和目的IP,但由于某些情況這個(gè)數(shù)據(jù)包到達(dá)不了目的地址上,這可能就會(huì)借助物理上的以太網(wǎng)網(wǎng)絡(luò)進(jìn)行封裝一個(gè)數(shù)據(jù)包帶上,然后通過這種物理網(wǎng)絡(luò)傳輸?shù)侥康牡刂飞?,這是一種疊加式的網(wǎng)絡(luò),里面是有兩種數(shù)據(jù)包的,這種也叫做隧道方案
Host-GW:Flannel通過在各個(gè)節(jié)點(diǎn)上的Agent進(jìn)程,將容器網(wǎng)絡(luò)的路由信息刷到主機(jī)的路由表上,這樣一來所有的主機(jī)都有整個(gè)容器網(wǎng)絡(luò)的路由數(shù)據(jù)了,這樣它就知道這個(gè)數(shù)據(jù)包到達(dá)這個(gè)節(jié)點(diǎn)轉(zhuǎn)發(fā)到這個(gè)機(jī)器上,也就是路由表之間轉(zhuǎn)發(fā)的,這種也叫路由方案
VXLAN

使用kubeadm部署的話默認(rèn)是支持的

kubeadm部署指定Pod網(wǎng)段
kubeadm init --pod-network-cidr=10.244.0.0/16

但是使用二進(jìn)制部署就得去啟動(dòng)cni的支持,默認(rèn)我ansible部署的k8s集群都是啟動(dòng)的
二進(jìn)制部署指定

cat /opt/kubernetes/cfg/kube-controller-manager.conf
--allocate-node-cidrs=true \     允許node自動(dòng)分配cidr這個(gè)網(wǎng)絡(luò)
--cluster-cidr=10.244.0.0/16 \   指定pod網(wǎng)絡(luò)的網(wǎng)段,這個(gè)網(wǎng)段要和flannel的網(wǎng)段對(duì)應(yīng)上

另外也都要在每個(gè)node節(jié)點(diǎn)的kubelet的配置文件上進(jìn)行對(duì)cni的支持

[root@k8s-node1 ~]# cat /opt/kubernetes/cfg/kubelet.conf 
--network-plugin=cni \

這樣的話就能以cni的標(biāo)準(zhǔn)來為k8s配置網(wǎng)絡(luò)

kube-flannel.yml
net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

在節(jié)點(diǎn)1上有個(gè)容器,與節(jié)點(diǎn)2上的容器進(jìn)行通信,這兩個(gè)是進(jìn)行跨主機(jī)進(jìn)行的通信,如果本機(jī)通信之間使用網(wǎng)橋使用二層的傳輸了,像原生的docker網(wǎng)就能解決了,最重要的是這兩個(gè)節(jié)點(diǎn)的數(shù)據(jù)包傳輸

flannel保證每個(gè)node都是唯一的ip,它是在每個(gè)node上都分配一個(gè)子網(wǎng)
可以看到flannel是基于宿主機(jī)創(chuàng)建的,它會(huì)為每個(gè)node創(chuàng)建獨(dú)立的子網(wǎng),并為當(dāng)前pod分配ip

[root@k8s-master1 ~]# kubectl get pod -n kube-system -o wide
kube-flannel-ds-amd64-4jjmm           1/1     Running   0          14d   10.4.7.11     k8s-master1   <none>           <none>
kube-flannel-ds-amd64-9f9vq           1/1     Running   0          14d   10.4.7.21     k8s-node2     <none>           <none>
kube-flannel-ds-amd64-gcf9s           1/1     Running   0          14d   10.4.7.12     k8s-node1     <none>           <none>

為了能夠在二層網(wǎng)絡(luò)上打通“隧道”,VXLAN 會(huì)在宿主機(jī)上設(shè)置一個(gè)特殊的網(wǎng)絡(luò)設(shè)備作為“隧道”的兩端。這個(gè)設(shè)備就叫作 VTEP,即:VXLAN Tunnel End Point(虛擬隧道端點(diǎn))。下圖flannel.1的設(shè)備就是VXLAN所需的VTEP設(shè)備。示意圖如下:
K8s網(wǎng)絡(luò)組件Flannel的介紹和部署

vxlan是怎么工作的?
vxlan是Linux上支持的一個(gè)隧道的技術(shù),隧道也就是點(diǎn)到點(diǎn),端到端的兩個(gè)設(shè)備的通信,其實(shí)vxlan實(shí)現(xiàn)是有一個(gè)vtep的設(shè)備做數(shù)據(jù)包的封裝與解封裝,而現(xiàn)在已經(jīng)封裝到flannel.1這個(gè)進(jìn)程里面了,也就是這個(gè)虛擬網(wǎng)卡包含了veth來去使用對(duì)這個(gè)vxlan進(jìn)行封裝和解封裝。

現(xiàn)在是Node1節(jié)點(diǎn)上的pod 1是1.10,現(xiàn)在要與Node2節(jié)點(diǎn)上的pod 2的2.10進(jìn)行通信,他們是不在一個(gè)網(wǎng)絡(luò)的,當(dāng)這個(gè)數(shù)據(jù)包發(fā)出去的時(shí)候,pod1 的容器的網(wǎng)卡eth0,先出這個(gè)網(wǎng)卡,然后會(huì)連接這個(gè)veth這個(gè)好比就是一個(gè)網(wǎng)線,etch0是一頭,veth是一頭,也就是veth是這個(gè)設(shè)備的另一頭,
這個(gè)veth是在宿主機(jī)上,那么這個(gè)宿主機(jī)就拿到了這個(gè)容器的數(shù)據(jù)包,然后這個(gè)數(shù)據(jù)包到達(dá)這個(gè)網(wǎng)橋上面,這個(gè)網(wǎng)橋也好比一個(gè)二層的交換機(jī),所有的容器都會(huì)加入到這個(gè)網(wǎng)橋里面,可以通過yum -y install bridge-utils看到veth的另一端是不是加入到cni的網(wǎng)橋中,這個(gè)網(wǎng)橋就是flannel創(chuàng)建的,并且這個(gè)網(wǎng)橋有獨(dú)立的mac地址和IP都可以看到

[root@k8s-node2 ~]# brctl show cni0
bridge name bridge id       STP enabled interfaces
cni0        8000.4a025e87aa87   no      veth08925d5a
                            veth3591a36f
                            veth776a1e86
                            veth718beeac
                            veth81dadcbd
                            veth8a96f11c
                            veth8c90fdb6
                            veth8f350182
                            veth90818f0b
                            vetha471152b

這個(gè)就是當(dāng)我們創(chuàng)建好pod的時(shí)候由flannel去分配并加入這個(gè)網(wǎng)橋中的,這個(gè)后面有個(gè)interfaces有這個(gè)接口,這個(gè)相當(dāng)于交換機(jī)的接口,這正是宿主機(jī)上的虛擬網(wǎng)卡,如果本地的話,直接走這個(gè)網(wǎng)橋就能直接找到了,然后就可以發(fā)送一個(gè)ARP廣播包進(jìn)行封包傳輸了,cni0就相當(dāng)于一個(gè)二層交換機(jī),幫你擴(kuò)散,找目的的mac進(jìn)行響應(yīng),所以說同節(jié)點(diǎn)就可以直接走網(wǎng)橋這個(gè),那么這個(gè)目的地址不在這個(gè)網(wǎng)橋里面,就像2.10,當(dāng)前的node是不知道2.10上的pod在哪,那么它只能走路由表了,也就是它它不一定目的地址的時(shí)候就會(huì)走默認(rèn)網(wǎng)關(guān),所以flannel會(huì)在宿主機(jī)上生成很多路由表通過ip router可以看到

[root@k8s-node2 ~]# ip route 
default via 10.4.7.1 dev eth0 proto static metric 100 
10.4.7.0/24 dev eth0 proto kernel scope link src 10.4.7.21 metric /
10.244.0.0/24 dev cni0 proto kernel scope link src 10.244.0.1  /
10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink /
10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink /
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 

部署docker生成的路由表,這里的docker0網(wǎng)橋是沒有用到,當(dāng)部署flannel的時(shí)候是默認(rèn)使用的是自己的網(wǎng)橋,這個(gè)的原理和flannel的是一樣的,只不過flannel用的是自己做的,也是為了方便自己處理數(shù)據(jù)包

這里的路由表都記錄下來了,它會(huì)找哪個(gè)是目的地址2.10pod2的IP地址,所以它會(huì)根據(jù)這個(gè)路由表,然后發(fā)送到flannel的這個(gè)設(shè)備上,這個(gè)flannel是采用vxlan的模式,vxlan需要veth的數(shù)據(jù)封裝與解封裝,所以flannel就把這個(gè)數(shù)據(jù)包交給vxlan,而vxlan是一個(gè)內(nèi)核級(jí)的驅(qū)動(dòng)程序,有它去封裝這個(gè)包,因?yàn)関xlan本身是工作在二層的,它還需要目的的mac地址

那么就可以通過ip neigh show dev flannel.1去查看mac地址

 [root@k8s-node2 ~]# ip neigh show dev flannel.1
10.244.2.0 lladdr ea:ca:d6:62:be:21 PERMANENT
10.244.1.0 lladdr 4e:e3:fa:5f:d2:34 PERMANENT

而flannel.1的vxlan實(shí)現(xiàn)是有一個(gè)vtep的設(shè)備做數(shù)據(jù)包的封裝與解封裝,因?yàn)樗?層進(jìn)行封包,就要知道目的的mac地址,那么這個(gè)目的mac就由flannel去提供給vetp,flannel去存儲(chǔ)對(duì)應(yīng)下一跳的網(wǎng)關(guān),那么這個(gè)網(wǎng)關(guān)肯定不是在本地,當(dāng)我們拿到目的的mac地址之后你們就封裝成一個(gè)完整的幀,那么封裝好之后,對(duì)于宿主機(jī)沒有太多的實(shí)際意義,因?yàn)檫@個(gè)數(shù)據(jù)包幀發(fā)不出去,要是按二層的走肯定到不了另外一個(gè)節(jié)點(diǎn),因?yàn)樵诓煌淖泳W(wǎng)里面,如果沒有路由的介入肯定是通信不了的,接下來就需要linux內(nèi)核的數(shù)據(jù)幀封裝一個(gè)宿主機(jī)普通的數(shù)據(jù)幀,也就是udp封裝一個(gè)普通的數(shù)據(jù)幀,也就是在這之上再加一層udp的包,這樣做的目的能讓數(shù)據(jù)包直接傳輸?shù)侥康娜萜鞯闹鳈C(jī)上。
K8s網(wǎng)絡(luò)組件Flannel的介紹和部署
vxlan是使用的udp協(xié)議,它會(huì)將原始的報(bào)文放在內(nèi)部,而外部由udp封裝的源IP與目的地址

[root@k8s-master1 ~]# bridge fdb show  dev flannel.1
a6:a4:e5:5d:19:9b dst 10.4.7.21 self permanent
ea:ca:d6:62:be:21 dst 10.4.7.12 self permanent

可以看到,上面用的對(duì)方flannel.1的MAC地址對(duì)應(yīng)宿主機(jī)IP,也就是UDP要發(fā)往的目的地。使用這個(gè)目的IP進(jìn)行封裝。
也就是這些flannel都是知道的,為什么說flannel維護(hù)這etcd的數(shù)據(jù),守護(hù)本地的路由規(guī)則,其實(shí)etcd的數(shù)據(jù)要和flannel,把它當(dāng)前的數(shù)據(jù)寫到etcd中,由各個(gè)節(jié)點(diǎn)都存儲(chǔ)一份,所以根據(jù)這個(gè)地址拿到了mac地址,然后這又是一個(gè)完整的包,由vxlan封裝的udp的包,這個(gè)udp包里面就有兩個(gè)IP包的存在,udp就直接能發(fā)送到node2的節(jié)點(diǎn)上,數(shù)據(jù)包已經(jīng)傳輸過去了,因?yàn)樗拗鳈C(jī)之間是同網(wǎng)段的,到達(dá)31.63上之后,接收到udp的包之后,會(huì)進(jìn)行拆分,解包會(huì)將原始的包拿出來,所以這里就有一個(gè)vxlan的標(biāo)記,本身flannel是由vtep處理的,所以在封包的時(shí)候?qū)χ砂蛄藗€(gè)標(biāo)記,也就是vxlan header的標(biāo)記,首先打上vxlan的頭部,那么這就意味著這就是一個(gè)vxlan的數(shù)據(jù)包,并且加了一個(gè)VNI的編號(hào),VNI是為了區(qū)分vxlan的點(diǎn)對(duì)點(diǎn)隧道,多個(gè)數(shù)據(jù)包也是分外多個(gè)編號(hào),也是為了區(qū)分,而這個(gè)編號(hào)被flannel引用到了,所以這是內(nèi)部的一個(gè)編號(hào),確認(rèn)這個(gè)數(shù)據(jù)包無誤,然后交給flannel.1這個(gè)設(shè)備,它處理這個(gè)數(shù)據(jù)包,拿到了源IP和目的IP,而去判斷,會(huì)發(fā)現(xiàn)這個(gè)是cni網(wǎng)橋的,所以它根據(jù)路由表放到了cni網(wǎng)橋,根據(jù)這個(gè)路由表拆分這個(gè)目的地址,正好這個(gè)目的地址匹配到了,所以它會(huì)將這個(gè)轉(zhuǎn)發(fā)到cni網(wǎng)橋里,到cni就跟之前一樣了,就相當(dāng)于一個(gè)二層交換機(jī),拿到這個(gè)數(shù)據(jù)包,它會(huì)進(jìn)行一個(gè)ARP的廣播,發(fā)現(xiàn)正在這個(gè)網(wǎng)橋里面,然后就進(jìn)行數(shù)據(jù)包的轉(zhuǎn)發(fā)了。

從此看來;vxlan使用重疊網(wǎng)絡(luò),進(jìn)行封包解封包,性能就下降了很多

小結(jié):

  1. 容器路由:容器根據(jù)路由表從eth0發(fā)出
    / # ip route
    default via 10.244.0.1 dev eth0 
    10.244.0.0/24 dev eth0 scope link  src 10.244.0.45 
    10.244.0.0/16 via 10.244.0.1 dev eth0 
  2. 主機(jī)路由:數(shù)據(jù)包進(jìn)入到宿主機(jī)虛擬網(wǎng)卡cni0,根據(jù)路由表轉(zhuǎn)發(fā)到flannel.1虛擬網(wǎng)卡,也就是,來到了隧道的入口。
    ip route
    default via 192.168.31.1 dev ens33 proto static metric 100 
    10.244.0.0/24 dev cni0 proto kernel scope link src 10.244.0.1 
    10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink 
    10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink 
  3. VXLAN封裝:而這些VTEP設(shè)備(二層)之間組成二層網(wǎng)絡(luò)必須要知道目的MAC地址。這個(gè)MAC地址從哪獲取到呢?其實(shí)在flanneld進(jìn)程啟動(dòng)后,就會(huì)自動(dòng)添加其他節(jié)點(diǎn)ARP記錄,可以通過ip命令查看,如下所示:
ip neigh show dev flannel.1
10.244.1.0 lladdr ca:2a:a4:59:b6:55 PERMANENT
10.244.2.0 lladdr d2:d0:1b:a7:a9:cd PERMANENT
  1. 二次封包:知道了目的MAC地址,封裝二層數(shù)據(jù)幀(容器源IP和目的IP)后,對(duì)于宿主機(jī)網(wǎng)絡(luò)來說這個(gè)幀并沒有什么實(shí)際意義。接下來,Linux內(nèi)核還要把這個(gè)數(shù)據(jù)幀進(jìn)一步封裝成為宿主機(jī)網(wǎng)絡(luò)的一個(gè)普通數(shù)據(jù)幀,好讓它載著內(nèi)部數(shù)據(jù)幀,通過宿主機(jī)的eth0網(wǎng)卡進(jìn)行傳輸。
  2. 封裝到UDP包發(fā)出去:現(xiàn)在能直接發(fā)UDP包嘛?到目前為止,我們只知道另一端的flannel.1設(shè)備的MAC地址,卻不知道對(duì)應(yīng)的宿主機(jī)地址是什么。
    flanneld進(jìn)程也維護(hù)著一個(gè)叫做FDB的轉(zhuǎn)發(fā)數(shù)據(jù)庫,可以通過bridge fdb命令查看:

    bridge fdb show  dev flannel.1
    
    d2:d0:1b:a7:a9:cd dst 192.168.31.61 self permanent
    ca:2a:a4:59:b6:55 dst 192.168.31.63 self permanent

    可以看到,上面用的對(duì)方flannel.1的MAC地址對(duì)應(yīng)宿主機(jī)IP,也就是UDP要發(fā)往的目的地。使用這個(gè)目的IP進(jìn)行封裝。

  3. 數(shù)據(jù)包到達(dá)目的宿主機(jī):Node1的eth0網(wǎng)卡發(fā)出去,發(fā)現(xiàn)是VXLAN數(shù)據(jù)包,把它交給flannel.1設(shè)備。flannel.1設(shè)備則會(huì)進(jìn)一步拆包,取出原始二層數(shù)據(jù)幀包,發(fā)送ARP請(qǐng)求,經(jīng)由cni0網(wǎng)橋轉(zhuǎn)發(fā)給container。

Host-GW
host-gw模式相比vxlan簡單了許多, 直接添加路由,將目的主機(jī)當(dāng)做網(wǎng)關(guān),直接路由原始封包。
切換成host-gw的模式,上面的轉(zhuǎn)發(fā)還是一樣,pod1容器的網(wǎng)卡先連接veth到宿主機(jī)上,然后到達(dá)cni0的網(wǎng)橋上,這個(gè)網(wǎng)橋就相當(dāng)于一個(gè)二層的交換機(jī),這個(gè)數(shù)據(jù)包到cni的網(wǎng)橋之后,也就是到達(dá)宿主機(jī)上,那么宿主機(jī)的網(wǎng)絡(luò)協(xié)議棧會(huì)根據(jù)路由表決定轉(zhuǎn)發(fā)到哪個(gè)網(wǎng)關(guān)上,因?yàn)樗哪康腎P地址不是同網(wǎng)段的,肯定走路由表,它會(huì)根據(jù)路由表判斷目的地址是2.10,也就是來自這個(gè)數(shù)據(jù)的數(shù)據(jù)包轉(zhuǎn)發(fā)到了它的下一跳,也就是網(wǎng)關(guān),通過接口之間轉(zhuǎn)發(fā)到31.63上了,也就是直接安照宿主機(jī)的網(wǎng)絡(luò),因?yàn)檫@個(gè)數(shù)據(jù)包是宿主機(jī)處理的,所以宿主機(jī)要想訪問31.63,會(huì)進(jìn)行重新封包,目的地址就是31.63,它判斷了31.63下一跳的網(wǎng)關(guān)是同一子網(wǎng),而且是二層的傳輸,二層的傳輸又需要獲取到目的的mac地址,如果它本地不知道31.63的mac地址的話,它會(huì)發(fā)送一個(gè)ARP廣播包,知道了對(duì)方的mac就進(jìn)行封包,所以經(jīng)過二層的傳輸?shù)竭_(dá)31.63,31.63收到之后數(shù)據(jù)包之后,它又會(huì)去判斷路由表了,然后進(jìn)入cni的網(wǎng)橋,二層又轉(zhuǎn)發(fā)到了容器里面。

最重要兩條,host-gw是把每個(gè)節(jié)點(diǎn)都當(dāng)成一個(gè)網(wǎng)關(guān),它會(huì)加入其他節(jié)點(diǎn)并設(shè)成網(wǎng)關(guān),當(dāng)數(shù)據(jù)包到達(dá)這個(gè)節(jié)點(diǎn)的時(shí)候,就根據(jù)路由表之間發(fā)送到下一跳了,也就是節(jié)點(diǎn)IP,這個(gè)都是同網(wǎng)段的IP,直接通過2層之間把這個(gè)數(shù)據(jù),轉(zhuǎn)發(fā)到另一個(gè)節(jié)點(diǎn)上,另一個(gè)節(jié)點(diǎn)再根據(jù)另一條規(guī)則,根據(jù)目的的地址轉(zhuǎn)發(fā)到cni網(wǎng)橋,cni網(wǎng)橋根據(jù)2層又轉(zhuǎn)發(fā)到容器里面,一個(gè)是數(shù)據(jù)的流入,就是當(dāng)數(shù)據(jù)包到達(dá)這個(gè)節(jié)點(diǎn)之后,然后發(fā)給誰,這是流入數(shù)據(jù)包,一個(gè)是數(shù)據(jù)包的流出,當(dāng)從節(jié)點(diǎn)出來的數(shù)據(jù)包,應(yīng)該轉(zhuǎn)發(fā)到哪個(gè)node上,這些都是由flannel去維護(hù)的
這個(gè)的局限是每個(gè)node在2層都能通,否則下一跳轉(zhuǎn)發(fā)不過去,但是它的性能要比vxlan的性能高很多,不需要封包解封包,這種接近原生,性能也是最好的

下面是示意圖:
K8s網(wǎng)絡(luò)組件Flannel的介紹和部署

kube-flannel.yml

net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "host-gw"
      }
    }

看名字就能看出hots-gw它把目的的主機(jī)當(dāng)作網(wǎng)關(guān),直接路由原始的封包
將vxlan切換成host-gw的模式,重建之后可以看到路由表發(fā)生變化,切換的時(shí)候也會(huì)對(duì)網(wǎng)絡(luò)進(jìn)行影響,一般是在夜深人靜的時(shí)候去做

之前的路由表都是通過flannel.1去轉(zhuǎn)發(fā)到設(shè)備上,也就是使用host-gw,flannel.1這個(gè)設(shè)備就不用了,所以就不會(huì)用vxlan進(jìn)行去封包了
當(dāng)你設(shè)置flannel使用host-gw模式,flanneld會(huì)在宿主機(jī)上創(chuàng)建節(jié)點(diǎn)的路由表:

ip route

default via 192.168.31.1 dev ens33 proto static metric 100 
10.244.0.0/24 dev cni0 proto kernel scope link src 10.244.0.1 
10.244.1.0/24 via 192.168.31.63 dev ens33 
10.244.2.0/24 via 192.168.31.61 dev ens33 
192.168.31.0/24 dev ens33 proto kernel scope link src 192.168.31.62 metric 100

目的 IP 地址屬于 10.244.1.0/24 網(wǎng)段的 IP 包,應(yīng)該經(jīng)過本機(jī)的 eth0 設(shè)備發(fā)出去(即:dev eth0);并且,它下一跳地址是 192.168.31.63(即:via 192.168.31.63)。
一旦配置了下一跳地址,那么接下來,當(dāng) IP 包從網(wǎng)絡(luò)層進(jìn)入鏈路層封裝成幀的時(shí)候,eth0 設(shè)備就會(huì)使用下一跳地址對(duì)應(yīng)的 MAC 地址,作為該數(shù)據(jù)幀的目的 MAC 地址。
而 Node 2 的內(nèi)核網(wǎng)絡(luò)棧從二層數(shù)據(jù)幀里拿到 IP 包后,會(huì)“看到”這個(gè) IP 包的目的 IP 地址是 10.244.1.20,即 container-2 的 IP 地址。這時(shí)候,根據(jù) Node 2 上的路由表,該目的地址會(huì)匹配到第二條路由規(guī)則(也就是 10.244.1.0 對(duì)應(yīng)的路由規(guī)則),從而進(jìn)入 cni0 網(wǎng)橋,進(jìn)而進(jìn)入到 container-2 當(dāng)中。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI