您好,登錄后才能下訂單哦!
作者 |?阿里巴巴高級技術專家? 葉磊
本文來介紹一下 Kubernetes 對網絡模型的一些想法。大家知道 Kubernetes 對于網絡具體實現方案,沒有什么限制,也沒有給出特別好的參考案例。Kubernetes 對一個容器網絡是否合格做出了限制,也就是 Kubernetes 的容器網絡模型。可以把它歸結為約法三章和四大目標。
先來看下約法三章:
后文中會講一下我個人的理解,為什么 Kubernetes 對容器網絡會有一些看起來武斷的模型和要求。
四大目標其實是在設計一個 K8s 的系統為外部世界提供服務的時候,從網絡的角度要想清楚,外部世界如何一步一步連接到容器內部的應用?
最終要達到目標,就是外部世界可以連接到最里面,對容器提供服務。
對基本約束,可以做出這樣一些解讀:因為容器的網絡發展復雜性就在于它其實是寄生在 Host 網絡之上的。從這個角度講,可以把容器網絡方案大體分為?Underlay/Overlay?兩大派別:
為什么社區會提出 perPodperIP 這種簡單武斷的模型呢?我個人是覺得這樣為后面的 service 管理一些服務的跟蹤性能監控,帶來了非常多的好處。因為一個 IP 一貫到底,對 case 或者各種不大的事情都會有很大的好處。
下面簡單講一下,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;
最后留一些思考,大家可以想一想:
為什么接口標準化 CNI 化了,但是容器網絡卻沒有一個很標準的實現,內置在 K8s 里面?
Network Policy 為什么沒有一個標準的 controller 或者一個標準的實現,而是交給這個容器網絡的 owner 來提供?
有沒有可能完全不用網絡設備來實現容器網絡呢?考慮到現在有 RDMA 等有別于 TCP/IP 的這種方案。
以上就是我對 K8s 容器網絡的基本概念、以及 Network Policy 的一些介紹。
“ 阿里巴巴云×××icloudnative×××erverless、容器、Service Mesh等技術領域、聚焦云原生流行技術趨勢、云原生大規模的落地實踐,做最懂云原生開發×××
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。