1. 程式人生 > >Kubernetes筆記(六):瞭解控制器 —— Deployment

Kubernetes筆記(六):瞭解控制器 —— Deployment

Pod(容器組)是 Kubernetes 中最小的排程單元,可以通過 yaml 定義檔案直接建立一個 Pod。但 Pod 本身並不具備自我恢復(self-healing)功能。如果一個 Pod 所在的節點出現故障,或者排程程式自身出現問題,以及節點資源不夠或節點進入維護而驅逐 Pod 時,Pod 將被刪除,且不能自我恢復。 因此,Kubernetes 中我們一般不直接建立 Pod, 而是通過 Controller(控制器)來管理 Pod。 ## Controller Controller 能為 Pod 提供如下特性: * 水平擴充套件,控制 Pod 執行的副本數 * rollout,即版本更新 * self-healing,即自我恢復。當節點出現故障時,控制器可以自動地在另一個節點排程一個配置完全一樣的 Pod,以替換故障節點上的 Pod。 Kubernetes 中支援的控制器包括: * ReplicationController:用來維護一個數量穩定的 Pod 副本集合的控制器 * ReplicaSet:是 ReplicationController 的升級版,比 ReplicationController 多一個特性:支援基於集合的選擇器。 不支援滾動更新(RollingUpdate) * Deployment:包含了 ReplicaSet,可通過宣告式、滾動更新的方式更新 ReplicaSet 及其 Pod。對於無狀態應用,推薦使用 Deployment 部署 * StatefulSet:用於管理有狀態的應用程式 * DaemonSet:在節點上以守護程序的方式執行一個指定的 Pod 副本,例如監控節點、收集節點上的日誌時,可使用 DaemonSet * CronJob:按照預定的時間計劃建立 Job,類似於 linux 的crontab * Job:使用 Job 執行任務,執行完後結束 ## ReplicaSet Kubernetes 中,雖然一般使用 Deployment 來管理 Pod, 但 Deployment 中也是通過 ReplicaSet 來維護 Pod 的副本集合的,因此此處也對 ReplicaSet 進行簡單介紹。 在 ReplicaSet 的定義中,包含三部分: 1. selector: 標籤選擇器,用於指定哪些 Pod 歸該 ReplicaSet 管理,通過 `matchLabels` 來與 Pod 的 label 匹配。 2. replicas: 期望的 Pod 副本數,指定該 ReplicaSet 應該維持多少個 Pod 副本,預設為1。 3. template: Pod 定義模板,ReplicaSet 使用該模板的定義來建立 Pod。 ReplicaSet 的示例定義文件如下所示, ```yaml apiVersion: apps/v1 # api版本 kind: ReplicaSet # 資源型別 metadata: # 元資料定義 name: nginx-ds # ReplicaSet 名稱 spec: replicas: 2 # Pod 副本數量,預設1 selector: # 標籤選擇器 matchLabels: app: nginx template: # Pod 定義模板 metadata: # Pod 元資料定義 labels: app: nginx # Pod 標籤 spec: containers: # 容器定義 - name: nginx image: nginx ``` ReplicaSet 通過建立、刪除 Pod 容器組來確保符合 selector 選擇器的 Pod 數量等於 replicas 指定的數量。 ReplicaSet 建立的 Pod 中,都有一個欄位 `metadata.ownerReferences` 用於標識該 Pod 從屬於哪一個 ReplicaSet。可通過 `kubectl get pod pod-name -o yaml` 來檢視 Pod 的 ownerReference。 ReplicaSet 通過 selector 欄位的定義,識別哪些 Pod 應該由其管理, 不論該 Pod 是否由該 ReplicaSet 建立,即只要 selector 匹配, 通過外部定義建立的 Pod 也會被該 ReplicaSet 管理。因此需要注意 `.spec.selector.matchLabels` 與 `.spec.template.metadata.labels` 的定義一致, 且避免與其他控制器的 selector 重合,造成混亂。 ReplicaSet 不支援滾動更新,所以對於無狀態應用,一般使用 Deployment來部署, 而不直接使用 ReplicaSet。ReplicaSet 主要是被用作 Deployment 中負責 Pod 建立、刪除、更新的一種手段。 ## Deployment Deployment 物件包含 ReplicaSet 作為從屬物件,並且可通過宣告式、滾動更新的方式來更新 ReplicaSet 及其 Pod。ReplicaSet 現在主要是被用作 Deployment 中負責 Pod 建立、刪除、更新的一種手段。使用 Deployment 時,無需關心由 Deployment 建立的 ReplicaSet,Deployment 將處理所有與之相關的細節。同時,Deployment 還能以“宣告式”的方式管理 Pod 和 ReplicaSet (其本質是將一些特定場景的一系列運維步驟固化下來,以便快速準確無誤的執行),並提供版本(revision)回退功能。 Deployment 定義示例, ```yaml apiVersion: apps/v1 kind: Deployment # 物件型別,固定為 Deployment metadata: name: nginx-deploy # Deployment 名稱 namespace: default # 名稱空間,預設為 default labels: app: nginx # 標籤 spec: replicas: 4 # Pod 副本數,預設1 strategy: rollingUpdate: # 升級策略為滾動升級,由於replicas為4,則整個升級過程pod個數在3-5個之間 maxSurge: 1 # 滾動升級時超過 replicas 的最大 pod 數,也可以為百分比(replicas的百分比),預設為1 maxUnavailable: 1 # 滾動升級時不可用的最大 pod 數,也可為百分比(replicas的百分比),預設為1 selector: # 標籤選擇器,通過標籤選擇該 Deployment 管理的 Pod matchLabels: app: nginx template: # Pod 定義模板 metadata: labels: app: nginx # Pod 標籤 spec: # 定義容器模板,可以包含多個容器 containers: - name: nginx image: nginx:latest ports: - containerPort: 80 ``` 可通過 `kubectl explain xxx` 來檢視支援哪些配置選項, ```shell # 檢視 deployment 配置項 [root@kmaster ~]# kubectl explain deployment ... # 檢視 deployment.spec 模組的配置項 [root@kmaster ~]# kubectl explain deployment.spec KIND: Deployment VERSION: apps/v1 RESOURC