[toc]
一、calico
官網(wǎng):https://www.projectcalico.org/
Calico是一個(gè)純?nèi)龑拥木W(wǎng)絡(luò)解決方案,為容器提供多node間的訪問(wèn)通信滑负,calico將每一個(gè)node節(jié)點(diǎn)都作為一個(gè)路由器(router)充包,各節(jié)點(diǎn)通過(guò)BGP(Border Gateway Protocol)邊界網(wǎng)關(guān)協(xié)議學(xué)習(xí)并在node節(jié)點(diǎn)生成路由規(guī)則跨算,從而將不通node節(jié)點(diǎn)上的pod連接起來(lái)進(jìn)行通信哺呜。
1.1 calico簡(jiǎn)介
網(wǎng)絡(luò)通過(guò)第三層路由技術(shù)(如靜態(tài)路由或BGP路由分配)或第二層地址學(xué)習(xí)來(lái)感知工作負(fù)載IP地址蜘澜。因此沾鳄,他們可以將未封裝的流量路由到作為最終目的地的端點(diǎn)的正確主機(jī)慨飘。但是,并非所有網(wǎng)絡(luò)都能夠路由工作負(fù)載IP地址译荞。例如公共云環(huán)境瓤的、跨VPC子網(wǎng)邊界的AWS,以及無(wú)法通過(guò)BGP吞歼、Calico對(duì)應(yīng)到underlay網(wǎng)絡(luò)或無(wú)法輕松配置靜態(tài)路由的其他場(chǎng)景圈膏,這就是為什么Calico支持封裝,因此可以再工作負(fù)載之間發(fā)送流量篙骡,而無(wú)需底層網(wǎng)絡(luò)知道工作負(fù)載IP地址本辐。
1.2 calico封裝類型
Calico支持兩種類型的封裝:VXLAN和IP-in-IP桥帆,VXLAN的數(shù)據(jù)包開(kāi)銷稍高,因?yàn)閳?bào)文頭較大慎皱,除非運(yùn)行的是網(wǎng)絡(luò)密集型工作負(fù)載老虫,否則通常不會(huì)注意到這種差異。另一個(gè)差異是Calico的VXLAN實(shí)現(xiàn)不使用BGP茫多,Calico的IP-in-IP是在Calico節(jié)點(diǎn)之間使用BGP協(xié)議實(shí)現(xiàn)跨子網(wǎng)祈匙。
BGP是一個(gè)去中心化的協(xié)議,它通過(guò)自動(dòng)學(xué)習(xí)和維護(hù)路由表實(shí)現(xiàn)網(wǎng)絡(luò)的可用性天揖,但是并不是所有的網(wǎng)絡(luò)都支持BGP夺欲,另外為了跨網(wǎng)絡(luò)實(shí)現(xiàn)更大規(guī)模的網(wǎng)絡(luò)管理,calico還支持IP-in-IP的疊加模型今膊,簡(jiǎn)稱IPIP些阅,IPIP可以實(shí)現(xiàn)跨不通網(wǎng)段建立路由通信,但是會(huì)存在安全性問(wèn)題斑唬,其在內(nèi)核內(nèi)置市埋,可以通過(guò)Calico的配置文件設(shè)置是否啟用IPIP,在公司內(nèi)部如果k8s的node節(jié)點(diǎn)沒(méi)有跨越網(wǎng)段建議關(guān)閉IPIP恕刘。
IPIP是一種將各Node的路由之間做一個(gè)tunnel缤谎,再把兩個(gè)網(wǎng)絡(luò)連接起來(lái)的模式。啟用IPIP模式時(shí)褐着,Calico將在各Node上創(chuàng)建一個(gè)名為"tunnel0"的虛擬網(wǎng)絡(luò)接口坷澡。
BGP模式則直接使用物理機(jī)作為虛擬路由器(vRouter),不再創(chuàng)建額外的tunnel含蓉。
1.3 calico核心組件
Felix:calico的agent频敛,運(yùn)行在每一臺(tái)node節(jié)點(diǎn)上,主要是維護(hù)路由規(guī)則馅扣、匯報(bào)當(dāng)前節(jié)點(diǎn)狀態(tài)以確保pod的跨主機(jī)通信斟赚。
BGP Client:每臺(tái)node都運(yùn)行,其主要負(fù)責(zé)監(jiān)聽(tīng)node節(jié)點(diǎn)上有felix生成的路由信息岂嗓,然后通過(guò)BGP協(xié)議廣播至其他node節(jié)點(diǎn),從而相互學(xué)習(xí)路由實(shí)現(xiàn)pod通信鹊碍。
Route Reflector:集中式的路由反射器厌殉,calico v3.3開(kāi)始支持,當(dāng)Calico BGP客戶端將路由從FIB(Forward Information dataBase侈咕,轉(zhuǎn)發(fā)信息庫(kù))通告到Route Reflector時(shí)公罕,Route Reflector會(huì)將這些路由通告為部署集群中的其他節(jié)點(diǎn),Route Reflector專門(mén)用于管理BGP網(wǎng)絡(luò)路由規(guī)則耀销,不會(huì)產(chǎn)生pod數(shù)據(jù)通信楼眷。
注:calico默認(rèn)工作模式是BGP的node-to-node mesh,如果要使用Route Reflector需要進(jìn)行相關(guān)配置。
二罐柳、flannel
2.1 flannel簡(jiǎn)介
由CoreOS開(kāi)源的針對(duì)k8s的網(wǎng)絡(luò)服務(wù)掌腰,解決k8s集群中各主機(jī)上的pod相互通信的問(wèn)題,借助于etcd維護(hù)網(wǎng)絡(luò)IP地址分配张吉,并為每一個(gè)node服務(wù)器分配一個(gè)不同的IP地址段齿梁。
2.2 flannel網(wǎng)絡(luò)模型
Flannel網(wǎng)絡(luò)模型(后端):UDP、VXLAN勺择、Host-gw
UDP:早起版本使用UDP封裝完成報(bào)文的跨主機(jī)轉(zhuǎn)發(fā)省核,安全性及性能不足气忠。
VXLAN:linux內(nèi)核再2012年底的v3.7.0之后加入VXLAN協(xié)議支持笔刹,因此新版本的flannel也由UDP轉(zhuǎn)換為VXLAN舌菜,VXLAN本質(zhì)上是一種tunnel(隧道)協(xié)議日月,用來(lái)基于三層網(wǎng)絡(luò)實(shí)現(xiàn)虛擬的二層網(wǎng)絡(luò)爱咬,目前flannel的網(wǎng)絡(luò)模型已經(jīng)是基于VXLAN的疊加(覆蓋)網(wǎng)絡(luò),目前推薦使用VXLAN網(wǎng)絡(luò)模型虱歪。
Host-gw:也就是Host GateWay笋鄙,通過(guò)在node節(jié)點(diǎn)上創(chuàng)建到達(dá)各目標(biāo)容器地址的路由表而完成報(bào)文的轉(zhuǎn)發(fā),因此這種方式要求各node節(jié)點(diǎn)必須處于同一個(gè)局域網(wǎng)(二層網(wǎng)絡(luò))中践美,不適用與網(wǎng)絡(luò)變動(dòng)頻繁或比較大型的網(wǎng)絡(luò)環(huán)境,但性能較好敛滋。
2.3 flannel組件
Cni0:網(wǎng)橋設(shè)備玫膀,每創(chuàng)建一個(gè)pod都會(huì)創(chuàng)建一對(duì)veth pair帖旨,其中一段是pod中的eth0解阅,另一端是Cni0網(wǎng)橋中的端口(網(wǎng)卡)述召,pod中從網(wǎng)卡eth0發(fā)出的流量都會(huì)發(fā)送到Cni0網(wǎng)橋設(shè)備的端口(網(wǎng)卡)上积暖,Cni0設(shè)備獲得的ip地址是該節(jié)點(diǎn)分配到的網(wǎng)段的第一個(gè)地址。
Flannel.1:overlay網(wǎng)絡(luò)的設(shè)備分别,用來(lái)進(jìn)行vxlan報(bào)文的處理(封包和解包)耘斩,不同node之間的pod數(shù)據(jù)流量都從overlay設(shè)備以隧道的形式發(fā)送到對(duì)端沼填。
三括授、flannel和calico網(wǎng)絡(luò)組件對(duì)比
calico支持網(wǎng)絡(luò)策略(NetworkPolicy),flannel不支持
calico性能優(yōu)于flannel
不啟用overlay:flannel host-gw(不支持網(wǎng)絡(luò)策略)荚虚,calico BGP(推薦)
啟用overlay:flannel vxlan,calico IPIP
四曲管、overlay和underlay
4.1 overlay網(wǎng)絡(luò)
4.1.1 overlay簡(jiǎn)介
疊加網(wǎng)絡(luò)(覆蓋網(wǎng)絡(luò))却邓,在物理網(wǎng)絡(luò)的基礎(chǔ)之上疊加實(shí)現(xiàn)新的虛擬網(wǎng)絡(luò)硕糊,在物理網(wǎng)絡(luò)的基礎(chǔ)之上疊加實(shí)現(xiàn)新的虛擬網(wǎng)絡(luò)腊徙,即可使用網(wǎng)絡(luò)中的容器相互通信
4.1.2 overlay實(shí)現(xiàn)方式
overlay使用VxLAN或NVGRE技術(shù)實(shí)現(xiàn)
- VxLAN
VxLAN全稱是Visual eXtensible Local Area Network(虛擬擴(kuò)展本地局域網(wǎng))撬腾,主要有Cisco推出,vxlan是一個(gè)VLAN的擴(kuò)展協(xié)議漓踢,由IETF定義的NVO3(Network Virtualization over Layer 3)標(biāo)準(zhǔn)的技術(shù)之一,VXLAN的特點(diǎn)是將L2的以太幀封裝到UDP報(bào)文(即L2 over L4)中,并在L3網(wǎng)絡(luò)中傳輸挺据,即使用MAC in UDP的方法對(duì)報(bào)文進(jìn)行重新封裝,VxLAN本質(zhì)上是一種overlay的隧道封裝技術(shù)脖隶,它將L2的以太網(wǎng)幀封裝成L4的UDP數(shù)據(jù)報(bào)扁耐,然后再L3的網(wǎng)絡(luò)中傳輸,效果就像L2的以太網(wǎng)幀在一個(gè)廣播域中傳輸一樣产阱,實(shí)際上L2的以太網(wǎng)幀跨越了L3網(wǎng)絡(luò)傳輸婉称,但是不受L3網(wǎng)絡(luò)的限制,vxlan采用24位標(biāo)識(shí)vlan ID號(hào)心墅,可以支持2^24=16777216個(gè)vlan酿矢,其擴(kuò)展性比vlan強(qiáng)大很多,可以支持大規(guī)模數(shù)據(jù)中心的網(wǎng)絡(luò)需求怎燥。
- VTEP
VTEP(VXLAN Tunnel Endpoint vxlan隧道端點(diǎn))瘫筐,VTEP是VXLAN網(wǎng)絡(luò)的邊緣設(shè)備,是VXLAN隧道的起點(diǎn)和終點(diǎn)铐姚,VXLAN對(duì)用戶原始數(shù)據(jù)幀的封裝和解封裝均在VTEP上進(jìn)行策肝,與物理網(wǎng)絡(luò)相連,分配的地址為物理網(wǎng)IP地址隐绵,VXLAN報(bào)文中源IP地址為本節(jié)點(diǎn)的VTEP地址之众,VXLAN報(bào)文中目的IP地址為對(duì)端節(jié)點(diǎn)的VTEP地址,一對(duì)VTEP地址就對(duì)應(yīng)著一個(gè)VXLAN隧道依许,服務(wù)器上的虛擬交換機(jī)(隧道flannel.1就是VTEP)棺禾,比如一個(gè)虛擬機(jī)網(wǎng)絡(luò)中的多個(gè)vxlan就需要多個(gè)VTEP對(duì)不同的網(wǎng)絡(luò)報(bào)文進(jìn)行封裝與解封裝。
- VNI
VNI(VXLAN Network Identifier):VXLAN網(wǎng)絡(luò)標(biāo)識(shí)VNI類似VLAN ID峭跳,用于區(qū)分VXLAN段膘婶,不通VXLAN段的虛擬機(jī)不能直接二層相互通信缺前,一個(gè)VNI表示一個(gè)租戶,即使多個(gè)終端用于屬于同一個(gè)VNI悬襟,也表示一個(gè)租戶衅码。
- NVGRE
NVGRE(Network Virtualization using Generic Routing Encapsulation):主要支持這是Microsoft,與VXLAN不通的是脊岳,NVGRE沒(méi)有采用標(biāo)準(zhǔn)傳輸協(xié)議(TCP/UDP)逝段,而是借助通用路由封裝協(xié)議(GRE),NVGRE使用GRE頭部的低24位作為租戶網(wǎng)絡(luò)標(biāo)識(shí)符(TNI)割捅,與VXLAN一樣可以支持1777216個(gè)vlan奶躯。
4.2 underlay網(wǎng)絡(luò)
4.2.1 undelay簡(jiǎn)介
underlay網(wǎng)絡(luò)就是傳統(tǒng)IT基礎(chǔ)設(shè)施網(wǎng)絡(luò),由交換機(jī)和路由器等設(shè)備組成亿驾,借助以太網(wǎng)協(xié)議巫糙、路由協(xié)議和VLAN協(xié)議等驅(qū)動(dòng),它還是overlay網(wǎng)絡(luò)的底層網(wǎng)絡(luò)颊乘,為overlay網(wǎng)絡(luò)提供數(shù)據(jù)通信服務(wù)参淹。容器網(wǎng)絡(luò)中的underlay網(wǎng)絡(luò)是借助驅(qū)動(dòng)程序?qū)⑺拗鳈C(jī)的底層網(wǎng)絡(luò)接口直接暴露給容器使用的一種網(wǎng)絡(luò)構(gòu)建技術(shù),較為常見(jiàn)的解決方案有MAC VLAN乏悄、IP VLAN和直接路由等浙值。underlay依賴于網(wǎng)絡(luò)進(jìn)行跨主機(jī)通信。
4.2.1 underlay實(shí)現(xiàn)方式
- Bridge:橋接模式
- MAC VLAN:支持在同一個(gè)以太網(wǎng)接口上虛擬出多個(gè)網(wǎng)絡(luò)接口(子接口)檩小,每個(gè)虛擬接口都擁有唯一的MAC地址并配置網(wǎng)卡子接口IP开呐。
- IP VLAN:類似于MAC VLAN,它同樣創(chuàng)建新的虛擬網(wǎng)絡(luò)接口并為每個(gè)接口分配唯一的IP地址规求,不同之處在于筐付,每個(gè)虛擬接口將共享使用物理接口的MAC地址,從而不再違反防止MAC欺騙的交換機(jī)的安全策略阻肿,且不要求在物理接口上啟用混雜模式瓦戚。
IP VLAN有L2和L3兩種模型,其中IP VLAN L2的工作模式類似于MAC VLAN被用作網(wǎng)橋或交換機(jī)丛塌,而IP VLAN L3模式中较解,子接口地址不一樣,但是共用宿主機(jī)的MAC地址赴邻。雖然支持多種網(wǎng)絡(luò)模型印衔,但MAC VLAN和IP VLAN不能同時(shí)在同一物理接口上使用。
一般使用MAC VLAN姥敛。
Linux內(nèi)核從4.2版本后支持IP VLAN奸焙。
4.3 overlay和underlay區(qū)別
overlay容器有獨(dú)立的子網(wǎng),跨主機(jī)通信需要依賴隧道,報(bào)文做封裝和解封与帆,而underlay不需要金顿,underlay容器和宿主機(jī)是同一個(gè)子網(wǎng),跨主機(jī)通信不需要隧道封裝鲤桥,所以u(píng)nderlay性能更高一些;但是underlay需要占用宿主機(jī)網(wǎng)絡(luò)的ip渠概,overlay橫向擴(kuò)展性能要好茶凳,可以擴(kuò)相同網(wǎng)絡(luò)的主機(jī),也可以擴(kuò)不通網(wǎng)段的主機(jī)播揪。
五贮喧、node節(jié)點(diǎn)的iptables規(guī)則
5.1 iptables四表五鏈
5.1.1 四表
filter、nat猪狈、mangle箱沦、raw
優(yōu)先級(jí)由高到低:raw -> mangle -> nat -> filter
5.1.2 五鏈
- PREROUTING:規(guī)則可存在于raw表,mangle表雇庙,nat表谓形。
- INPUT:規(guī)則可存在于mangle表,filter表疆前,nat表(CentOS 7中有寒跳,CentOS 6沒(méi)有)。
- FORWARD:規(guī)則可存在于mangle表竹椒,filter表童太。
- OUTPUT:規(guī)則可存在于raw表,mangle表胸完,nat表书释,filter表。
- POSTROUTING:規(guī)則可存在于mangle表赊窥,nat表爆惧。
5.2 PREROUTING鏈
5.2.1 匹配PREROUTING鏈raw表
使用raw表解決ip_conntrack、table full锨能、dropping packet等場(chǎng)景
raw表可以在那些不需要nat的情況下检激,以提高性能。如大量訪問(wèn)的web服務(wù)器腹侣,可以讓80端口不再讓iptables做數(shù)據(jù)包的鏈接跟蹤處理叔收,以提高用戶的訪問(wèn)速度。
raw表只使用在PREROUTING鏈和OUTPUT鏈上傲隶,因?yàn)閮?yōu)先級(jí)最高饺律,從而可以對(duì)收到的數(shù)據(jù)包在連接跟蹤前進(jìn)行處理。一旦用戶使用了raw表跺株,在某個(gè)鏈上复濒,raw表處理完后脖卖,將跳過(guò)nat表和ip_conntrack處理,即不再做地址轉(zhuǎn)換和數(shù)據(jù)包的鏈接跟蹤處理了巧颈。
如果PREROUTING鏈上畦木,既有mangle表,也有nat表砸泛,那么優(yōu)先由mangle表處理十籍,然后由nat表處理
PREROUTING鏈的raw表主要是對(duì)報(bào)文進(jìn)行打標(biāo)記,沒(méi)有執(zhí)行訪問(wèn)轉(zhuǎn)發(fā)操作唇礁,然后繼續(xù)向下勾栗。
5.2.2 匹配PREROUTING鏈mangle表
mangle表的主要功能是根據(jù)規(guī)則修改數(shù)據(jù)包的一些標(biāo)志位,以便其他規(guī)則或程序可以利用這種標(biāo)志對(duì)數(shù)據(jù)包進(jìn)行過(guò)濾或策略路由盏筐。
PREROUTING鏈的mangle表主要是對(duì)報(bào)文添加注釋和打標(biāo)記围俘,并沒(méi)有執(zhí)行訪問(wèn)轉(zhuǎn)發(fā)操作,然后繼續(xù)向下琢融。
5.2.3 匹配PREROUTING鏈nat表
PREROUTING鏈的nat表界牡,如需要就要做目的地址轉(zhuǎn)換(DNAT)
報(bào)文被PREROUTING鏈中的匹配規(guī)則通過(guò)之后,就會(huì)到達(dá)本機(jī)路由階段漾抬,本機(jī)路由匹配去往目的pod的路由欢揖,如果pod在本機(jī),則本機(jī)轉(zhuǎn)發(fā)至本機(jī)奋蔚,如果目的pod不在本機(jī)她混,則基于本機(jī)路由表,轉(zhuǎn)發(fā)至指定目的node節(jié)點(diǎn)泊碑。
5.3 INPUT鏈
對(duì)目的地之為本機(jī)的報(bào)文進(jìn)行規(guī)則匹配
5.3.1 匹配INPUT鏈mangle表
規(guī)則默認(rèn)為空坤按,默認(rèn)放行
5.3.2 匹配INPUT鏈nat表
為空,不需要在INPUT的階段做NAT
5.3.3 匹配INPUT鏈filter表
filter表是iptables的默認(rèn)操作的表馒过,用于對(duì)訪問(wèn)地址為本機(jī)的報(bào)文進(jìn)行匹配和執(zhí)行下一步動(dòng)作臭脓。