Kubernetes網絡模型本身對某些特定的網絡功能有一定要求,但在實現方面也具有一定的靈活性。業界已經有不少不同的網絡方案,來滿足特定的環境和要求。
CNI(container network interface)是容器網絡接口,它是一種標准設計和庫,為了讓用戶在容器創建或者銷毀時都能夠更容易的配置容器網絡。
目前比較流行的CNI插件:Flannel、Calico、Weave、Canal(技術上是多個插件的組合)。這些插件即可以確保滿足Kubernetes的網絡要求,又能為kubernetes集群管理員提供他們所需的某些特定的網絡功能。
背景
容器網絡是容器選擇連接到其他容器、主機和外部網絡(如Internet)的機制。容器的runtime提供了各種網絡模式,每種模式都會產生不同的效果。例如,Docker默認情況下可以為容器配置以下網絡:
- none:將容器添加到一個容器專門的網絡堆棧中,沒有對外連接。
- host:將容器添加到主機的網絡堆棧中,沒有隔離。
- default bridge:默認網絡模式。每個容器可以通過IP地址互相連接。
- 自定義網橋:用戶定義的網橋,具有更多的靈活性、隔離性和其他便利功能。
Docker還可以讓用戶通過其他驅動程序和插件,來配置更高級的網絡(包括多主機覆蓋網絡)。
CNI(https://github.com/containernetworking/cni/blob/master/SPEC.md) 的初衷是創建一個框架,用於在配置或銷毀容器時動態配置適當的網絡配置和資源。CNI 規范中用於配置網絡的插件接口,可以讓容器運行時與插件進行協調,具體機制如下:
- 插件負責為接口配置和管理IP地址,並且同於提供與IP管理、每個容器的IP分配、以及多主機連接相關的功能。
- 容器運行時會調用網絡插件,從而在容器啟動時分配IP地址並配置網絡策略,並在刪除容器時再次調用插件以清理這些資源。
- 在Kubernetes中,kubelet可以在適當的時間調用插件,來為通過kubelet啟動的pod進行自動的網絡配置。
術語
- VXLAN:代表“虛擬可擴展LAN”。首先,VXLAN用於通過在UDP數據報中封裝第2層以太網幀來幫助實現大型雲部署。VXLAN虛擬化與VLAN類似,但提供更大的靈活性和功能(VLAN僅限於4096個網絡ID)。VXLAN是一種封裝和覆蓋協議,可在現有網絡上運行。
- Overlay網絡:Overlay網絡是建立在現有網絡之上的虛擬邏輯網絡。Overlay網絡通常用於在現有網絡之上提供有用的抽象,並分離和保護不同的邏輯網絡。
- 網狀網格:網狀網絡(Mesh network)是指每個節點連接到許多其他節點以協作路由、並實現更大連接的網絡。網狀網絡允許通過多個路徑進行路由,從而提供更可靠的網絡。網狀網格的缺點是每個附加節點都會增加大量開銷。
- BGP(Border Gateway Protocol):即"邊界網關協議",用於管理邊緣路由器之間數據包的路由方式。BGP通過考慮可用路徑,路由規則和特定網絡策略,幫助弄清楚如何將數據包從一個網絡發送到另一個網絡。
原理
要實現跨虛擬機的容器之間的網絡,有幾種可能的辦法:
- 容器的IP就是二層網絡里分配的IP,這樣容器相當於二層網絡里的節點,那么就可以天然互訪;
- 容器的IP與node的IP不屬於同一個網段,node上配置個到各個網段的路由(指向對應容器網段所部屬的node IP),通過路由實現互訪[flannel host-gw, calico bgp均是通過此方案實現];
- 容器的IP與node的IP不屬於同一個網段,node上有服務對容器發出的包進行封裝,對發給容器的包進行解封。封裝后的包通過node所在的網絡進行傳輸。解封后的包通過網橋或路由直接發給容器,即overlay網絡。[flannel udp/vxlan,calico ipip,openshift-sdn均通過此方案實現]
CNI 插件
Flannel(只能提供網絡通訊,不提供網絡策略)
鏈接:https://github.com/coreos/flannel
由CoreOS開發的項目Flannel,是最直接和最受歡迎的CNI插件。它是容器編排系統中最成熟的網絡結構示例之一,旨在實現更好的容器間和主機間網絡。
特點:
-
相對容易安裝和配置。它被打包為單個二進制文件flanneld,許多常見的Kubernetes集群部署工具和許多Kubernetes發行版都可以默認安裝Flannel。
-
Flannel可以使用Kubernetes集群的現有etcd集群來使用API存儲其狀態信息,因此不需要專用的數據存儲。
-
Flannel配置第三層IPv4 overlay網絡。它會創建一個大型內部網絡,跨越集群中每個節點。在此overlay網絡中,每個節點都有一個子網,用於在內部分配IP地址。在配置pod時,每個節點上的Docker橋接口都會為每個新容器分配一個地址。同一主機中的Pod可以使用Docker橋接進行通信,而不同主機上的pod會使用flanneld將其流量封裝在UDP數據包中,以便路由到適當的目標。
-
主要是提供主機和pod之間的網絡鏈接。
Calico
鏈接:https://github.com/projectcalico/cni-plugin
Calico以其性能、靈活性而聞名。
特點:
- Clico的功能更為全面,不僅提供主機和pod之間的網絡鏈接,還涉及網絡安全和管理。
- Calico CNI插件在CNI框架內封裝了Calico的功能。
- Calico不使用overlay網絡,而是配置第三層網絡(網絡層,IPv4、IPv6、ICMP)【更底層】。該網絡使用BGP路由協議在主機之間路由數據包。這意味着在主機之間傳輸的時候,不需要將數據包包裝在額外的封裝層中。傳輸效率更高,有性能優勢。
- 故障排查更方便。使用calico,標准調試工具可以訪問與簡單環境中相同的信息,從而使更多開發人員、管理人員更容易理解行為。
- 具有先進的網絡功能:
- 網絡策略
- 還可以與服務網格Istio集成,
canal
鏈接:https://github.com/projectcalico/canal
Canal是Flannel和Calico的組合:
- 網絡層用的是Flannel提供的簡單overlay,可以在許多不同的部署環境中運行且無需額外的配置。
- 網絡策略方面,Calico強大的網絡規則評估,為基礎網絡提供了更多補充,從而提供了更多安全性和控制。
Weave
鏈接:https://www.weave.works/oss/net/
weave是Weaveworks提供的一種Kubernetes CNI網絡選項。
特點:
-
智能路由 Weave在集群中的每個節點之間創建overlay網絡,參與者可以靈活路由。——Weave可以智能路由。
工作原理:
為了創建網絡,weave依賴於網絡中每台主機上安裝的路由組件。然后,這些路由器交換拓撲信息,以維護可用網絡環境的最新試圖。 當需要將流量發送到位於不同節點上的pod時,weave路由組件會自動決定是通過"快速數據路徑"發送,還是回退到"sleeve"分組轉發的方法。
-
與Calico一樣,Weave也為Kubernetes集群提供網絡策略功能。
-
對整個網絡的簡單加密。Weave可以使用NaCI加密(http://nacl.cr.yp.to)來為sleeve流量自動加密所有路由流量;使用IPsec ESP來加密快速數據路徑流量。