Kubernetes筆記(六):瞭解控制器 —— Deployment
阿新 • • 發佈:2020-11-19
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