Deployment

本頁面說明 Kubernetes Deployment 物件及其在 Google Kubernetes Engine 上的使用方式。

什麼是 Deployment?

「Deployment」代表一組沒有獨特身分識別資訊的多個相同 Pod。Deployment 會執行應用程式的多個備用資源,並自動取代失敗或無法回應的執行個體。透過這種方式,Deployment 可協助確保應用程式可以有一或多個執行個體處理使用者要求。Deployment 是由 Kubernetes Deployment 控制器代管。

Deployment 會使用 Pod 範本,其中包含 Pod 的規格。Pod 規格會決定每個 Pod 的型態:應在其容器內執行哪些應用程式、Pod 應掛接哪些磁碟區、其標籤等等。

Deployment 的 Pod 範本變更時,系統會自動一次建立一個新的 Pod。

使用模式

Deployment 非常適合使用掛接在多個備用資源上的 ReadOnlyMany 或 ReadWriteMany 磁碟區的無狀態應用程式,但不適合使用 ReadWriteOnce 磁碟區的工作負載。針對使用 ReadWriteOnce 磁碟區的有狀態應用程式,請使用 StatefulSets。StatefulSets 是專門用來部署有狀態應用程式及叢集應用程式,以將資料儲存到永久儲存空間 (如 Compute Engine 永久磁碟)。StatefulSet 適合用來部署 Kafka、MySQL、Redis、ZooKeeper,以及其他需要不重複的永久身分和穩定的主機名稱的應用程式。

建立 Deployment

您可以使用 kubectl runkubectl applykubectl create 建立 Deployment 指令。

建立程序完成後,Deployment 可確保隨時都有所需數量的 Pod 正在執行中且可供使用。Deployment 會自動取代失敗或已從節點中移除的 Pod。

下列範例為 YAML 格式的 Deployment 資訊清單檔案:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

在本範例中:

  • 建立名為 nginx 的 Deployment,由 metadata: name 欄位指示。
  • Deployment 會建立三個複製的 Pod,以 replicas 欄位指示。
  • Pod 範本或 spec: template 欄位指示已為 Pod 加上 app: nginx 標籤。
  • Pod 範本的規格或 template: spec 欄位指示 Pod 執行 nginx 容器,而此容器執行的是 1.7.9 版的 nginx Docker Hub 映像檔。
  • Deployment 會開啟通訊埠 80 供 Pod 使用。

總結來說,Pod 範本包含下列指示,適用於此 Deployment 所建立的 Pod:

  • 每個 Pod 都加上 app: nginx 標籤。
  • 建立一個容器並命名為 nginx
  • 執行 1.7.9 版本的 nginx 映像檔。
  • 開啟通訊埠 80 以傳送和接收流量。

如要進一步瞭解如何建立 Deployment,請參閱建立 Deployment

更新 Deployment

您可以透過變更 Deployment 的 Pod 範本規格來更新 Deployment。變更規格欄位會自動觸發更新推行。您可以在 Google Cloud Platform Console 中使用 kubectl、Kubernetes API 或 GKE 工作負載選單。

根據預設,當 Deployment 觸發更新時,Deployment 即會停止 Pod,將 Pod 的數量逐漸減至零,然後排除並終止 Pod。接著,Deployment 會使用更新後的 Pod 範本來啟動新的 Pod。

執行中的新 Pod 數量足夠時,系統才會移除舊 Pod,並且在移除足夠數量的舊 Pod 後,才會建立新的 Pod。您可以執行 kubectl describe deployments 來查看 Pod 的啟動和移除順序。

Deployment 可確保執行中的備用資源數量比所需數量至少少一個,因此最多只會有一個 Pod 無法使用。同樣地,Deployment 也可確保備用資源數量比所需數量至少多出一個,而執行中的 Pod 數量最多只會比所需數量多出一個。

您可以使用 kubectl rollout undo 指令來復原更新,您也可以使用 kubectl rollout pause 暫時停止 Deployment。

管理 Deployment

以下是 Deployment 的常見管理工作清單:

狀態和生命週期

Deployment 的生命週期可分成三種狀態:進行中、完成或失敗。

「進行中」狀態表示 Deployment 正在執行啟動 Pod 或調度 Pod 資源等的工作。

「完成」狀態表示 Deployment 已成功完成其工作、所有執行中的 Pod 均採用最新規格且可供使用,並且沒有任何舊的 Pod 仍在執行中。

「失敗」狀態表示 Deployment 發生一或多個問題,造成 Deployment 無法完成工作。部分問題的發生原因包括配額或權限不足、映像檔提取錯誤、限制範圍或執行階段錯誤。如要調查導致 Deployment 作業失敗的原因,您可以執行 kubectl get deployment [DEPLOYMENT+NAME] -o yaml 並檢查 status: conditions 欄位中的訊息。

您可以使用 kubectl rollout status 指令監控 Deployment 進度或檢查其狀態。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件