全部產品
Search
文件中心

Container Service for Kubernetes:建立工作負載

更新時間:May 27, 2025

在Kubernetes叢集中,工作負載(Workload)是指在叢集上啟動並執行各種應用程式和服務執行個體。您可以對工作負載進行部署、擴充、更新和恢複,以確保Pod的穩定性和服務的連續性。本文介紹多種不同的工作負載情境,包括無狀態應用Deployment、有狀態應用StatefulSet、守護進程DaemonSet、任務Job、批處理任務CronJob等。

Pod(容器組)

Pod是Kubernetes中的最小部署單元,它封裝了一個或多個容器(Container),以及共用儲存(Volume)、網路和配置資訊。在實際使用情境中,我們很少直接建立Pod,而是通過Controller來管理Pod,例如Deployment和StatefulSet等。

無狀態負載(Deployment)和有狀態應用(StatefulSet)

Deployment

在Kubernetes中,最初是通過ReplicaSet Controller指定Pod的副本數量(Replica)、標籤選取器(LabelSelector)和Pod模板。後續由Deployment Controller通過管理ReplicaSet間接管理一組Pod,進一步增強了控制和管理能力。

Deployment適用於對資料持久化和請求順序不敏感的情境,例如Web伺服器、微服務架構服務等。

典型情境

情境描述

無狀態Web服務

前端Web服務,這類服務時常需要彈性地處理不同時期的訪問量。Deployment Controller支援水平擴充、升級和復原。

微服務架構服務

多微服務的系統需要分別部署各個服務,每個服務都有獨立的生命週期和擴充需求。Deployment Controller支援獨立管理每個微服務的部署。

StatefulSet

在Deployment中,每個Pod都是獨立且無狀態的,不存在相互依賴關係。但在某些情境中,Deployment控制器並不能滿足需求,例如在分散式資料庫情境中,Pod之間存在狀態資訊和依賴關係,例如主備模式。這種情況下,使用StatefulSet能夠更有效地管理有狀態且互相關聯的Pod。

StatefulSet適用於需要持久化儲存和有序部署執行個體的情境,例如資料庫、分布式儲存系統等。

典型情境

情境描述

有狀態資料庫

有狀態資料庫通常需要持久化儲存,並且希望在Pod重新調度後能夠保留相同的網路標識和資料。例如,MySQL資料庫中的每個執行個體都有具體的資料和配置,重啟時也需要保持原狀。

分布式訊息佇列服務

分布式訊息佇列依賴於叢集中每個節點的有序狀態和持久化日誌。例如,Apache Kafka需要每個Broker節點的資料高度一致,並且要求日誌儲存在持久卷中以防止資料丟失。

Deployment和StatefulSet的區別

您可以根據Deployment和StatefulSet的區別進行選型。

對比項

Deployment

StatefulSet

適用情境

面向無狀態應用,例如Web伺服器、API服務等。適用於需要快速擴充和變換的情境。

面向有狀態應用,例如資料庫、Distributed File System等。適用於需要穩定持久化儲存和有序部署的情境。

持久化儲存

所有副本Pod共用一個持久化儲存聲明,當Pod重新調度或被更新時會重新掛載相同的PVC,繼續訪問相同的資料。

每個Pod擁有獨立持久化儲存卷聲明和固定命名,確保資料持久性和一致性。當Pod重啟或重新調度時持久化儲存保持不變。

網路標識

Pod沒有固定標識,Pod名和Pod IP地址是動態產生的。每次重建之後它們都會發生變化。

Pod擁有固定標識其格式為<StatefulSet名>-<序號>,例如web-0web-1等。當Pod發生重啟,其名稱也不會改變。

更新策略

  • Rolling Update(變換):

    變換過程中,舊版Pod會逐步被新版Pod替換,確保更新過程中服務是可用的。

  • Recreate(重建策略):

    舊版本的Pod會在新版本的Pod被建立之前被清除。這將導致服務在更新過程中存在短暫的中斷,適用於舊版本Pod和新版本Pod不能共存的情境。

  • RollingUpdate(變換):

    更新是按Pod序號進行的,即一個Pod更新完成並且就緒後,才會更新下一個Pod。

  • OnDelete

    需要手動刪除Pod,觸發該Pod的更新,適用於需要嚴格控制更新的情境。

服務發現

使用不同類型的Service實現服務發現,同時對Pod入口流量進行負載平衡,詳情請參見Service管理

每個Pod有一個唯一的固定DNS名稱,可以通過StatefulSet管理的Headless Service來進行穩定的服務發現,使得可以直接存取到每個Pod。

守護進程集(DaemonSet)

DaemonSet支援在叢集的每個節點上運行一個副本的Pod,用於部署需要在每個節點上都啟動並執行後台服務或監控進程,例如日誌收集、資源監控、網路外掛程式等。當節點加入或移出叢集時,DaemonSet會自動建立或刪除相應的Pod。

DaemonSet適用於確保同一類型的守護進程在Kubernetes叢集中的每個節點上運行。

典型情境

情境描述

日誌收集

DaemonSet適合用於日誌收集工具,例如ACK叢集中安裝的日誌採集組件。這些工具通常需要在每個節點上運行,能夠收集和處理節點上的所有記錄檔,並將其轉寄到集中式的日誌管理系統。

監控代理

在每個節點部署監控代理如Prometheus的Node Exporter或Datadog Agent,收集資源使用指標,從而保障叢集節點的狀態與效能即時監控。

普通任務(Job)和定時任務(CronJob)

在Kubernetes中,Job和CronJob是分別用於運行一次性任務和定期任務的Controller,用於處理無需持續啟動並執行工作負載,例如批處理任務、資料處理作業等。

  • Job是一種用於控制一批處理任務的控制器。當任務完成後,這些Pod將自動終止,適用於資料處理、備份等一次性任務的情境。

  • CronJob是一種用於管理Job的控制器,它通過Cron運算式定義調度時間,支援複雜的分、小時、日、月和周組合,適用於週期性任務,如定時備份資料庫和定期清理記錄檔。

管理工作負載對象

ACK中,您可以使用API、命令列工具(如kubectl)和控制台來管理工作負載,從而高效地部署、監控和擴充應用服務。

控制台

您可以通過Container Service管理主控台高效、便捷地、白屏化地建立、管理和監控工作負載。以下是各類工作負載的控制台管理操作。

命令列

您可以擷取叢集KubeConfig並通過kubectl工具串連叢集,與叢集進行互動,執行各類管理工作,如應用部署、資源管理和叢集監控等。

API

您可以通過OpenAPI來建立、更新、刪除以及監控工作負載等。詳細資料,請參見使用Kubernetes API

常見問題

如果您在使用工作負載時遇到問題,請參見工作負載FAQ進行排查。

相關文檔