Kubernetes 內部元件工作原理
翻譯自:https://blog.heptio.com/core-kubernetes-jazz-improv-over-orchestration-a7903ea92ca
原作者:Joe Beda (Dad of two. CTO of Heptio. Started Google Compute Engine, Kubernetes and Google Container Engine.)
本篇文章講述了Kubernetes內部元件的工作原理,及建立POD的流程。如果你是運維人員或者是Kubernetes的使用者,你可以不需要知道Kubernetes的內部工作原理,但是如果你想理解Kubernetes內部的工作原理,這篇文章非常適合你。
讀這篇文章的前提是,你已經大致瞭解並會運用Kubernetes。這篇文章不會去描述什麼是Kubernetes及其元件(如:Pod, Node, Kubelet)。
本篇將討論Kubernetes核心元件及這些核心元件是如何讓Kubernetes 對"爵士樂即興演奏"。通常將像Kubernetes這樣的通用系統稱為容器的 "管絃樂編排"。但是管絃樂編排,必須有一個預先計劃的指揮家。因此,這並不是Kubernetes的一個好的描述。相反,Kubernetes更像是爵士樂即興演奏,有一系列演員互相配合協調完成演奏。
接下來,開始介紹每個核心元件的功能。然後將看一個典型的排程和啟動一個Pod的流程。
1. Datastore: Etcd
Etcd是Kubernetes的儲存狀態的資料庫。雖然Kubernetes系統中有重要的記憶體快取,但Etcd被認為是記錄系統狀態。
Etcd的快速總結:它是一個叢集分散式資料庫,它可以提供分散式資料的一致性。這類的系統(如Zookeeper, Consul)是在 Google開發的chubby系統之後形成的,這些系統也稱為"鎖伺服器",因為他們可以實現分散式鎖。Etcd和chubby的資料模型是一個簡單的層次化的Key,並儲存了簡單的非結構化value,這看起來像是一個檔案系統。有意思的是,在Google, chubby 被頻繁用於為實現訪問本地檔案和物件儲存的功能的抽象檔案介面。然而,分散式資料庫的高度一致性,提供了資料的嚴格寫入順序並允許client原子性的對資料做更新操作。
可靠的系統的狀態管理是任何系統中非常困難的一件事情。在分散式系統中,它是更加困難的,因為它引入了一致性演算法,如raft或paxos。通過使用etcd,Kubernetes可以專注系統的其他部分。
Etcd的watch機制是Kubernetes工作的關鍵。系統允許client去執行輕量級的對於Key值變化事件的訂閱。當要watch的資料發生變化時, client會立即得到通知。這可以用作分散式系統元件之間的協調機制。 一個元件一旦寫入etcd,其他元件可以立即對該變化作出反應。
Etcd的訊息機制正好和PubSub訊息佇列機制相反。在許多訊息佇列系統系統中,topic不儲存真正的使用者資料,但釋出到這些topic的訊息含有豐富的資料。對於像Etcd這樣的系統,Key(類似於主題)儲存了真實的資料而訊息(資料變化通知)不含獨特的豐富訊息。換句話說,對於訊息佇列來說,topic很簡單,而像Etcd則正好相反。(譯者認為此處概括的非常準確)2. Policy Layer: API Server
Kubernetes的核心元件是API Server,它是Kubernetes系統和Etcd直接對話的唯一元件。實際上,etcd是API server的實現細節,理論上也可以用其他分散式儲存系統來支援Kubernetes.
API server是一個策略元件,提供對Etcd的過濾訪問。它的作用本質上是相對通用的,目前正在被分解處理。因此,API Server也可以用於其他系統的控制平面。
API server的主要貨物是資源,通過暴露簡單的REST API 向外提供服務。這些資源有一個標準結構可以實現一些擴充套件功能。無論如何,API Server,允許各類元件建立,讀取,寫入,更新,和監視資源。
API Server的具體的功能:- 認證和授權。Kubernetes有一個可插拔的認證系統。有一些內建的使用者認證機制和授權這些使用者訪問資源。此外,還有一些方法可用於向外部服務提供這些服務。這種可擴充套件性是Kubernetes構建的核心功能。
- API Server執行一組可以拒絕或修改請求的准入控制器。 這些允許策略被應用並設定預設值。 這是確保在API Server客戶端仍在等待請求確認時進入系統的資料有效性的關鍵。 雖然這些准入控制器目前正在編譯到API Server中,但目前正在進行的工作是使其成為另一種可擴充套件性機制。
- API Server 有助於API 版本控制。API 版本的一個關鍵問題是允許資源的欄位的改變,欄位新增,棄用,重新組織和以其他方式轉換。 API Server在Etcd中儲存資源的"true"表示,並根據滿足的API版本轉換/呈現該資源。 自專案早期開始,規劃版本控制和API的發展一直是Kubernetes的一項重要工作。
- API Server 一個重要特性是支援watch機制。這意味著API Server的客戶端可以使用與Etcd相同的協調模式。Kubernetes中的大多數協調包括寫入另一個元件正在監視的API伺服器資源的元件。 第二個元件將對幾乎立即發生的變化做出反應。
3. 業務邏輯:Controller Manager and Scheduler
這些是通過API Server 進行協調的元件。這些稱為Controller Manager和Scheduler的元件繫結到單獨的伺服器Master上Scheduler元件將做許多事情讓系統工作:
- 查詢未分配給節點的Pod(未繫結的Pod);
- 檢查叢集的狀態(快取在記憶體中);
- 選擇具有空閒空間並滿足其他約束條件的節點;
- 將pod繫結到該節點。
4.Node Agent: Kubelet
每一個Node上都有一個Agent。這也像其他元件一樣對API Server進行身份驗證。Agent負責監視繫結到其節點的一組Pod,並確保這些Pod正常執行,並且能實時返回這些Pod的執行狀態。5.典型的流程
為幫助理解,建立Pod的整個流程,時序圖如下:這個時序圖展示了建立pod的流程,基本的流程如下:
1. 使用者提交建立Pod的請求,可以通過API Server的REST API ,也可用Kubectl命令列工具,支援Json和Yaml兩種格式;
2. API Server 處理使用者請求,儲存Pod資料到Etcd;
3. Schedule通過和 API Server的watch機制,檢視到新的pod,嘗試為Pod繫結Node;
4. 過濾主機:排程器用一組規則過濾掉不符合要求的主機,比如Pod指定了所需要的資源,那麼就要過濾掉資源不夠的主機;
5. 主機打分:對第一步篩選出的符合要求的主機進行打分,在主機打分階段,排程器會考慮一些整體優化策略,比如把一個Replication Controller的副本分佈到不同的主機上,使用最低負載的主機等;
6. 選擇主機:選擇打分最高的主機,進行binding操作,結果儲存到Etcd中;
7. kubelet根據排程結果執行Pod建立操作: 繫結成功後,會啟動container, docker run, scheduler會呼叫API Server的API在etcd中建立一個bound pod物件,描述在一個工作節點上繫結執行的所有pod資訊。執行在每個工作節點上的kubelet也會定期與etcd同步bound pod資訊,一旦發現應該在該工作節點上執行的bound pod物件沒有更新,則呼叫Docker API建立並啟動pod內的容器。
總結
通過使用API Server作為中心協調點,Kubernetes能夠以鬆耦合的方式,實現元件相互互動。 希望讀完此文,你可以對Kubernetes建立Pod的原理有更深入的認識。
此外:k8s 也提供qos 服務,ref: http://oj6ydypm2.bkt.clouddn.com/Kubernetes%E4%B8%AD%E7%9A%84%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86_%E4%B8%81%E6%B5%B7%E6%B4%8B.pdf
相關文章
- Flink 核心元件 內部原理 多圖剖析元件
- Kubernetes API server工作原理APIServer
- 現代瀏覽器內部工作原理(附詳細流程圖)瀏覽器流程圖
- Docker內部元件介紹Docker元件
- Thanos工作原理及元件簡介元件
- 淺析 Kubernetes 控制器的工作原理
- SAP: 工作區域(或內部表) "GT_SFLIGHT" 不是扁平的,或者包含參考或內部表作為元件元件
- mysqldump的內部實現原理MySql
- pinpoint-php-aop 內部原理PHP
- Netty進階內部元件詳解Netty元件
- Spark SQL / Catalyst 內部原理 與 RBOSparkSQL
- MongoDB 儲存引擎與內部原理MongoDB儲存引擎
- 深入解析 oracle drop table內部原理Oracle
- JavaScript 是如何工作:Shadow DOM 的內部結構 + 如何編寫獨立的元件!JavaScript元件
- async、await和generator函式內部原理AI函式
- Kubernetes官方java客戶端之四:內部應用Java客戶端
- JavaScript是如何工作的:深入類和繼承內部原理 + Babel和TypeScript 之間轉換JavaScript繼承BabelTypeScript
- 原來 ArrayList 內部原理這麼簡單
- Java HashMap原理及內部儲存結構JavaHashMap
- 放大器內部結構原理圖解圖解
- sql server 2005 資料修改的內部原理SQLServer
- Vue實現內部元件輪播切換效果Vue元件
- Java 阻塞佇列(BlockingQueue)的內部實現原理Java佇列BloC
- js內部事件機制–單執行緒原理JS事件執行緒
- Vue原始碼: 關於vm.$watch()內部原理Vue原始碼
- 八問八答搞懂Transformer內部運作原理ORM
- 開源|ns4_chatbot通訊元件的工作原理元件
- Kubernetes Metrics Server元件Server元件
- 工作量證明(PoW)的內部攻擊模型模型
- Tungsten Fabric知識庫丨更多元件內部探秘元件
- java內部類,區域性內部類,靜態內部類,匿名內部類Java
- kubernetes整合GPU原理GPU
- 大資料3_04_zookeeper概述和內部原理大資料
- 譯—現代瀏覽器內部原理(第一部分)瀏覽器
- 當你建立了一個 Deployment 時,Kubernetes 內部發生了什麼?
- 當一個 Pod 被排程時,Kubernetes 內部發生了什麼?
- 10-Java內部類——成員內部類、區域性內部類、匿名內部類Java
- Shadow DOM 內部構造及如何構建獨立元件元件