部署有狀態應用程式

本頁說明如何使用 Google Kubernetes Engine 部署有狀態的應用程式。

總覽

有狀態的應用程式會將資料儲存至永久磁碟儲存空間,以便提供給伺服器、用戶端和其他應用程式使用。有狀態應用程式的範例為資料庫或鍵/值存放區,資料會儲存在這類空間中,並由其他應用程式擷取。

可以根據需要來動態佈建永久儲存空間,以便不需事先手動建立基礎磁碟區。在 Kubernetes 中,可透過建立 StorageClass 的方式來設定動態佈建。GKE 已安裝預設的 StorageClass,所以您可以動態佈建 Google Compute Engine 永久磁碟。

Kubernetes 使用 StatefulSet 控制器,將有狀態的應用程式部署為 StatefulSet 物件。StatefulSet 中的 Pod 彼此不可互換:每個 Pod 皆有一個唯一識別碼,無論排定在那個位置,都會保留這個識別碼。

相較於有狀態的應用程式,無狀態的應用程式不會在各個工作階段之間將用戶端資料儲存至伺服器。

事前準備

如要準備這項工作,請執行下列步驟:

  • 確認您已啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 確認您已安裝 Cloud SDK
  • 設定預設的專案 ID
    gcloud config set project [PROJECT_ID]
  • 如果您使用區域叢集,請設定預設的運算區域
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 如果您使用地區叢集,請設定預設的運算地區
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud 更新到最新版本:
    gcloud components update
  • 確保您的容器化應用程式儲存在映像檔註冊資料庫中,如 Container Registry

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

在 StatefulSet 中要求永久儲存空間

應用程式可以透過 PersistentVolumeClaim 物件來要求永久儲存空間。

通常除了 Pod 之外,PersistentVolumeClaim 物件也必須由使用者建立,但 StatefulSet 含有 volumeClaimTemplates 陣列,因此可自動產生 PersistentVolumeClaim 物件。每個 StatefulSet 備用資源會得到自己的 PersistentVolumeClaim 物件。

建立 StatefulSet

您可以使用 kubectl apply 建立 StatefulSet。

kubectl apply 使用資訊清單檔案來建立、更新及刪除叢集中的資源,是一種物件設定的陳述式方法。這種方法保留對使用中物件所做的寫入,而不會將變更併回物件設定檔。

下列是由個別建立的服務控管的 StatefulSet 簡易範例:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: [STATEFULSET_NAME]
spec:
  serviceName: [SERVICE_NAME]
  replicas: 3
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app=[APP_NAME]
    spec:
      containers:
      - name: [CONTAINER_NAME]
        image: ...
        ports:
        - containerPort: 80
          name: [PORT_NAME]
        volumeMounts:
        - name: [PVC_NAME]
          mountPath: ...
  volumeClaimTemplates:
  - metadata:
      name: [PVC_NAME]
      annotations:
        ...
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

其中:

  • [STATEFULSET_NAME]:您針對 StatefulSet 選擇的名稱
  • [SERVICE_NAME]:您針對服務選擇的名稱
  • [APP_NAME]:您針對在 Pod 中執行的應用程式選擇的名稱
  • [CONTAINER_NAME]:您針對 Pod 中的容器選擇的名稱
  • [PORT_NAME]:您針對 StatefulSet 開啟的通訊埠選擇的名稱
  • [PVC_NAME]:您針對 PersistentVolumeClaim 選擇的名稱

在這個檔案中,kind 欄位會指定 StatefulSet 物件應以檔案中定義的規格來建立。這個 StatefulSet 範例會產生三個複製的 Pod,並開啟通訊埠 80 以便將 StatefulSet 公開發佈至網際網路。

如要建立 StatefulSet,請執行下列指令:

kubectl apply -f [STATEFULSET_FILE]

您也可以使用 kubectl apply -f [DIRECTORY]/ 來建立儲存目錄的設定檔所定義的所有物件 (不包含現有物件)。

如要進一步瞭解 kubectl apply,請參閱 kubectl 參考說明文件

檢查 StatefulSet

kubectl

如要檢查 StatefulSet,請執行下列指令:

kubectl get statefulset [STATEFULSET_NAME] -o yaml

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

如要列出由 StatefulSet 建立的 Pod,請執行下列指令:

kubectl get pods -l app=[APP_NAME]

在這個指令中,-l 標記會指示 kubectl 針對應用程式 [APP_NAME],取得所有「加上標籤」的 Pod

輸出結果會與下列內容相似:

NAME                                READY     STATUS    RESTARTS   AGE
[POD_NAME]                                      1/1       Running   0          1m
[POD_NAME]                                      1/1       Running   0          1m

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

kubectl describe statefulset [STATEFULSET_NAME]

其中 [STATEFULSET_NAME] 是 StatefulSet 的名稱。

如要取得特定 Pod 的資訊:

kubectl describe pod [POD_NAME]

如要列出已建立的 PersistentVolumeClaim:

kubectl get pvc

輸出結果會與下列內容相似:

NAME                            STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
[STATEFULSET_NAME]-[PVC_NAME]-0 Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800002   1G         RWO            standard        9s
[STATEFULSET_NAME]-[PVC_NAME]-1 Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800003   1G         RWO            standard        9s
[STATEFULSET_NAME]-[PVC_NAME]-2 Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800004   1G         RWO            standard        9s

如要取得特定 PersistentVolumeClaim 的資訊:

kubectl describe pvc [STATEFULSET_NAME]-[PVC_NAME]-0

如要取得特定 PersistentVolume 的資訊:

kubectl describe pv [PV_NAME]

主控台

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

  1. 前往 GCP 主控台的「Google Kubernetes Engine 工作負載」選單。

    造訪「Workloads」(工作負載) 選單

  2. 從選單中選取需要的工作負載。

「工作負載」選單會提供幾個選單:

  • 如要查看 StatefulSet 的使用中設定,請按一下 [YAML]
  • 如要查看 StatefulSet 的所有相關事件,請按一下 [事件]
  • 如要查看 StatefulSet 的修訂版本記錄,請按一下 [修訂版本記錄]

更新 StatefulSet

有多種方式可以更新 StatefulSet,常用的陳述式方法為 kubectl apply。如要從殼層或在偏好的編輯器中直接更新 StatefulSet,您可以使用 kubectl edit。除此之外,您也可以前往 GCP 主控台的「GKE 工作負載」選單來使用 YAML 編輯器。

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

kubectl apply

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

如要更新 StatefulSet,請執行下列指令:

kubectl apply -f [STATEFULSET_FILE]

其中 [STATEFULSET_FILE] 是更新過的資訊清單檔案。

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

如要進一步瞭解 kubectl apply,請參閱 kubectl 參考說明文件

主控台

如要編輯 StatefulSet 的使用中設定,請執行下列步驟:

  1. 前往 GCP 主控台的「Google Kubernetes Engine 工作負載」選單。

    造訪「Workloads」(工作負載) 選單

  2. 選取需要的工作負載。

  3. 按一下 [Edit] (編輯)

  4. 使用編輯器,對物件進行您要的變更。

  5. 按一下 [儲存]

檢查更新發佈作業

kubectl

如要檢查 StatefulSet 的發佈作業,請執行下列指令:

kubectl rollout status statefulset [STATEFULSET_NAME]

如要查看 StatefulSet 的發佈作業記錄:

kubectl rollout history statefulset [STATEFULSET_NAME]

如要復原發佈作業:

kubectl rollout undo statefulset [STATEFULSET_NAME]

主控台

如要查看 StatefulSet 的修訂版本記錄,請執行下列步驟:

  1. 前往 GCP 主控台的「Google Kubernetes Engine 工作負載」選單。

    造訪「Workloads」(工作負載) 選單

  2. 從選單中選取需要的工作負載。

  3. 按一下 [修訂版本記錄]

  4. 選取所需的修訂版本。

更新策略

StatefulSet 的 updateStrategy 欄位可針對 StatefulSet 中的容器、標籤、資源要求/限制和 Pod 的註解,讓您設定及停用自動化的滾動式更新。

如要瞭解 StatefulSet 的更新策略,請參閱 Kubernetes 說明文件中的更新策略

調整 StatefulSet 的資源配置

kubectl

您隨時可以使用 kubectl scale 調整 StatefulSet 的資源配置。

如要手動調整 StatefulSet 的資源配置,請執行下列指令:

kubectl scale statefulset [STATEFULSET_NAME] --replicas [NUMBER_OF_REPLICAS]

其中 [NUMBER_OF_REPLICAS] 是需要的複製 Pod 數量。

主控台

如要調整 StatefulSet 的資源配置,請執行下列步驟:

  1. 前往 GCP 主控台的「Google Kubernetes Engine 工作負載」選單。

    造訪「Workloads」(工作負載) 選單

  2. 從選單選取所需的工作負載。

  3. 依序按一下 [Actions] (動作) > [Scale] (調度資源)

  4. 在 [Replicas] (備用資源) 欄位輸入您所需的備用資源數量。

  5. 按一下 [擴充]

刪除 StatefulSet

kubectl

如要刪除 StatefulSet,請執行下列指令:

kubectl delete statefulset [STATEFULSET_NAME]

主控台

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

  1. 前往 GCP 主控台的「Google Kubernetes Engine 工作負載」選單。

    造訪「Workloads」(工作負載) 選單

  2. 從選單中選取需要的工作負載。

  3. 按一下 [Delete] (刪除)

  4. 在確認對話方塊中,按一下 [Delete] (刪除)

後續步驟

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

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

這個網頁
Kubernetes Engine 說明文件