今天要講的是 k8s 叢集對於 Workload 管理做講解
以下將會解釋一些名詞定義, 以方邊後續解說
一個應用跑在 k8s 叢集上叫作 Workload
Workload 可以是一到多個 Pod 所組成
Pod 整個運行周期, 可以分成幾個階段
Pending: 當 Pod 被 kubelet 開始生成 Pod 所需資源, 但還沒完成資源建立
Running: 當 Pod 建立完成, 所有資源都建立完成, 但還有些 Container 沒有到 Desired staus 或是即將 Restart
Succeeded: 所有 Container 都成功運行, 並且沒有 Restart
Failed: 所有 Container 都進結束運行, 並且至少有一個是因為失敗而結束
Unknown: 發生某些因素造成 Pod 狀態無法獲取
狀態轉換圖描述如下:
前面有很多章節在講解到 Pod 的發佈, 都是直接透過 Deployment 來處理
然而, 其實還是可以獨立產生一個 Pod
Pod 本身具有上述的生命周期需要注意
所以 k8s 叢集並不是直接與 Pod 做互動
而是透過一些管理元件來處理, 比如說 Deployment, ReplicaSet 等等
這些管理元件被稱為 Workload Resources
要達成一個 Workload 就會透過以下 Workload Resources 來進行管理
k8s 叢集用 ReplicaSet 來管控多個相同 Pod 組成的集合能夠維持一定的量
透過 selector 來找尋對應 labels 的 Pod
k8s 叢集用 Deployments 來管控多個 ReplicaSet
當 Deployment 建立時, replicas 參數用來設定 ReplicaSet 建立的數量
範例語法如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
k8s 叢集用 StatefulSet 來運行一或多個相關具有狀態的 Pod
舉例來說:
當一個 Workload 需要保存狀態, 這時就可以使用 StatefulSet 來建立
並且讓每個 Pod 都有 PersistentVolume 來存放狀態
透過 StatefulSet 可以拓展資料備份, 讓 Workload 更據可靠性
k8s 叢集用 DaemonSet 來運行提供節點上一些基礎功能的 Pod,
比如一些網路輔助功能工具, 或是一些擴充工具
Job 代表一些只跑一次的工作
CrobJobs 則會根據定義的排程周期去執行
在更大的 k8s 生態系, 可能會找到更多第三方提供的 Workload Resources 來定義更多運行方式
k8s 提供 custom resources definition 來使用這些第三方提供的 Workload Resources
這樣就可以提供更多樣性, 更完善的運行 Pod 的方式