做者 | 阿里巴巴高級技術專家 葉磊node
本文來介紹一下 Kubernetes 對網絡模型的一些想法。你們知道 Kubernetes 對於網絡具體實現方案,沒有什麼限制,也沒有給出特別好的參考案例。Kubernetes 對一個容器網絡是否合格作出了限制,也就是 Kubernetes 的容器網絡模型。能夠把它歸結爲約法三章和四大目標。後端
先來看下約法三章:api
後文中會講一下我我的的理解,爲何 Kubernetes 對容器網絡會有一些看起來武斷的模型和要求。微信
四大目標實際上是在設計一個 K8s 的系統爲外部世界提供服務的時候,從網絡的角度要想清楚,外部世界如何一步一步鏈接到容器內部的應用?網絡
最終要達到目標,就是外部世界能夠鏈接到最裏面,對容器提供服務。數據結構
對基本約束,能夠作出這樣一些解讀:由於容器的網絡發展複雜性就在於它實際上是寄生在 Host 網絡之上的。從這個角度講,能夠把容器網絡方案大致分爲 **Underlay/Overlay **兩大派別:less
下面簡單講一下,Network Namespace 裏面能網絡實現的內核基礎。狹義上來講 runC 容器技術是不依賴於任何硬件的,它的執行基礎就是它的內核裏面,進程的內核表明就是 task,它若是不須要隔離,那麼用的是主機的空間( namespace),並不須要特別設置的空間隔離數據結構( nsproxy-namespace proxy)。運維
相反,若是一個獨立的網絡 proxy,或者 mount proxy,裏面就要填上真正的私有數據。它能夠看到的數據結構如上圖所示。微服務
從感官上來看一個隔離的網絡空間,它會擁有本身的網卡或者說是網絡設備。網卡多是虛擬的,也多是物理網卡,它會擁有本身的 IP 地址、IP 表和路由表、擁有本身的協議棧狀態。這裏面特指就是 TCP/Ip協議棧,它會有本身的status,會有本身的 iptables、ipvs。工具
從整個感官上來說,這就至關於擁有了一個徹底獨立的網絡,它與主機網絡是隔離的。固然協議棧的代碼仍是公用的,只是數據結構不相同。
這張圖能夠清晰代表 pod 裏 Netns 的關係,每一個 pod 都有着獨立的網絡空間,pod net container 會共享這個網絡空間。通常 K8s 會推薦選用 Loopback 接口,在 pod net container 之間進行通訊,而全部的 container 經過 pod 的 IP 對外提供服務。另外對於宿主機上的 Root Netns,能夠把它看作一個特殊的網絡空間,只不過它的 Pid 是1。
接下來簡單介紹一下典型的容器網絡實現方案。容器網絡方案多是 K8s 裏最爲百花齊放的一個領域,它有着各類各樣的實現。容器網絡的複雜性,其實在於它須要跟底層 Iass 層的網絡作協調、須要在性能跟 IP 分配的靈活性上作一些選擇,這個方案是多種多樣的。
下面簡單介紹幾個比較主要的方案:分別是 Flannel、Calico、Canal ,最後是 WeaveNet,中間的大多數方案都是採用了跟 Calico 相似的策略路由的方法。
Flannel 方案是目前使用最爲廣泛的。如上圖所示,能夠看到一個典型的容器網方案。它首先要解決的是 container 的包如何到達 Host,這裏採用的是加一個 Bridge 的方式。它的 backend 實際上是獨立的,也就是說這個包如何離開 Host,是採用哪一種封裝方式,仍是不須要封裝,都是可選擇的。
如今來介紹三種主要的 backend:
下面介紹一下 Network Policy 的概念。
剛纔提到了 Kubernetes 網絡的基本模型是須要 pod 之間全互聯,這個將帶來一些問題:可能在一個 K8s 集羣裏,有一些調用鏈之間是不會直接調用的。好比說兩個部門之間,那麼我但願 A 部門不要去探視到 B 部門的服務,這個時候就能夠用到策略的概念。
基本上它的想法是這樣的:它採用各類選擇器(標籤或 namespace),找到一組 pod,或者找到至關於通信的兩端,而後經過流的特徵描述來決定它們之間是否是能夠聯通,能夠理解爲一個白名單的機制。
在使用 Network Policy 以前,如上圖所示要注意 apiserver 須要打開一下這幾個開關。另外一個更重要的是咱們選用的網絡插件須要支持 Network Policy 的落地。你們要知道,Network Policy 只是 K8s 提供的一種對象,並無內置組件作落地實施,須要取決於你選擇的容器網絡方案對這個標準的支持與否及完備程度,若是你選擇 Flannel 之類,它並無真正去落地這個 Policy,那麼你試了這個也沒有什麼用。
接下來說一個配置的實例,或者說在設計一個 Network Policy 的時候要作哪些事情?我我的以爲須要決定三件事:
本文內容到這裏就結束了,咱們簡單總結一下:
在 pod 的容器網絡中核心概念就是 IP,IP 就是每一個 pod 對外通信的地址基礎,必須內外一致,符合 K8s 的模型特徵;
那麼在介紹網絡方案的時候,影響容器網絡性能最關鍵的就是拓撲。要可以理解你的包端到端是怎麼聯通的,中間怎麼從 container 到達 Host,Host 出了 container 是要封裝仍是解封裝?仍是經過策略路由?最終到達對端是怎麼解出來的?
容器網絡選擇和設計選擇。若是你並不清楚你的外部網絡,或者你須要一個普適性最強的方案,假設說你對 mac 是否直連不太清楚、對外部路由器的路由表可否控制也不太清楚,那麼你能夠選擇 Flannel 利用 Vxlan 做爲 backend 的這種方案。若是你確信你的網絡是 2 層可直連的,你能夠進行選用 Calico 或者 Flannel-Hostgw 做爲一個 backend;
最後就是對 Network Policy,在運維和使用的時候,它是一個很強大的工具,能夠實現對進出流的精確控制。實現的方法咱們也介紹了,要想清楚你要控制誰,而後你的流要怎麼去定義。
最後留一些思考,你們能夠想想:
爲何接口標準化 CNI 化了,可是容器網絡卻沒有一個很標準的實現,內置在 K8s 裏面?
Network Policy 爲何沒有一個標準的 controller 或者一個標準的實現,而是交給這個容器網絡的 owner 來提供?
有沒有可能徹底不用網絡設備來實現容器網絡呢?考慮到如今有 RDMA 等有別於 TCP/IP 的這種方案。
在運維過程當中網絡問題比較多、也比較難排查,那麼值不值得作一個開源工具,讓它能夠友好的展現從 container 到 Host 之間、Host 到 Host 之間,或者說封裝及解封裝之間,各個階段的網絡狀況,有沒有出現問題,可以快速的定位。據我所知應該如今是沒有這樣的工具的。
以上就是我對 K8s 容器網絡的基本概念、以及 Network Policy 的一些介紹。
「 阿里巴巴雲原生微信公衆號(ID:Alicloudnative)關注微服務、Serverless、容器、Service Mesh等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發者的技術公衆號。」