k8s網絡之Calico網絡

 

k8s網絡主題系列:html

1、k8s網絡之設計與實現node

2、k8s網絡之Flannel網絡安全

3、k8s網絡之Calico網絡服務器

 

簡介

Calico 是一種容器之間互通的網絡方案在虛擬化平臺中,好比 OpenStackDocker 等都須要實現 workloads 之間互連,但同時也須要對容器作隔離控制,就像在 Internet 中的服務僅開放80端口、公有云的多租戶同樣,提供隔離和管控機制。而在多數的虛擬化平臺實現中,一般都使用二層隔離技術來實現容器的網絡,這些二層的技術有一些弊端,好比須要依賴 VLANbridge 和隧道等技術,其中 bridge 帶來了複雜性,vlan 隔離和 tunnel 隧道則消耗更多的資源並對物理環境有要求,隨着網絡規模的增大,總體會變得越加複雜。咱們嘗試把 Host 看成 Internet 中的路由器,一樣使用 BGP 同步路由,並使用 iptables 來作安全訪問策略,最終設計出了 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 較少的依賴性使它能適配全部 VMContainer、白盒或者混合環境場景。

 

Calico架構

架構圖:

 

Calico網絡模型主要工做組件:

1.Felix:運行在每一臺 Host agent 進程,主要負責網絡接口管理和監聽、路由、ARP 管理、ACL 管理和同步、狀態上報等

2.etcd:分佈式鍵值存儲,主要負責網絡元數據一致性,確保Calico網絡狀態的準確性,能夠與kubernetes共用;

3.BGP ClientBIRD):Calico 爲每一臺 Host 部署一個 BGP Client,使用 BIRD 實現,BIRD 是一個單獨的持續發展的項目,實現了衆多動態路由協議好比 BGPOSPFRIP 等。在 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負責將其網卡、IPMAC都設置好,而後在內核的路由表裏面寫一條,註明這個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,通俗的講就是講接入到機房的多條線路(如電信、聯通、移動等)融合爲一體,實現多線單IPBGP 機房的優勢:服務器只須要設置一個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.修改配置

在安裝calico網絡時,默認安裝是IPIP網絡。calico.yaml文件中,將CALICO_IPV4POOL_IPIP的值修改爲 "off",就可以替換成BGP網絡。

 

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 規則規模問題

1Host 上可能虛擬化十幾或幾十個容器實例,過多的 iptables 規則形成複雜性和不可調試性,同時也存在性能損耗。

 

(4) 跨子網時的網關路由問題

當對端網絡不爲二層可達時,須要經過三層路由機時,須要網關支持自定義路由配置,即 pod 的目的地址爲本網段的網關地址,再由網關進行跨三層轉發。

 

 

部分數據或文字引用至 http://ju.outofmemory.cn/entry/367749

相關文章
相關標籤/搜索