本篇文章講述了Kubernetes內部元件的工作原理,及建立Pod的流程。如果你是運維人員或者是Kubernetes的使用者,你可以不需要知道Kubernetes的內部工作原理,但是如果你想理解Kubernetes內部的工作原理,這篇文章非常適合你。
讀這篇文章的前提是,你已經大致瞭解並會運用Kubernetes。這篇文章不會去描述什麼是Kubernetes及其元件(如:Pod、Node、Kubelet)。
本篇將討論Kubernetes核心元件及這些核心元件是如何讓Kubernetes 對“爵士樂即興演奏”。通常將像Kubernetes這樣的通用系統稱為容器的 “管絃樂編排”。但是管絃樂編排,必須有一個預先計劃的指揮家。因此,這並不是Kubernetes的一個好的描述。相反,Kubernetes更像是爵士樂即興演奏,有一系列演員互相配合協調完成演奏。
接下來,開始介紹每個核心元件的功能。然後將看一個典型的排程和啟動一個Pod的流程。
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則正好相反。(譯者認為此處概括的非常準確)
Kubernetes的核心元件是API Server,它是Kubernetes系統和etcd直接對話的唯一元件。實際上,etcd是API Server的實現細節,理論上也可以用其他分散式儲存系統來支援Kubernetes。
API Server是一個策略元件,提供對etcd的過濾訪問。它的作用本質上是相對通用的,目前正在被分解處理。因此,API Server也可以用於其他系統的控制平面。
API Server的主要貨物是資源,透過暴露簡單的REST API向外提供服務。這些資源有一個標準結構可以實現一些擴充套件功能。無論如何,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伺服器資源的元件。 第二個元件將對幾乎立即發生的變化做出反應。
業務邏輯:Controller Manager and Scheduler
這些是透過API Server進行協調的元件。這些稱為Controller Manager和Scheduler的元件系結到單獨的伺服器Master上。
-
查詢未分配給節點的Pod(未系結的Pod);
-
檢查叢集的狀態(快取在記憶體中);
-
選擇具有空閑空間並滿足其他約束條件的節點;
-
將pod系結到該節點。
Controller Manager元件,實現ReplicaSet的行為。(ReplicaSet可以確保任何時候都可以執行一個Pod模板的副本數量)。控制器將根據資源中的選擇器 監控ReplicaSet 資源和一組Pod。為了保持在ReplicaSet中穩定的一組Pod,控制器將建立、銷毀Pod。
每一個Node上都有一個Agent。這也像其他元件一樣對API Server進行身份驗證。Agent負責監視系結到其節點的一組Pod,並確保這些Pod正常執行,並且能實時傳回這些Pod的執行狀態。
這個時序圖展示了建立pod的流程,基本的流程如下:
-
使用者提交建立Pod的請求,可以透過API Server的REST API ,也可用Kubectl命令列工具,支援Json和Yaml兩種格式;
-
API Server處理使用者請求,儲存Pod資料到etcd;
-
Schedule透過和API Server的watch機制,檢視到新的Pod,嘗試為Pod系結Node;
-
過濾主機:排程器用一組規則過濾掉不符合要求的主機,比如Pod指定了所需要的資源,那麼就要過濾掉資源不夠的主機;
-
主機打分:對第一步篩選出的符合要求的主機進行打分,在主機打分階段,排程器會考慮一些整體最佳化策略,比如把一個Replication Controller的副本分佈到不同的主機上,使用最低負載的主機等;
-
選擇主機:選擇打分最高的主機,進行binding操作,結果儲存到etcd中;
-
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的原理有更深入的認識。
原文連結:https://blog.heptio.com/core-kubernetes-jazz-improv-over-orchestration-a7903ea92ca
本次培訓內容包括:Docker基礎、容器技術、Docker映象、資料共享與持久化、Docker三駕馬車、Docker實踐、Kubernetes基礎、Pod基礎與進階、常用物件操作、服務發現、Helm、Kubernetes核心元件原理分析、Kubernetes服務質量保證、排程詳解與應用場景、網路、基於Kubernetes的CI/CD、基於Kubernetes的配置管理等,點選瞭解具體培訓內容。
長按二維碼向我轉賬
受蘋果公司新規定影響,微信 iOS 版的贊賞功能被關閉,可透過二維碼轉賬支援公眾號。