Kubernetes基本架構
簡介
Kubernetes是希臘語,翻譯過來是:舵手
的意思,原型是Google內部使用的Borg叢集管理系統,可以說是集結了Borg設計思想的精華,並且吸收了Borg系統中的經驗和教訓。
它不單單是一個編排系統,而是提供一個規範,可以讓你來描述叢集的架構,定義服務的最終狀態Kubernetes可以幫你將系統自動地達到和維持在這個狀態。Kubernetes作為雲原生應用的基石,相當於一個雲作業系統,其重要性不言而喻。
kubernetes 在 2014 年釋出了第一個版本,目前開源並託管在 Github 上。
https://github.com/Kubernetes
目前,AWS、阿里雲、微軟雲,目前已經原生支援 K8S ,目前已經可以讓使用者直接部署雲原生的服務。
- 有什麼優勢
- 基於 Borg 系統,設計成熟,開源、且輕量級,簡單易學、容易理解;
- 模組化,可插拔,支援鉤子,可任意組合,例如:網路元件 flannel,儲存外掛;
- 故障發現(存活性探針)和自我修復能力(副本數量)、服務滾動升級(就緒探針)和線上擴容(副本數量)金鑰和配置管理;
- 可擴充套件的資源自動排程機制(多維度的水平自動擴容)、多粒度的資源配額管理能力(資源限制)。
環境結構
k8s是一個叢集,它可以整合多臺計算機的計算能力,它是一種有中心節點模式的叢集,在k8s叢集中,主機主要分為兩種角色:
master:叢集的管理節點,一般是一個或者一組節點,一般3個就足夠了 node:提供計算資源的節點,就是執行容器的節點,可以擴充套件
ApiServer(對外服務介面)
k8s接收使用者建立容器的請求的是Kubernetes Cluster,k8s對外提供服務的介面就是一個api介面,一般是通過程式來訪問,或者通過一個現成的客戶端程式來操作。在k8s master上就有這麼一個元件叫ApiServer,用於接收客戶端請求,解析客戶端請求,主要功能有認證授權
、資料校驗
、叢集狀態變更
,以及負責其他模組直接的相互通訊和資料互動,只有api server才能操作etcd(k8s的資料儲存元件),其他模組想要獲取資料需要通過api server提供的介面進行相關資料操作。
Scheduler(排程器,為使用者分配node節點)
scheduler watch apiserver,接受系統或使用者請求是執行,如何要執行一個pod,那麼 Master 會使用排程器(scheduler)根據請求來分配一個能夠執行容器的 nodes 節點,例如:根據使用者對資源要求,CPU、記憶體、來評估哪個 nodes 最合適執行。
大概的過程就是:首先是預選,從 nodes 中挑選出符合使用者容器執行要求的,然後在這些預選結果中進行優選,選出最佳的適配 node。
Controller(控制器,類似於哨兵監控)
如果執行容器的節點宕機或者容器本身執行出現問題,kubernetes 能夠在其他節點再啟動一個一模一樣的容器,這就是 Kubernetes 提供的自愈能力。
控制器就實現了監控它所負責的每一個容器的健康狀態,一旦發現不健康了,那麼控制器會向 Master 傳送請求,Master 會再次由排程器挑選出合適的節點再次執行這個容器。
它能持續性探測所管理的容器,一旦不健康,或不符合使用者定義的健康狀態,就會由它發起來請求,來保證容器向用戶希望的健康狀態遷徙。
而 Kubernets 支援眾多的控制器,支援容器健康的控制器只是其中一種。
ControllerManager(制器管理器,管理Controller)
在 Master 內建元件中有一個控制器管理器,它負責監視著每一個控制器,如果控制器不健康無法工作,那麼由控制器管理器來確保控制器的健康,由於 Master 有多個,所以具有冗餘性
Pod(原子排程單元,容器的封裝,執行單位)
在 Kubernetes 上排程的原子單元,Kubernetes 不直接排程容器,而是 Pod,Pod可以理解為容器的二次封裝,可以由一個或者多個容器組成,多個容器共享同一個網路名稱空間:NET、UTS、IPC。
同一個 POD 裡的容器,還能共享同一個儲存卷,儲存卷可以屬於 POD。
一般一個 POD 只執行一個容器,如果需要在POD放多個容器,那麼一般有一個主容器,其他容器是為主容器提供服務的。
Node(工作節點,計算節點)
提供計算資源的節點,就是執行 Pod 的主機,Kubenetes Cluster 統一管理所有的 node 節點的計算資源,當用戶請求建立資源的時候,可以檢查目前叢集還有沒有資源可以執行使用者的容器,這實現了統一排程統一管理的一個平臺。
Label(標籤)
一個由 key = value
組成的標籤,可以為 POD 打上一個標籤。
Selecter(標籤選擇器)
叢集中執行的眾多 POD ,前面提到一個控制器可以管理若干個 POD ,那麼控制器如何從叢集中執行的所有 POD 中挑選出來自己需要管理的 POD 呢?
在建立一個 POD 的時候為 POD 打上一個標籤,讓程式可以通過這個標籤來識別出來這個POD,還可以用來區分一組相同功能的POD,例如:建立四個nginx pod,可以給每個pod加一個 K/V型別的標籤如:app=nginx,將來找出這四個 nginx pod,那麼條件就是根據 擁有 key 為 app 的pod 並且 value 為 nginx 來挑出這組 POD。
標籤不是 POD 唯一具有的機制,其他的元件同樣可以有標籤。
架構及元件
Etcd
用於 Kubernetes 的後端資料儲存,所有叢集資料都儲存在此處
Master 節點負責維護叢集的目標狀態,上面執行的主控元件有
kube-apiserver # 對外暴露了 Kubernetes API,它是的 Kubernetes 前端控制層,只有 API Server 會與 etcd 通訊,其它模組都必須通過 API Server 訪問叢集狀態
kube-controller-manager # 處理叢集中常規任務,它是單獨的程序,內部包含多個控制器,例如維護 POD 數量
kube-scheduler # 監視新建立的 Pod 為新建立的 POD 分配合適的 node 節點
Node 節點實際負責實施,也就是執行 POD 的節點,上面執行的元件有
kubelet # 節點自注冊和節點狀態更新,它監測已經分配給自己的 Pod,為 POD 準備卷,下載 POD 所需的 Secret,下載映象並執行,進行生命週期探測,上報 POD 和節點狀態
kube-proxy # 通過維護主機上的網路規則並執行連線轉發,將 Kubernetes 提供的網路服務代理到每個節點上,實現了Kubernetes服務抽象
docker # 用於執行容器
外掛
外掛是增強叢集功能的 Pod 和 Service,外掛物件本身是受名稱空間限制的,被創建於 kube-system 名稱空間.
DNS
雖然其他外掛並不是必需的,但所有 Kubernetes 叢集都應該具有Cluster DNS,許多應用依賴於它,為 Kubernetes 服務提供DNS記錄,容器啟動該後會自動將 DNS 伺服器包含在 resolv.conf 中.