1. 程式人生 > 實用技巧 >Kubernetes基本架構

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 中.