k8s網路之Calico網路
一, 簡介
Calico是一種容器之間互通的網路方案。在虛擬化平臺中,比如OpenStack、Docker等都需要實現workloads之間互連,但同時也需要對容器做隔離控制,就像在Internet中的服務僅開放80埠、公有云的多租戶一樣,提供隔離和管控機制。而在多數的虛擬化平臺實現中,通常都使用二層隔離技術來實現容器的網路,這些二層的技術有一些弊端,比如需要依賴VLAN、bridge和隧道等技術,其中bridge帶來了複雜性,vlan隔離和tunnel隧道則消耗更多的資源並對物理環境有要求,隨著網路規模的增大,整體會變得越加複雜。我們嘗試把Host當作Internet中的路由器,同樣使用BGP同步路由,並使用iptables來做安全訪問策略,最終設計出了Calico方案。
calico封裝型別:
Vxlan 資料包報頭大,在網路密集型工作負載才能體現差異。
IP-in-IP 疊加模型,實現跨不同網段建立路由通訊,可以在配置檔案設定是否啟用IPIP,node節點跨網段需開啟。開啟時將Node路由之間做一個tuunel,再把兩個網路連線起來的模式,會在各Node節點上建立一個名為tunl0的虛擬網路介面。
BGP模式 直接使用物理機作為虛擬路由器(vRouter),不再建立額外的tunnel.
#[calico]設定calico 網路 backend: brid, vxlan, none
CALICO_NETWORKING_BACKEND:
"brid" #預設
# [calico]設定 CALICO_IPV4POOL_IPIP=“off”,可以提高網路效能,不能跨子網,條件限制詳見 docs/setup/calico.md
CALICO_IPV4POOL_IPIP:
"Always" #Calico工作模式
可跨子網,適用公司場景
適用場景:k8s環境中的pod之間需要隔離
設計思想:Calico不使用隧道或NAT來實現轉發,而是巧妙的把所有二三層流量轉換成三層流量,並通過host上路由配置完成跨Host轉發。
設計優勢:
1.更優的資源利用
二層網路通訊需要依賴廣播訊息機制,廣播訊息的開銷與host的數量呈指數級增長,Calico使用的三層路由方法,則完全抑制了二層廣播,減少了資源開銷。
另外,二層網路使用VLAN隔離技術,天生有4096個規格限制,即便可以使用vxlan解決,但vxlan又帶來了隧道開銷的新問題。而Calico不使用vlan或vxlan技術,使資源利用率更高。
2.可擴充套件性
Calico使用與Internet類似的方案,Internet的網路比任何資料中心都大,Calico同樣天然具有可擴充套件性。
3.簡單而更容易debug
因為沒有隧道,意味著workloads之間路徑更短更簡單,配置更少,在host上更容易進行debug除錯。
4.更少的依賴
Calico僅依賴三層路由可達。
5.可適配性
Calico較少的依賴性使它能適配所有VM、Container、白盒或者混合環境場景。
二 Calico架構
Calico網路模型主要工作元件:
1.Felix:執行在每一臺Host的agent程序,主要負責網路介面管理和監聽、路由、ARP管理、ACL管理和同步、狀態上報等。
2.etcd:分散式鍵值儲存,主要負責網路元資料一致性,確保Calico網路狀態的準確性,可以與kubernetes共用;
3.BGP Client(BIRD):Calico為每一臺Host部署一個BGP Client,使用BIRD實現,BIRD是一個單獨的持續發展的專案,實現了眾多動態路由協議比如BGP、OSPF、RIP等。在Calico的角色是監聽Host上由Felix注入的路由資訊,然後通過BGP協議廣播告訴剩餘Host節點,從而實現網路互通。
4.BGP Route Reflector:在大型網路規模中,如果僅僅使用BGP client形成mesh全網互聯的方案就會導致規模限制,因為所有節點之間倆倆互聯,需要N^2個連線,為了解決這個規模問題,可以採用BGP的Router Reflector的方法,使所有BGP Client僅與特定RR節點互聯並做路由同步,從而大大減少連線數。
Felix
Felix會監聽ECTD中心的儲存,從它獲取事件,比如說使用者在這臺機器上加了一個IP,或者是建立了一個容器等。使用者建立pod後,Felix負責將其網絡卡、IP、MAC都設定好,然後在核心的路由表裡面寫一條,註明這個IP應該到這張網絡卡。同樣如果使用者制定了隔離策略,Felix同樣會將該策略建立到ACL中,以實現隔離。
BIRD
BIRD是一個標準的路由程式,它會從核心裡面獲取哪一些IP的路由發生了變化,然後通過標準BGP的路由協議擴散到整個其他的宿主機上,讓外界都知道這個IP在這裡,你們路由的時候得到這裡來。
架構特點
由於Calico是一種純三層的實現,因此可以避免與二層方案相關的資料包封裝的操作,中間沒有任何的NAT,沒有任何的overlay,所以它的轉發效率可能是所有方案中最高的,因為它的包直接走原生TCP/IP的協議棧,它的隔離也因為這個棧而變得好做。因為TCP/IP的協議棧提供了一整套的防火牆的規則,所以它可以通過IPTABLES的規則達到比較複雜的隔離邏輯。
三 Calico 網路Node之間兩種網路
IPIP
從字面來理解,就是把一個IP資料包又套在一個IP包裡,即把IP層封裝到IP層的一個tunnel。它的作用其實基本上就相當於一個基於IP層的網橋!一般來說,普通的網橋是基於mac層的,根本不需IP,而這個ipip則是通過兩端的路由做一個tunnel,把兩個本來不通的網路通過點對點連線起來。
BGP
邊界閘道器協議(Border Gateway Protocol, BGP)是網際網路上一個核心的去中心化自治路由協議。它通過維護IP路由表或‘字首’表來實現自治系統(AS)之間的可達性,屬於向量路由協議。BGP不使用傳統的內部閘道器協議(IGP)的指標,而使用基於路徑、網路策略或規則集來決定路由。因此,它更適合被稱為向量性協議,而不是路由協議。BGP,通俗的講就是講接入到機房的多條線路(如電信、聯通、移動等)融合為一體,實現多線單IP,BGP機房的優點:伺服器只需要設定一個IP地址,最佳訪問路由是由網路上的骨幹路由器根據路由跳數與其它技術指標來確定的,不會佔用伺服器的任何系統。
四 IPIP工作模式
1,測試環境
一個msater節點,ip 172.171.5.95,一個node節點 ip 172.171.5.96
建立一個daemonset的應用,pod1落在master節點上 ip地址為192.168.236.3,pod2落在node節點上 ip地址為192.168.190.203
pod1 ping pod2
2,ping包旅程
pod1上的路由資訊
根據路由資訊,ping 192.168.190.203,會匹配到第一條。第一條路由的意思是:去往任何網段的資料包都發往網管169.254.1.1,然後從eth0網絡卡傳送出去。
路由表中Flags標誌的含義:
U up表示當前為啟動狀態
H host表示該路由為一個主機,多為達到資料包的路由
G Gateway 表示該路由是一個閘道器,如果沒有說明目的地是直連的
D Dynamicaly 表示該路由是重定向報文修改
M 表示該路由已被重定向報文修改
master節點上的路由資訊
當ping包來到master節點上,會匹配到路由tunl0。該路由的意思是:去往192.169.190.192/26的網段的資料包都發往閘道器172.171.5.96。因為pod1在5.95,pod2在5.96。所以資料包就通過裝置tunl0發往到node節點上。
node節點上路由資訊
當node節點網絡卡收到資料包之後,發現發往的目的ip為192.168.190.203,於是匹配到紅線的路由。該路由的意思是:192.168.190.203是本機直連裝置,去往裝置的資料包發往caliadce112d250。
那麼該裝置是什麼呢?如果到這裡你能猜出來是什麼,那說明你的網路功底是不錯的。這個裝置就是veth pair的一端。在建立pod2時calico會給pod2建立一個veth pair裝置。一端是pod2的網絡卡,另一端就是我們看到的caliadce112d250。下面我們驗證一下。在pod2中安裝ethtool工具,然後使用ethtool -S eth0,檢視veth pair另一端的裝置號。
pod2 網絡卡另一端的裝置好號是18,在node上檢視編號為18的網路裝置,可以發現該網路裝置就是caliadce112d250。
所以,node上的路由,傳送caliadce112d250的資料其實就是傳送到pod2的網絡卡中。ping包的旅行到這裡就到了目的地。
檢視一下pod2中的路由資訊,發現該路由資訊和pod1中是一樣的。
顧名思義,IPIP網路就是將IP網路封裝在IP網路裡。IPIP網路的特點是所有pod的資料流量都從隧道tunl0傳送,並且在tunl0這增加了一層傳輸層的封包。
在master網絡卡上抓包分析該過程。
開啟ICMP 285,pod1 ping pod2的資料包,能夠看到該資料包一共5層,其中IP所在的網路層有兩個,分別是pod之間的網路和主機之間的網路封裝。
根據資料包的封裝順序,應該是在pod1 ping pod2的ICMP包外面多封裝了一層主機之間的資料包。
之所以要這樣做是因為tunl0是一個隧道端點裝置,在資料到達時要加上一層封裝,便於傳送到對端隧道裝置中。
兩層IP封裝的具體內容
IPIP的連線方式:
五 BGP工作模式
1,修改配置
2,對比
BGP網路相比較IPIP網路,最大的不同之處就是沒有了隧道裝置 tunl0。 前面介紹過IPIP網路pod之間的流量傳送tunl0,然後tunl0傳送對端裝置。BGP網路中,pod之間的流量直接從網絡卡傳送目的地,減少了tunl0這個環節。
master節點上路由資訊。從路由資訊來看,沒有tunl0裝置。
同樣建立一個daemonset,pod1在master節點上,pod2在node節點上。
3 ping 包之旅
pod1 ping pod2。
根據pod1中的路由資訊,ping包通過eth0網絡卡傳送到master節點上。
master節點上路由資訊。根據匹配到的 192.168.190.192 路由,該路由的意思是:去往網段192.168.190.192/26 的資料包,傳送網段172.171.5.96。而5.96就是node節點。所以,該資料包直接傳送了5.96節點。
node節點上的路由資訊。根據匹配到的192.168.190.192的路由,資料將傳送給 cali6fcd7d1702e裝置,該裝置和上面分析的是一樣,為pod2的veth pair 的一端。資料就直接傳送給pod2的網絡卡。
當pod2對ping包做出迴應之後,資料到達node節點上,匹配到192.168.236.0的路由,該路由說的是:去往網段192.168.236.0/26 的資料,傳送給閘道器 172.171.5.95。資料包就直接通過網絡卡ens160,傳送到master節點上。
通過在master節點上抓包,檢視經過的流量,篩選出ICMP,找到pod1 ping pod2的資料包。
可以看到BGP網路下,沒有使用IPIP模式,資料包是正常的封裝。
值得注意的是mac地址的封裝。192.168.236.0是pod1的ip,192.168.190.198是pod2的ip。而源mac地址是 master節點網絡卡的mac,目的mac是node節點的網絡卡的mac。這說明,在 master節點的路由接收到資料,重新構建資料包時,使用arp請求,將node節點的mac拿到,然後封裝到資料鏈路層。
BGP的連線方式:
六 兩種網路對比
IPIP網路:
流量:tunlo裝置封裝資料,形成隧道,承載流量。
適用網路型別:適用於互相訪問的pod不在同一個網段中,跨網段訪問的場景。外層封裝的ip能夠解決跨網段的路由問題。
效率:流量需要tunl0裝置封裝,效率略低
BGP網路:
流量:使用路由資訊導向流量
適用網路型別:適用於互相訪問的pod在同一個網段,適用於大型網路。
效率:原生hostGW,效率高
七 存在問題
(1)缺點租戶隔離問題
Calico的三層方案是直接在host上進行路由定址,那麼對於多租戶如果使用同一個CIDR網路就面臨著地址衝突的問題。
(2)路由規模問題
通過路由規則可以看出,路由規模和pod分佈有關,如果 pod離散分佈在host叢集中,勢必會產生較多的路由項。
(3)iptables規則規模問題
1臺Host上可能虛擬化十幾或幾十個容器例項,過多的iptables規則造成複雜性和不可除錯性,同時也存在效能損耗。
(4)跨子網時的閘道器路由問題
當對端網路不為二層可達時,需要通過三層路由機時,需要閘道器支援自定義路由配置,即pod的目的地址為本網段的閘道器地址,再由閘道器進行跨三層轉發。
原文連結: https://www.cnblogs.com/goldsunshine/p/10740928.html