k8s网络之Calico网络
Calico 是一種容器之間互通的網(wǎng)絡(luò)方案。在虛擬化平臺(tái)中,比如 OpenStack、Docker 等都需要實(shí)現(xiàn) workloads 之間互連,但同時(shí)也需要對(duì)容器做隔離控制,就像在 Internet 中的服務(wù)僅開(kāi)放80端口、公有云的多租戶一樣,提供隔離和管控機(jī)制。而在多數(shù)的虛擬化平臺(tái)實(shí)現(xiàn)中,通常都使用二層隔離技術(shù)來(lái)實(shí)現(xiàn)容器的網(wǎng)絡(luò),這些二層的技術(shù)有一些弊端,比如需要依賴(lài) VLAN、bridge 和隧道等技術(shù),其中 bridge 帶來(lái)了復(fù)雜性,vlan 隔離和 tunnel 隧道則消耗更多的資源并對(duì)物理環(huán)境有要求,隨著網(wǎng)絡(luò)規(guī)模的增大,整體會(huì)變得越加復(fù)雜。我們嘗試把 Host 當(dāng)作 Internet 中的路由器,同樣使用 BGP 同步路由,并使用 iptables 來(lái)做安全訪問(wèn)策略,最終設(shè)計(jì)出了 Calico 方案。
適用場(chǎng)景:k8s環(huán)境中的pod之間需要隔離
設(shè)計(jì)思想:Calico 不使用隧道或 NAT 來(lái)實(shí)現(xiàn)轉(zhuǎn)發(fā),而是巧妙的把所有二三層流量轉(zhuǎn)換成三層流量,并通過(guò) host 上路由配置完成跨 Host 轉(zhuǎn)發(fā)。
設(shè)計(jì)優(yōu)勢(shì):
1.更優(yōu)的資源利用
二層網(wǎng)絡(luò)通訊需要依賴(lài)廣播消息機(jī)制,廣播消息的開(kāi)銷(xiāo)與 host 的數(shù)量呈指數(shù)級(jí)增長(zhǎng),Calico 使用的三層路由方法,則完全抑制了二層廣播,減少了資源開(kāi)銷(xiāo)。
另外,二層網(wǎng)絡(luò)使用 VLAN 隔離技術(shù),天生有 4096 個(gè)規(guī)格限制,即便可以使用 vxlan 解決,但 vxlan 又帶來(lái)了隧道開(kāi)銷(xiāo)的新問(wèn)題。而 Calico 不使用 vlan 或 vxlan 技術(shù),使資源利用率更高。
2.可擴(kuò)展性
Calico 使用與 Internet 類(lèi)似的方案,Internet 的網(wǎng)絡(luò)比任何數(shù)據(jù)中心都大,Calico 同樣天然具有可擴(kuò)展性。
3.簡(jiǎn)單而更容易 debug
因?yàn)闆](méi)有隧道,意味著 workloads 之間路徑更短更簡(jiǎn)單,配置更少,在 host 上更容易進(jìn)行 debug 調(diào)試。
4.更少的依賴(lài)
Calico 僅依賴(lài)三層路由可達(dá)。
5.可適配性
Calico 較少的依賴(lài)性使它能適配所有 VM、Container、白盒或者混合環(huán)境場(chǎng)景。
2|0Calico架構(gòu)
架構(gòu)圖:
Calico網(wǎng)絡(luò)模型主要工作組件:
1.Felix:運(yùn)行在每一臺(tái) Host 的 agent 進(jìn)程,主要負(fù)責(zé)網(wǎng)絡(luò)接口管理和監(jiān)聽(tīng)、路由、ARP 管理、ACL 管理和同步、狀態(tài)上報(bào)等。
2.etcd:分布式鍵值存儲(chǔ),主要負(fù)責(zé)網(wǎng)絡(luò)元數(shù)據(jù)一致性,確保Calico網(wǎng)絡(luò)狀態(tài)的準(zhǔn)確性,可以與kubernetes共用;
3.BGP Client(BIRD):Calico 為每一臺(tái) Host 部署一個(gè) BGP Client,使用 BIRD 實(shí)現(xiàn),BIRD 是一個(gè)單獨(dú)的持續(xù)發(fā)展的項(xiàng)目,實(shí)現(xiàn)了眾多動(dòng)態(tài)路由協(xié)議比如 BGP、OSPF、RIP 等。在 Calico 的角色是監(jiān)聽(tīng) Host 上由 Felix 注入的路由信息,然后通過(guò) BGP 協(xié)議廣播告訴剩余 Host 節(jié)點(diǎn),從而實(shí)現(xiàn)網(wǎng)絡(luò)互通。
4.BGP Route Reflector:在大型網(wǎng)絡(luò)規(guī)模中,如果僅僅使用 BGP client 形成 mesh 全網(wǎng)互聯(lián)的方案就會(huì)導(dǎo)致規(guī)模限制,因?yàn)樗泄?jié)點(diǎn)之間倆倆互聯(lián),需要 N^2 個(gè)連接,為了解決這個(gè)規(guī)模問(wèn)題,可以采用 BGP 的 Router Reflector 的方法,使所有 BGP Client 僅與特定 RR 節(jié)點(diǎn)互聯(lián)并做路由同步,從而大大減少連接數(shù)。
Felix
Felix會(huì)監(jiān)聽(tīng)ECTD中心的存儲(chǔ),從它獲取事件,比如說(shuō)用戶在這臺(tái)機(jī)器上加了一個(gè)IP,或者是創(chuàng)建了一個(gè)容器等。用戶創(chuàng)建pod后,Felix負(fù)責(zé)將其網(wǎng)卡、IP、MAC都設(shè)置好,然后在內(nèi)核的路由表里面寫(xiě)一條,注明這個(gè)IP應(yīng)該到這張網(wǎng)卡。同樣如果用戶制定了隔離策略,Felix同樣會(huì)將該策略創(chuàng)建到ACL中,以實(shí)現(xiàn)隔離。
BIRD
BIRD是一個(gè)標(biāo)準(zhǔn)的路由程序,它會(huì)從內(nèi)核里面獲取哪一些IP的路由發(fā)生了變化,然后通過(guò)標(biāo)準(zhǔn)BGP的路由協(xié)議擴(kuò)散到整個(gè)其他的宿主機(jī)上,讓外界都知道這個(gè)IP在這里,你們路由的時(shí)候得到這里來(lái)。
架構(gòu)特點(diǎn)
由于Calico是一種純?nèi)龑拥膶?shí)現(xiàn),因此可以避免與二層方案相關(guān)的數(shù)據(jù)包封裝的操作,中間沒(méi)有任何的NAT,沒(méi)有任何的overlay,所以它的轉(zhuǎn)發(fā)效率可能是所有方案中最高的,因?yàn)樗陌苯幼咴鶷CP/IP的協(xié)議棧,它的隔離也因?yàn)檫@個(gè)棧而變得好做。因?yàn)門(mén)CP/IP的協(xié)議棧提供了一整套的防火墻的規(guī)則,所以它可以通過(guò)IPTABLES的規(guī)則達(dá)到比較復(fù)雜的隔離邏輯。
3|0Calico 網(wǎng)絡(luò)Node之間兩種網(wǎng)絡(luò)
IPIP
從字面來(lái)理解,就是把一個(gè)IP數(shù)據(jù)包又套在一個(gè)IP包里,即把 IP 層封裝到 IP 層的一個(gè) tunnel。它的作用其實(shí)基本上就相當(dāng)于一個(gè)基于IP層的網(wǎng)橋!一般來(lái)說(shuō),普通的網(wǎng)橋是基于mac層的,根本不需 IP,而這個(gè) ipip 則是通過(guò)兩端的路由做一個(gè) tunnel,把兩個(gè)本來(lái)不通的網(wǎng)絡(luò)通過(guò)點(diǎn)對(duì)點(diǎn)連接起來(lái)。
BGP
邊界網(wǎng)關(guān)協(xié)議(Border Gateway Protocol, BGP)是互聯(lián)網(wǎng)上一個(gè)核心的去中心化自治路由協(xié)議。它通過(guò)維護(hù)IP路由表或‘前綴’表來(lái)實(shí)現(xiàn)自治系統(tǒng)(AS)之間的可達(dá)性,屬于矢量路由協(xié)議。BGP不使用傳統(tǒng)的內(nèi)部網(wǎng)關(guān)協(xié)議(IGP)的指標(biāo),而使用基于路徑、網(wǎng)絡(luò)策略或規(guī)則集來(lái)決定路由。因此,它更適合被稱(chēng)為矢量性協(xié)議,而不是路由協(xié)議。BGP,通俗的講就是講接入到機(jī)房的多條線路(如電信、聯(lián)通、移動(dòng)等)融合為一體,實(shí)現(xiàn)多線單IP,BGP 機(jī)房的優(yōu)點(diǎn):服務(wù)器只需要設(shè)置一個(gè)IP地址,最佳訪問(wèn)路由是由網(wǎng)絡(luò)上的骨干路由器根據(jù)路由跳數(shù)與其它技術(shù)指標(biāo)來(lái)確定的,不會(huì)占用服務(wù)器的任何系統(tǒng)。
4|0IPIP 工作模式
4|11.測(cè)試環(huán)境
一個(gè)msater節(jié)點(diǎn),ip 172.171.5.95,一個(gè)node節(jié)點(diǎn) ip 172.171.5.96
創(chuàng)建一個(gè)daemonset的應(yīng)用,pod1落在master節(jié)點(diǎn)上 ip地址為192.168.236.3,pod2落在node節(jié)點(diǎn)上 ip地址為192.168.190.203
pod1 ping pod2
4|22.ping包的旅程
pod1上的路由信息
根據(jù)路由信息,ping 192.168.190.203,會(huì)匹配到第一條。第一條路由的意思是:去往任何網(wǎng)段的數(shù)據(jù)包都發(fā)往網(wǎng)管169.254.1.1,然后從eth0網(wǎng)卡發(fā)送出去。
路由表中Flags標(biāo)志的含義:
U up表示當(dāng)前為啟動(dòng)狀態(tài)
H host表示該路由為一個(gè)主機(jī),多為達(dá)到數(shù)據(jù)包的路由
G Gateway 表示該路由是一個(gè)網(wǎng)關(guān),如果沒(méi)有說(shuō)明目的地是直連的
D Dynamicaly 表示該路由是重定向報(bào)文修改
M 表示該路由已被重定向報(bào)文修改
master節(jié)點(diǎn)上的路由信息
當(dāng)ping包來(lái)到master節(jié)點(diǎn)上,會(huì)匹配到路由tunl0。該路由的意思是:去往192.169.190.192/26的網(wǎng)段的數(shù)據(jù)包都發(fā)往網(wǎng)關(guān)172.171.5.96。因?yàn)閜od1在5.95,pod2在5.96。所以數(shù)據(jù)包就通過(guò)設(shè)備tunl0發(fā)往到node節(jié)點(diǎn)上。
node節(jié)點(diǎn)上路由信息
當(dāng)node節(jié)點(diǎn)網(wǎng)卡收到數(shù)據(jù)包之后,發(fā)現(xiàn)發(fā)往的目的ip為192.168.190.203,于是匹配到紅線的路由。該路由的意思是:192.168.190.203是本機(jī)直連設(shè)備,去往設(shè)備的數(shù)據(jù)包發(fā)往caliadce112d250。
那么該設(shè)備是什么呢?如果到這里你能猜出來(lái)是什么,那說(shuō)明你的網(wǎng)絡(luò)功底是不錯(cuò)的。這個(gè)設(shè)備就是veth pair的一端。在創(chuàng)建pod2時(shí)calico會(huì)給pod2創(chuàng)建一個(gè)veth pair設(shè)備。一端是pod2的網(wǎng)卡,另一端就是我們看到的caliadce112d250。下面我們驗(yàn)證一下。在pod2中安裝ethtool工具,然后使用ethtool -S eth0,查看veth pair另一端的設(shè)備號(hào)。
pod2 網(wǎng)卡另一端的設(shè)備好號(hào)是18,在node上查看編號(hào)為18的網(wǎng)絡(luò)設(shè)備,可以發(fā)現(xiàn)該網(wǎng)絡(luò)設(shè)備就是caliadce112d250。
所以,node上的路由,發(fā)送caliadce112d250的數(shù)據(jù)其實(shí)就是發(fā)送到pod2的網(wǎng)卡中。ping包的旅行到這里就到了目的地。
查看一下pod2中的路由信息,發(fā)現(xiàn)該路由信息和pod1中是一樣的。
顧名思義,IPIP網(wǎng)絡(luò)就是將IP網(wǎng)絡(luò)封裝在IP網(wǎng)絡(luò)里。IPIP網(wǎng)絡(luò)的特點(diǎn)是所有pod的數(shù)據(jù)流量都從隧道tunl0發(fā)送,并且在tunl0這增加了一層傳輸層的封包。
在master網(wǎng)卡上抓包分析該過(guò)程。
打開(kāi)ICMP 285,pod1 ping pod2的數(shù)據(jù)包,能夠看到該數(shù)據(jù)包一共5層,其中IP所在的網(wǎng)絡(luò)層有兩個(gè),分別是pod之間的網(wǎng)絡(luò)和主機(jī)之間的網(wǎng)絡(luò)封裝。
根據(jù)數(shù)據(jù)包的封裝順序,應(yīng)該是在pod1 ping pod2的ICMP包外面多封裝了一層主機(jī)之間的數(shù)據(jù)包。
之所以要這樣做是因?yàn)閠unl0是一個(gè)隧道端點(diǎn)設(shè)備,在數(shù)據(jù)到達(dá)時(shí)要加上一層封裝,便于發(fā)送到對(duì)端隧道設(shè)備中。
兩層IP封裝的具體內(nèi)容
IPIP的連接方式:
5|0BGP 工作模式
5|11.修改配置
在安裝calico網(wǎng)絡(luò)時(shí),默認(rèn)安裝是IPIP網(wǎng)絡(luò)。calico.yaml文件中,將CALICO_IPV4POOL_IPIP的值修改成 “off”,就能夠替換成BGP網(wǎng)絡(luò)。
5|22.對(duì)比
BGP網(wǎng)絡(luò)相比較IPIP網(wǎng)絡(luò),最大的不同之處就是沒(méi)有了隧道設(shè)備 tunl0。 前面介紹過(guò)IPIP網(wǎng)絡(luò)pod之間的流量發(fā)送tunl0,然后tunl0發(fā)送對(duì)端設(shè)備。BGP網(wǎng)絡(luò)中,pod之間的流量直接從網(wǎng)卡發(fā)送目的地,減少了tunl0這個(gè)環(huán)節(jié)。
master節(jié)點(diǎn)上路由信息。從路由信息來(lái)看,沒(méi)有tunl0設(shè)備。
同樣創(chuàng)建一個(gè)daemonset,pod1在master節(jié)點(diǎn)上,pod2在node節(jié)點(diǎn)上。
5|33.ping包之旅
pod1 ping pod2。
根據(jù)pod1中的路由信息,ping包通過(guò)eth0網(wǎng)卡發(fā)送到master節(jié)點(diǎn)上。
master節(jié)點(diǎn)上路由信息。根據(jù)匹配到的 192.168.190.192 路由,該路由的意思是:去往網(wǎng)段192.168.190.192/26 的數(shù)據(jù)包,發(fā)送網(wǎng)段172.171.5.96。而5.96就是node節(jié)點(diǎn)。所以,該數(shù)據(jù)包直接發(fā)送了5.96節(jié)點(diǎn)。
node節(jié)點(diǎn)上的路由信息。根據(jù)匹配到的192.168.190.192的路由,數(shù)據(jù)將發(fā)送給 cali6fcd7d1702e設(shè)備,該設(shè)備和上面分析的是一樣,為pod2的veth pair 的一端。數(shù)據(jù)就直接發(fā)送給pod2的網(wǎng)卡。
當(dāng)pod2對(duì)ping包做出回應(yīng)之后,數(shù)據(jù)到達(dá)node節(jié)點(diǎn)上,匹配到192.168.236.0的路由,該路由說(shuō)的是:去往網(wǎng)段192.168.236.0/26 的數(shù)據(jù),發(fā)送給網(wǎng)關(guān) 172.171.5.95。數(shù)據(jù)包就直接通過(guò)網(wǎng)卡ens160,發(fā)送到master節(jié)點(diǎn)上。
通過(guò)在master節(jié)點(diǎn)上抓包,查看經(jīng)過(guò)的流量,篩選出ICMP,找到pod1 ping pod2的數(shù)據(jù)包。
可以看到BGP網(wǎng)絡(luò)下,沒(méi)有使用IPIP模式,數(shù)據(jù)包是正常的封裝。
值得注意的是mac地址的封裝。192.168.236.0是pod1的ip,192.168.190.198是pod2的ip。而源mac地址是 master節(jié)點(diǎn)網(wǎng)卡的mac,目的mac是node節(jié)點(diǎn)的網(wǎng)卡的mac。這說(shuō)明,在 master節(jié)點(diǎn)的路由接收到數(shù)據(jù),重新構(gòu)建數(shù)據(jù)包時(shí),使用arp請(qǐng)求,將node節(jié)點(diǎn)的mac拿到,然后封裝到數(shù)據(jù)鏈路層。
BGP的連接方式:
6|0兩種網(wǎng)絡(luò)對(duì)比
IPIP網(wǎng)絡(luò):
流量:tunlo設(shè)備封裝數(shù)據(jù),形成隧道,承載流量。
適用網(wǎng)絡(luò)類(lèi)型:適用于互相訪問(wèn)的pod不在同一個(gè)網(wǎng)段中,跨網(wǎng)段訪問(wèn)的場(chǎng)景。外層封裝的ip能夠解決跨網(wǎng)段的路由問(wèn)題。
效率:流量需要tunl0設(shè)備封裝,效率略低
BGP網(wǎng)絡(luò):
流量:使用路由信息導(dǎo)向流量
適用網(wǎng)絡(luò)類(lèi)型:適用于互相訪問(wèn)的pod在同一個(gè)網(wǎng)段,適用于大型網(wǎng)絡(luò)。
效率:原生hostGW,效率高
7|0存在問(wèn)題
(1) 缺點(diǎn)租戶隔離問(wèn)題
Calico 的三層方案是直接在 host 上進(jìn)行路由尋址,那么對(duì)于多租戶如果使用同一個(gè) CIDR 網(wǎng)絡(luò)就面臨著地址沖突的問(wèn)題。
(2) 路由規(guī)模問(wèn)題
通過(guò)路由規(guī)則可以看出,路由規(guī)模和 pod 分布有關(guān),如果 pod離散分布在 host 集群中,勢(shì)必會(huì)產(chǎn)生較多的路由項(xiàng)。
(3) iptables 規(guī)則規(guī)模問(wèn)題
1臺(tái) Host 上可能虛擬化十幾或幾十個(gè)容器實(shí)例,過(guò)多的 iptables 規(guī)則造成復(fù)雜性和不可調(diào)試性,同時(shí)也存在性能損耗。
(4) 跨子網(wǎng)時(shí)的網(wǎng)關(guān)路由問(wèn)題
當(dāng)對(duì)端網(wǎng)絡(luò)不為二層可達(dá)時(shí),需要通過(guò)三層路由機(jī)時(shí),需要網(wǎng)關(guān)支持自定義路由配置,即 pod 的目的地址為本網(wǎng)段的網(wǎng)關(guān)地址,再由網(wǎng)關(guān)進(jìn)行跨三層轉(zhuǎn)發(fā)。
部分?jǐn)?shù)據(jù)或文字引用至 http://ju.outofmemory.cn/entry/367749
參考鏈接:https://www.cnblogs.com/goldsunshine/p/10701242.html
總結(jié)
以上是生活随笔為你收集整理的k8s网络之Calico网络的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spark on K8S 的现状与挑战
- 下一篇: win11怎么改任务栏大小