StatefulSet

本頁說明 Kubernetes StatefulSet 物件及其在 Google Kubernetes Engine 中的用法。

什麼是 StatefulSet?

「StatefulSet」代表一組 [Pod],無論這組 Pod 是在哪裡排程,都有不重複的永久身分以及由 GKE 維護的穩定的主機名稱。任何一個 StatefulSet Pod 的狀態資訊及其他復原資料都在與 StatefulSet 相關聯的永久磁碟儲存空間中進行維護。

StatefulSet 使用序數索引來識別及排序它們的 Pod。根據預設,StatefulSet Pod 會按順序部署,而以反向順序終止。例如,一個名為 web 的 StatefulSet 有三個分別叫做 web-0web-1web-2 的 Pod。變更 web Pod 規格時,這些 Pod 會依序停止並重新建立;其中 web-2 會先終止,接著是 web-1,依此類推。或者,您可以指定 podManagementPolicy: Parallel 欄位來要求 StatefulSet 同時啟動或終止所有 Pod,不必等到 Pod 的狀態變成運作中且準備就緒或終止後,才終止或啟動另一個 Pod。

StatefulSets 使用 Pod 範本,其中包含 Pod 的規格。Pod 規格會決定每個 Pod 的樣子:要在 Pod 的容器內執行哪些應用程式、Pod 應該掛接哪些磁碟區、Pod 的標籤和選取器等等。

使用模式

StatefulSet 是專門用來部署有狀態的應用程式及叢集應用程式,以將資料儲存到永久儲存空間,例如 Google Compute Engine 永久磁碟。StatefulSet 適合用來部署 Kafka、MySQL、Redis、ZooKeeper,以及其他需要不重複的永久身分和穩定的主機名稱的應用程式。針對無狀態應用程式,請使用部署

建立 StatefulSet

您可以使用 kubectl apply 建立 StatefulSet

建立完成後,StatefulSet 會確保隨時都有所需數量的 Pod 在執行中且可供使用。StatefulSet 會自動取代失敗或從節點中撤出的 Pod,並且自動將新的 Pod 與儲存空間資源、資源要求和限制及其他在 StatefulSet 的 Pod 規格中定義的設定產生關聯。

以下為服務和 StatefulSet 資訊清單檔案的範例:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # Label selector that determines which Pods belong to the StatefulSet
                 # Must match spec: template: metadata: labels
  serviceName: "nginx"
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx # Pod template's label selector
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: gcr.io/google_containers/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

在本範例中:

  • metadata: name 欄位指定,建立了一個名為 nginx服務物件。labels: app: nginxselector: app: nginx 指定,服務的目標是名為 nginx 的應用程式。服務公開通訊埠 80,並將其命名為 web。此服務控制著網路網域,並會將網際網路流量轉送到由 StatefulSet 部署的容器化應用程式。
  • 建立了一個名為 web 的 StatefulSet,包含三個備用的 Pod (replicas: 3)。
  • Pod 範本 (spec: template) 表示已為 Pod 加上 app: nginx 標籤。
  • Pod 規格 (template: spec) 表示 StatefulSet 的 Pod 執行一個名為 nginx 的容器,這個容器執行的是 0.8 版的 nginx-slim 映像檔。容器映像檔由 Container Registry 代管。
  • Pod 規格使用服務開啟的 web 通訊埠。
  • template: spec: volumeMounts 指定一個名為 wwwmountPathmountPath 是容器中用於掛接儲存空間磁碟區的路徑。
  • StatefulSet 佈建了一個名為 wwwPersistentVolumeClaim,佈建儲存空間為 1GB。

總結來說,Pod 規格包含下列指示:

  • 為每個 Pod 加上 app: nginx 標籤。
  • 在每個 Pod 中,執行一個名為 nginx 的容器。
  • 執行 0.8 版的 nginx-slim 映像檔。
  • 讓 Pod 使用通訊埠 80
  • 將資料儲存到掛接路徑。

如要進一步瞭解 StatefulSet 設定,請參閱 StatefulSet API 參考資料

更新 StatefulSet

您可以透過變更 Pod 規格 (包括容器映像檔和磁碟區) 來更新 StatefulSet。您也可以更新此物件的資源要求和限制、標籤及註解。如要更新 StatefulSet,請使用 kubectl、Kubernetes API 或 Google Cloud Platform 主控台中的「GKE工作負載」選單

StatefulSet 使用在 spec: updateStrategy 中定義的「更新策略」來決定處理更新的方式。策略有 OnDeleteRollingUpdate 兩種:

  • 變更物件的配置時,OnDelete 不會自動刪除和重建 Pod。您必須手動刪除舊的 Pod,控制器才會建立新的 Pod。
  • 變更物件的配置時,RollingUpdate 會自動刪除和重建 Pod。系統在新的 Pod 變成運作中且準備就緒狀態後,才會刪除舊 Pod。採用這個策略時,若變更 Pod 規格,則會自動觸發更新發佈。此為 StatefulSet 的預設更新策略。

StatefulSet 會以反向順序更新 Pod。您可以執行以下指令來監控更新發佈:

kubectl rollout status statefulset [STATEFULSET_NAME]

分割滾動式更新

您可以分割輪動式更新。如果您想要暫存更新、發佈初期測試版,或執行階段式發佈,分割是很實用的做法。

當您分割更新時,如果 Pod 的序數大於或等於分割值,就會在您更新 StatefulSet 的 Pod 規格時自動更新。如果 Pod 的序數小於分割值則不會更新,即使遭到刪除也不會使用之前的規格版本重建。如果分割值大於備用資源的數目,系統不會將更新推送到 Pod。

後續步驟

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

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

這個網頁
Kubernetes Engine 說明文件