K8S的SDN容器网络解决方案【机制篇】
戳藍字“CSDN云計算”關注我們哦!
編者按:關于容器網絡的解決方案業界已經有較多的討論,筆者無意繼續贅述。本文從K8S的網絡實現入手,重點闡述SDN在容器網絡中的應用價值。K8S及其網絡模型體現了鮮明的解耦設計思想,采用SDN技術實現K8S容器網絡,并與相應的生態組件形成SDN監管控一體化解決方案,可以更好地提高整個系統的運營水平,更有效地提升企業的核心競爭力。本篇將談論的是K8S的機制原理。
綜述:K8S的基本機制是以“對象-控制器”架構模式為基礎設計與實現的。組件API server與etcd的主要功能是實現對各種資源對象REST風格的增刪改查CRUD、盯Watch操作。組件controller-manager包括了各種內置控制器,其功能是確保整個系統處于預期的狀態。這種數據存儲與應用邏輯分離的模式是各功能組件實現無狀態服務架構的關鍵。K8S集群針對基本操作單元Pod對象的處理主要是通過scheduler和kubelet實現的。實際上我們可以把scheduler看作是集群層面的Pod對象控制器,把kubelet理解為是節點層面Pod對象的創建與維護的控制器。
K8S場景下實現Pod互聯等的容器網絡特別是其數據轉發面遵循并適用網絡技術的一般性原則與實現。當前主流的容器網絡基本解決方案主要包括以Calico為代表的基于經典的三層路由/Netfilter模型的實現,和以OpenShift的SDN實現為代表的二層SDN/OVS模型的實現。而容器網絡的特殊性則主要體現在管理控制面實現、以及基于K8S擴展機制的SDN控制器云原生部署等方面。K8S及其網絡模型體現了鮮明的解耦設計思想,不論是在K8S與網絡組件之間,還是在容器網絡與Pod接入容器網絡之間等各方面。
狹義地講SDN的核心技術主要包括數據轉發面特別是流表流水線的設計和相應的基于SDN控制器平臺的應用的設計與實現等。SDN控制器與各節點上的SDN代理相配合完成系統容器網絡的項目租戶、網絡子網路由、安全策略與服務、SLA/QoS的管控,以及監控可視化等各項操作。而CNI-Plugin的主要功能則是在kubelet創建Pod時將之掛接到容器網絡上。在K8S場景下,SDN的價值同樣體現在與各種生態組件的集成,實現一體化監管控解決方案,可以更好地提升整個系統的運營水平。
圖1 K8S系統核心組件構成
K8S基本機制
K8S集群提供了以Pod為基本操作單元的容器化應用的部署、維護、擴展等功能。主要由主節點上的API server、etcd、controller-manager、scheduler等,以及工作節點上的kubelet、容器運行時等功能組件構成。命令行kubectl可以在主節點上也可以部署在遠程運行,并通過API server調用與K8S交互。etcd集群可以采用與主節點分離的方式進行部署。另外,即使是主節點不參與業務Pod的分配與創建,也需要運行有一個kubelet實例。
對象處理組件與功能
kube-apiserver:API server通過Web Service端點處理函數的注冊與相應的訪問請求相關聯,實現REST機制對資源對象的增刪改查CRUD盯Watch等的操作功能,是系統對外訪問的統一入口。而K8S集群內部各功能組件之間的互動也主要是通過API server 的Watch機制實現的。API server本身實現了無狀態服務架構模式。Web Service端點以API Group來管理分組和版本適配,分組包括核心組、擴展組、其他的auto scaling組、metrics組等。而Proxy類API server接口的作用是代理REST請求,并轉發給相應節點的kubelet進行實際的操作處理。此外API server還提供有各種web hook擴展機制。
etcd集群:etcd是Go語言編寫的基于raft分布式協議的高可用key-value存儲系統,作為API server的后臺用于K8S存儲各種資源對象包括外部擴展定制資源對象(CRD - Custom Resource Definition)等配置與狀態信息,支持典型的消息發布與訂閱機制,即Watch機制。etcd是K8S組件API server等實現無狀態服務架構的基礎。K8S集群內任何對資源對象的增刪改查CRUD盯Watch操作等都通過API server的storage接口統一與etcd交互,各組件不會直接操作etcd。
控制器架構模式及組件功能
控制器模式是K8S各組件功能實現的基本框架,其基礎主要是基于etcd特性在API server內部實現的List-Watch機制和相應的client-go客戶端平臺庫函數。
List-Watch機制:該機制是基于etcd本身的Watch特性的,屬于API server對資源對象CRUD操作的體系化擴展。API server內部向etcd發起的Watch只能訂閱某個對象的創建、刪除事件,無法設置過濾條件的,不能針對對象的屬性進行過濾;而API server實現對外部各種K8S功能組件發起的Watch請求的處理,并能夠針對對象屬性進行過濾。在集群運行過程中組件向API server發送REST請求進行Watch訂閱,告訴API server對什么資源對象及發生什么樣的變化事件感興趣。而每一個Watch操作的生命周期對應相應的HTTP REST請求的生命周期。
庫函數client-go包括了訪問API server的客戶端,以及支持控制器實現所需的相關平臺機制List-Watch的客戶端informer和事件隊列workqueue等。這樣控制器的設計與實現只需專注應用邏輯,只需提供對象的事件回調函數和相應的隊列處理功能即可。
圖2 K8S控制器架構模式
控制器架構模式:一個典型的控制器實現通過API server的List-Watch機制的客戶端informer與API server保持交互,跟蹤特定的資源對象的狀態與變化。對象變化的事件由informer調用相應的callback完成一些基本的處理,然后把相關的變更及對象信息放到workqueue里面。控制器的應用邏輯實現在worker協程里面。控制器可啟動多個worker協程來處理workqueue里的對象事件。根據對象的期望狀態和當前系統的實際情況進行相應的處理,并通過clients向API server發送行動請求。實際上也是通過對其他相關下游資源對象的設置,以實現整個集群向期望的狀態演進。此外,為緩解各組件模塊對API server的訪問壓力、提高處理性能,控制器的內部實現也都采用了緩存機制的支持。
kube-controller-manager:K8S內置了一系列的控制器,基本上都是嵌入在controller-manager進程里的。其中,Replication Controller的功能是確保集群中有且僅有指定個數的Pod實例在運行,可以通過調整RC中的副本數量來實現系統擴容或縮容,通過改變RC中的Pod模板來實現系統的滾動升級;Endpoints Controller中的Endpoints表示某個Service對應的所有Pod副本的訪問地址。此控制器的功能是通過監聽Service和對應的Pod副本的變化,負責生成和維護所有Endpoints對象。而工作節點上的kube-proxy就是通過監聽Service和Endpoints來配置相應的數據面實現相應的轉發和負載均衡功能。我們可以理解Endpoints Controller是K8S除Pod以外最重要的資源對象服務Service的集群層面的控制器,而kube-proxy則是相應節點層面的控制器;Namespace Controller的功能是在后臺實現優雅地刪除某Namespace下的Service Account、RC、Pod等資源對象及此Namespace本身;Service Accounts Controller的功能是為每個Namespace維護一個默認的Service Account,并與Token Controller配合實現K8S集群內部Pod訪問API server的認證功能。
K8S除本身內置的這些控制器外,也支持各種用戶自定義擴展。控制器可以運行在K8S主節點上,也可以運行在工作節點上;可以運行在K8S集群內,甚至運行在集群外。
圖3 Pod調度、創建、CNI-Plugin掛接容器網絡的處理時序
Pod處理組件與功能
基本上K8S的資源對象與控制器都是相互對應、配合起來完成相應的功能的。但如果注意到的話,在controller-manager中并沒有針對Pod對象操作的控制器。實際上K8S決定把Pod放到哪個節點上是由組件scheduler按照相應的策略決策的,而Pod的實際創建與維護是由kubelet完成的。所以我們可以理解為scheduler是Pod集群層面的控制器,kubelet則是Pod節點層面的控制器。
具體的來說,就是scheduler通過API server提供的Watch等接口,監聽并獲取到未調度的Pod和節點等的相關信息,通過過濾和優先級算分對節點篩選,選擇出最合適的節點,將Pod與此節點綁定,并把結果通過API server存儲到etcd中。在相應工作節點上的kubelet會去實際創建Pod的SandBox,調用CNI-Plugin進行相應的網絡配置掛接SandBox網絡名字空間到容器網絡上,創建和運行Pod所屬的init容器,最終創建和運行Pod的常規業務容器。
關于K8S的機制今天就先介紹到這里,接下來我們將介紹容器網絡的具體實現。
?
1.微信群:
添加小編微信:color_ld,備注“進群+姓名+公司職位”即可,加入【云計算學習交流群】,和志同道合的朋友們共同打卡學習!
2.征稿:
投稿郵箱:liudan@csdn.net;微信號:color_ld。請備注投稿+姓名+公司職位。
推薦閱讀
Kafka學習筆記
“拼多多”驚爆重大 Bug!程序員的眼淚,羊毛黨的狂歡
“黃鱔門”視頻女主播一審宣判!
12306能扛住明星出軌這種流量沖擊嗎?
V神說,解釋以太坊2.0最好的文章就是這篇了
以太坊升級的拖油瓶,竟只是這幾行代碼
程序員有話說 | 程序猿在乘地鐵的時候都在想什么??文?推 薦?
點擊“閱讀原文”,打開 CSDN App 閱讀更貼心!
喜歡就點擊“好看”吧!總結
以上是生活随笔為你收集整理的K8S的SDN容器网络解决方案【机制篇】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 装机怎么装系统 如何安装操作系统?
- 下一篇: 你需要掌握的事件分发高阶知识