建立有狀態工作負載

本文說明如何在 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:容器映像檔的名稱。您必須加入容器登錄路徑和映像檔版本,例如 REGISTRY_PATH/nginx:1.23。如要進一步瞭解如何設定容器登錄路徑,請參閱「受管理 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 所設定。
  • 由 .spec.template 區段設定的 Pod 範本表示其 Pod 物件標示為 app: nginx。
  • Pod 規格 (由 .template.spec 區段設定) 表示 StatefulSet 的 Pod 會執行一個容器 nginx,該容器會執行 nginx 映像檔 (版本為 1.23)。
  • 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 物件。

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

後續步驟