Kubernetes網路模型本身對某些特定的網路功能有一定要求,但在實現方面也具有一定的靈活性。業界已經有不少不同的網路方案,來滿足特定的環境和要求。 CNI(container network interface)是容器網路介面,它是一種標準設計和庫,為了讓用戶在容器創建或者銷毀時都能夠更容易的配 ...
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來加密快速數據路徑流量。
詳細資料:https://www.sohu.com/a/304555150_618296