工作負載是在Kubernetes上運行的應用程序。無論您的工作負載是單個組件還是協同工作的多個組件,您都可以在Kubernetes上的一組Pod中運行它。在Kubernetes中,工作負載是對一組Pod的抽象模型,用于描述業務的運行載體,包括Deployment、Statefulset、Daemonset、Job、CronJob等多種類型。
云容器引擎CCE提供基于Kubernetes原生類型的容器部署和管理能力,支持容器工作負載部署、配置、監控、擴容、升級、卸載、服務發現及負載均衡等生命周期管理。
Pod
Pod是Kubernetes創建或部署的最小單位。一個Pod封裝一個或多個容器(container)、存儲資源(volume)、一個獨立的網絡IP以及管理控制容器運行方式的策略選項。
Pod使用主要分為兩種方式:
- Pod中運行一個容器。這是Kubernetes最常見的用法,您可以將Pod視為單個封裝的容器,但是Kubernetes是直接管理Pod而不是容器。
- Pod中運行多個需要耦合在一起工作、需要共享資源的容器。通常這種場景下應用包含一個主容器和幾個輔助容器(SideCar Container),例如主容器為一個web服務器,從一個固定目錄下對外提供文件服務,而輔助容器周期性的從外部下載文件存到這個固定目錄下。
圖 Pod

實際使用中很少直接創建Pod,而是使用Kubernetes中稱為Controller的抽象層來管理Pod實例,例如Deployment和Job。Controller可以創建和管理多個Pod,提供副本管理、滾動升級和自愈能力。通常,Controller會使用Pod Template來創建相應的Pod。
Deployment
Pod是Kubernetes創建或部署的最小單位,但是Pod是被設計為相對短暫的一次性實體,Pod可以被驅逐(當節點資源不足時)、隨著集群的節點崩潰而消失。Kubernetes提供了Controller(控制器)來管理Pod,Controller可以創建和管理多個Pod,提供副本管理、滾動升級和自愈能力,其中最為常用的就是Deployment。
圖 Deployment

一個Deployment可以包含一個或多個Pod副本,每個Pod副本的角色相同,所以系統會自動為Deployment的多個Pod副本分發請求。
Deployment集成了上線部署、滾動升級、創建副本、恢復上線的功能,在某種程度上,Deployment實現無人值守的上線,大大降低了上線過程的復雜性和操作風險。
StatefulSet
Deployment控制器下的Pod都有個共同特點,那就是每個Pod除了名稱和IP地址不同,其余完全相同。需要的時候,Deployment可以通過Pod模板創建新的Pod;不需要的時候,Deployment就可以刪除任意一個Pod。
但是在某些場景下,這并不滿足需求,比如有些分布式的場景,要求每個Pod都有自己單獨的狀態時,比如分布式數據庫,每個Pod要求有單獨的存儲,這時Deployment就不能滿足需求了。
詳細分析下有狀態應用的需求,分布式有狀態的特點主要是應用中每個部分的角色不同(即分工不同),比如數據庫有主備,Pod之間有依賴,對應到Kubernetes中就是對Pod有如下要求:
- Pod能夠被別的Pod找到,這就要求Pod有固定的標識。
- 每個Pod有單獨存儲,Pod被刪除恢復后,讀取的數據必須還是以前那份,否則狀態就會不一致。
Kubernetes提供了StatefulSet來解決這個問題,其具體如下:
-
StatefulSet給每個Pod提供固定名稱,Pod名稱增加從0-N的固定后綴,Pod重新調度后Pod名稱和HostName不變。
-
StatefulSet通過Headless Service給每個Pod提供固定的訪問域名,Service的概念會在后面章節中詳細介紹。
-
StatefulSet通過創建固定標識的PVC保證Pod重新調度后還是能訪問到相同的持久化數據。

DaemonSet
DaemonSet是這樣一種對象(守護進程),它在集群的每個節點上運行一個Pod,且保證只有一個Pod,這非常適合一些系統層面的應用,例如日志收集、資源監控等,這類應用需要每個節點都運行,且不需要太多實例,一個比較好的例子就是Kubernetes的kube-proxy。
DaemonSet跟節點相關,如果節點異常,也不會在其他節點重新創建。
圖 DaemonSet

Job和CronJob
Job和CronJob是負責批量處理短暫的一次性任務(short lived one-off tasks),即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束。
- Job:是Kubernetes用來控制批處理型任務的資源對象。批處理業務與長期伺服業務(Deployment、Statefulset)的主要區別是批處理業務的運行有頭有尾,而長期伺服業務在用戶不停止的情況下永遠運行。Job管理的Pod根據用戶的設置把任務成功完成就自動退出(Pod自動刪除)。
- CronJob:是基于時間的Job,就類似于Linux系統的crontab文件中的一行,在指定的時間周期運行指定的Job。
任務負載的這種用完即停止的特性特別適合一次性任務,比如持續集成。
工作負載生命周期說明
表 狀態說明
| 狀態 | 說明 |
|---|---|
| 運行中 | 所有實例都處于運行中才是運行中。 |
| 未就緒 | 容器處于異常、實例數為0或pending狀態時顯示此狀態。 |
| 升級/回滾中 | 觸發升級或回滾動作后,工作負載會處于升級/回滾中。 |
| 可用 | 當多實例無狀態工作負載運行過程中部分實例異常,可用實例不為0,工作負載會處于可用狀態。 |
| 執行完成 | 任務執行完成,僅普通任務存在該狀態。 |
| 已停止 | 觸發停止操作后,工作負載會處于停止狀態,實例數變為0。v1.13之前的版本存在此狀態。 |
| 刪除中 | 觸發刪除操作后,工作負載會處于刪除中狀態。 |
| 暫停中 | 觸發暫停操作后,工作負載會處于暫停中狀態。 |