建立有狀態工作負載

本文說明如何在 Google Distributed Cloud (GDC) 實體隔離 Kubernetes 叢集中,建立及管理有狀態工作負載。有狀態工作負載可讓您透過永久儲存空間,擴充應用程式部署作業。無論工作負載排定在何處,永久儲存空間都能為應用程式提供一致的身分和穩定的主機名稱。

本文適用於應用程式營運商群組中的開發人員,他們負責為組織建立應用程式工作負載。詳情請參閱「GDC 實體隔離方案說明文件的目標對象」。

事前準備

如要完成本文件中的工作,您必須要求必要權限並準備環境。

要求 IAM 角色

您必須具備特定角色,才能取得建立有狀態工作負載所需的權限。所需角色取決於您是在組織範圍的共用叢集,還是專案範圍的標準叢集內工作。詳情請參閱「Kubernetes 叢集設定」。

共用叢集角色

如要在共用叢集中建立、刪除、編輯或查看有狀態工作負載,請要求 IAM 專案管理員授予您命名空間管理員 (namespace-admin) 角色。這個角色會繫結至專案命名空間。

標準叢集角色

如要在標準叢集中建立、刪除、編輯或查看有狀態工作負載,請要求 IAM 專案管理員授予叢集開發人員 (cluster-developer) 角色。這個角色會繫結至專案命名空間。

準備環境

如要使用 API 對 Kubernetes 叢集執行指令,請確認您具備下列資源:

  • 找出 Kubernetes 叢集名稱,或向平台管理員群組成員詢問叢集名稱。

  • 登入並產生 Kubernetes 叢集的 kubeconfig 檔案。

  • 請使用 Kubernetes 叢集的 kubeconfig 路徑,取代這些操作說明中的 KUBERNETES_CLUSTER_KUBECONFIG。

建立 StatefulSet 資源

編寫 StatefulSet 資訊清單並執行 kubectl apply 來建立資源,藉此建立 StatefulSet 物件。如要為用戶端提供穩定的方式,將要求傳送至 StatefulSet 資源的 Pod,您也必須建立 Service 物件。

kubectl apply 指令會使用資訊清單檔案,在 Kubernetes 叢集中建立、更新及刪除資源。這是物件設定的宣告式方法。這個方法會保留對實際物件的寫入作業,但不會將變更合併回物件設定檔。

如要建立 StatefulSet 和 Service 資源,請執行:

kubectl --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG -n NAMESPACE \
    apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
  name: SERVICE_NAME
  labels:
    app: APP_NAME
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: APP_NAME
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: STATEFULSET_NAME
spec:
  selector:
    matchLabels:
      app: APP_LABEL_NAME
  serviceName: "SERVICE_NAME"
  replicas: NUMBER_OF_REPLICAS
  template:
    metadata:
      labels:
        app: APP_LABEL_NAME
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: CONTAINER_NAME
        image: CONTAINER_IMAGE
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: CONTAINER_STORAGE_VOLUME_PATH
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
EOF

更改下列內容:

  • KUBERNETES_CLUSTER_KUBECONFIG:要部署容器工作負載的叢集 kubeconfig 檔案。

  • NAMESPACE:要部署容器工作負載的命名空間。如果是共用叢集,則必須是專案命名空間。如果是標準叢集,則可以是任何命名空間。

  • SERVICE_NAME:Service 物件的名稱。請確保 StatefulSet 物件也在其 serviceName 中設定 Service 物件。

  • APP_NAME:要在部署作業中執行的應用程式名稱。

  • APP_LABEL_NAME:標籤選取器,用於決定哪些 Pod 屬於 StatefulSet 物件。

  • STATEFULSET_NAME:StatefulSet 物件的名稱。

  • NUMBER_OF_REPLICAS:Deployment 管理的 Pod 物件副本數量。

  • CONTAINER_NAME:容器名稱。

  • CONTAINER_IMAGE:容器映像檔的名稱。您必須提供 Container Registry 路徑和映像檔版本,例如 REGISTRY_PATH/nginx:1.23。如要進一步瞭解如何設定 Container Registry 路徑,請參閱「代管 Harbor 服務總覽」。

  • CONTAINER_STORAGE_VOLUME_PATH:容器內掛接儲存磁碟區的路徑。

舉例來說,下列 StatefulSet 物件和對應的 Service 物件會建立有狀態容器工作負載:

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
  serviceName: "nginx"
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: REGISTRY_PATH/nginx:1.23
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

在這個例子中:

  • 系統會建立名為 nginx 的 Service 物件,並以 metadata: name 欄位表示。Service 物件會指定名為 nginx 的應用程式,由 labels.app: nginx 和 selector.app: nginx 表示。Service 物件會公開通訊埠 80,並命名為 web。這個 Service 物件會控管網路網域,並將網路流量轉送至 StatefulSet 物件部署的容器化應用程式。
  • 系統會建立名為 web 的 StatefulSet,其中包含三個複製的 Pod 物件,如 replicas: 3 欄位所設定。
  • Pod 範本由 .spec.template 區段設定,表示其 Pod 物件標示為 app: nginx。
  • Pod 規格由 .template.spec 區段設定,表示 StatefulSet 的 Pod 會執行一個容器 nginx,該容器會執行 1.23 版本的 nginx 映像檔。
  • Pod 規格會使用 Service 物件開啟的網路通訊埠。
  • .template.spec.volumeMounts 區段會指定 mountPath 欄位,名為 www。mountPath 是容器中掛接儲存空間磁碟區的路徑。
  • StatefulSet 會佈建三個 PersistentVolumeClaim 物件,分別命名為 web-www-0、web-www-1 和 web-www-2,每個物件都有 1 GB 的佈建儲存空間。

建立後,StatefulSet 會確保目標數量的 Pod 物件隨時都在運作且可供使用。StatefulSet 會自動取代失敗或從節點中逐出的 Pod 物件,並將新的 Pod 物件與儲存資源、資源要求和限制,以及 StatefulSet 物件的 Pod 規格中定義的其他設定建立關聯。

在 StatefulSet 資源中要求永久儲存空間

永久儲存空間可動態佈建,因此可視需求建立基礎磁碟區。應用程式可以使用 PersistentVolumeClaim 物件要求永久儲存空間。

一般來說,除了建立 Pod 物件外,您還必須建立 PersistentVolumeClaim 物件。不過,StatefulSet 物件包含 volumeClaimTemplates 陣列,可產生 PersistentVolumeClaim 物件。每個 StatefulSet 副本都會取得自己的 PersistentVolumeClaim 物件。

詳情請參閱「設定容器儲存空間」。

後續步驟