部署無狀態 Linux 應用程式


本頁說明如何使用 Google Kubernetes Engine (GKE) 部署無狀態 Linux 應用程式。您也可以瞭解如何部署無狀態的 Windows 應用程式

總覽

無狀態應用程式是指不會將資料或應用程式狀態儲存到叢集或永久儲存空間的應用程式。資料和應用程式狀態將留在用戶端,這使得無狀態應用程式更具擴充性。例如,當您有一個無狀態的前端應用程式,您可以部署多個備用資源以提高其可用性,並在需求較低時縮減資源,而備用資源亦不需要獨特身分識別資訊。

Kubernetes 使用 Deployment 控制器,將無狀態應用程式部署為統一且非唯一的 Pod。Deployment 管理應用程式的「所需狀態」:應用程式中應執行的 Pod 數量、應執行的容器映像檔版本、應標記的 Pod 內容等等。您可以透過更新 Deployment 的 Pod 規格來動態變更所需狀態。

相較於無狀態的應用程式,有狀態的應用程式會使用永久儲存空間來儲存資料,並使用 StatefulSets 部署具有獨特識別資訊的 Pod。

事前準備

開始之前,請確認你已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。
  • 確保您的容器化應用程式儲存在映像檔註冊資料庫中,如 Artifact Registry

  • 如果您是第一次使用 GKE,請先完成快速入門導覽課程,您將在課程中啟用 GKE API,並瞭解產品的運作方式。

剖析 Deployment

以下是簡易 Deployment 資訊清單檔案的範例:此 Deployment 會建立三個複製的 Pod (其標籤為 run=my-app),以執行儲存於 Artifact Registryhello-app 映像檔:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      run: my-app
  template:
    metadata:
      labels:
        run: my-app
    spec:
      containers:
      - name: hello-app
        image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

在這個例子中:

  • .spec.replicas:是 Deployment 管理的複製 Pod 數量。
  • .spec.template.metadata.labels:是指派給每個 Pod 的標籤,讓 Deployment 用來管理 Pod。
  • .spec.template.spec:是 Pod 規格,定義每個 Pod 的執行方式。spec.containers 包含要在每個 Pod 中執行的容器名稱,以及應執行的容器映像檔。

如要進一步瞭解 Deployment 規格,請參閱 Deployment API 參考資料

建立 Deployment

您可以使用下列其中一個方法建立 Deployment:

  • 您可以使用 Google Cloud 主控台的「工作負載」選單,從您儲存於 Artifact Registry 的容器映像檔建立簡易的 Deployment
  • 您可以撰寫 Deployment 資訊清單,並執行 kubectl apply,以建立資源

kubectl apply

您可以透過宣告方式,使用 kubectl apply 從資訊清單檔案建立和更新 Deployment。這種方法保留對使用中資源所做的更新,而不會將變更併回資訊清單檔案。

若要從資訊清單檔案建立 Deployment,請執行下列指令:

kubectl apply -f DEPLOYMENT_FILE

DEPLOYMENT_FILE 替換為資訊清單檔案,例如 config.yaml

您也可以使用 kubectl apply -f DIRECTORY/,建立儲存目錄的資訊清單檔案所定義的所有物件 (現有物件除外)。

控制台

若要建立 Deployment,請執行下列步驟:

  1. 前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。

    前往「Workloads」(工作負載)

  2. 按一下「部署」

  3. 在「指定容器」下方,選取下列其中一個選項:

    • 「現有容器映像檔」:選擇 Artifact Registry 或 DockerHub 提供的容器映像檔。在「映像檔路徑」中,輸入容器映像檔的路徑和版本。

    • [New container image] (新增容器映像檔),即可使用以 Cloud Source RepositoriesCloud Build 建立的映像檔。

  4. (選用) 使用以下項目設定您的 Deployment:

    • 要傳遞到容器內的環境變數
    • 用於自訂執行階段的容器 entrypoint 的初始指令
  5. 依序點選「完成」和「繼續」

  6. 在「Configuration」(設定) 區段中,提供 Deployment 的應用程式名稱,並指定要在其中進行部署的 Kubernetes 命名空間

  7. 您也可以在「Labels」(標籤) 下,為 Deployment 新增 Kubernetes 標籤

  8. 如要儲存建立此 Deployment 的 YAML,以便稍後更新,請按一下「查看 YAML」。將 YAML 複製貼上到檔案中,然後儲存檔案,並點選「YAML Output」(YAML 輸出) 對話方塊中的「Close」(關閉)

  9. 從「Kubernetes Cluster」(Kubernetes 叢集) 下拉式選單中,選擇需要的叢集。

  10. 按一下 [Deploy] (部署)

檢查 Deployment

建立 Deployment 後,您可以使用下列其中一種方法進行檢查:

kubectl

若要取得 Deployment 的詳細資訊,請執行下列指令:

kubectl describe deployment DEPLOYMENT_NAME

DEPLOYMENT_NAME 改為 Deployment 的名稱。

若要列出 Deployment 建立的 Pod,請執行下列指令:

kubectl get pods -l KEY=VALUE

在這個指令中,-l 標記會指示 kubectl 為所有的 Pod 取得一個鍵/值標籤。例如,如果您標記了 Deployment run: my-app,您可以執行 kubectl get pods -l run=my-app 查看有該標籤的 Pod。

如要取得特定 Pod 的資訊:

kubectl describe pod POD_NAME

要查看 Deployment 的資訊清單,請執行下列命令:

kubectl get deployments DEPLOYMENT_NAME -o yaml

這個指令會以 YAML 格式顯示 Deployment 的使用中設定。

主控台

如要檢查 Deployment,請執行下列步驟:

  1. 前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。

    前往「Workloads」(工作負載)

  2. 在工作負載清單中,按一下要檢查的部署名稱。

  3. 在「部署詳細資料」頁面中,執行下列任一操作:

    • 按一下「修訂版本記錄」分頁標籤,即可查看 Deployment 的修訂版本記錄。
    • 按一下「事件」分頁標籤,即可查看與 Deployment 相關的所有事件。
    • 按一下「Logs」(記錄檔) 分頁標籤,查看部署作業中的容器活動記錄。
    • 點選「YAML」YAML分頁標籤,即可查看、複製及下載 Deployment 的 YAML 資訊清單。

更新 Deployment

您可以將更新發布到 Deployment 的 Pod 規格,如映像檔、資源用量/要求,或設定等。

您可以使用下列方法更新 Deployment:

  • 您可以使用Google Cloud console「Workloads」(工作負載) 選單中的「Rolling update」(滾動式更新) 選單及 YAML 編輯器。
  • 您可以在資訊清單中進行變更,並使用 kubectl apply 進行套用。
  • 您可以使用 kubectl set 更新 Pod 規格的 imageresourcesselector 欄位。
  • 您可以直接從殼層或在偏好的編輯器中使用 kubectl edit 更新 Deployment。

kubectl apply

您可以「套用」新的或更新過的資訊清單檔案來更新 Deployment。 這樣的做法適用於對 Deployment 進行多個變更的情況,像是資源調度,或是指定應用程式的新「版本」等。

若要更新 Deployment,請執行下列指令:

kubectl apply -f DEPLOYMENT_FILE

請將 DEPLOYMENT_FILE 替換為更新後的資訊清單檔案。

kubectl apply 指令會將資訊清單檔案套用至資源。如果指定的資源不存在,則這個指令會建立該資源。

kubectl 集

您可以使用 kubectl set 變更 Deployment 的映像檔、資源 (要求或限制) 或選取器欄位。

如要變更 Deployment 的映像檔,請執行下列指令:

kubectl set image deployment DEPLOYMENT_NAME IMAGE IMAGE:TAG

例如,如要將 Deployment 從 nginx 1.7.9 版更新至 1.9.1 版,請執行下列指令:

kubectl set image deployment nginx nginx=nginx:1.9.1

控制台

如要存取 Deployment 的「滾動式更新」選單:

  1. 前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。

    前往「Workloads」(工作負載)

  2. 在工作負載清單中,按一下要修改的部署作業名稱。

  3. 依序點選 「動作」>「滾動式更新」

  4. 設定更新策略的下列選用參數:

    • 最短準備完成秒數:指定新建立的 Pod 準備完成可以開始使用的最短秒數。
    • Maximum surge (可建立的 Pod 數量上限):指定可建立的 Pod 數量除以需要的 Pod 數量的上限。該值可以是絕對值或百分比。
    • Maximum unavailable (無法使用的 Pod 數量上限):指定更新過程中可以停機的 Pod 數量上限。該值可以是絕對值或百分比。
  5. 在「容器映像檔」下方,輸入更新後容器映像檔的路徑和版本。

  6. 按一下「更新」

復原更新

您可以使用 kubectl rollout undo 復原更新。

您可以將正在進行或已完成的更新復原到先前版本:

kubectl rollout undo deployment my-deployment

您也可以復原到特定版本:

kubectl rollout undo deployment my-deployment --to-revision=3

調度 Deployment 資源

您可以使用 Google Cloud 控制台或 kubectl scale 手動調度 Deployment 的資源。

您可以進一步瞭解如何自動調度 Deployment 的資源

kubectl

kubectl scale 隨時可用於調度 Deployment 的資源。

如要手動調度 Deployment 的資源,請執行下列指令:

kubectl scale deployment DEPLOYMENT_NAME --replicas NUMBER_OF_REPLICAS

NUMBER_OF_REPLICAS 替換為所需的複製 Pod 數量。

控制台

如要調度 Deployment 的資源,請執行下列步驟:

  1. 前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。

    前往「Workloads」(工作負載)

  2. 在工作負載清單中,按一下要修改的部署作業名稱。

  3. 依序點選 「動作」>「資源調度」>「編輯備用資源」

  4. 輸入 Deployment 的新副本數量。

  5. 按一下 [Scale] (擴充)

刪除部署作業

您可以使用 Google Cloud 控制台或 kubectl delete 刪除 Deployment。

kubectl

若要刪除 Deployment,請執行下列指令:

kubectl delete deployment DEPLOYMENT_NAME

主控台

如要刪除 Deployment,請執行下列步驟:

  1. 前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。

    前往「Workloads」(工作負載)

  2. 在工作負載清單中,選取一或多個要刪除的部署。

  3. 按一下「刪除」圖示

  4. 當系統提示時,按一下「Delete」(刪除)

後續步驟