建立有狀態工作負載

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

本頁內容適用於應用程式運算子群組中的開發人員,他們負責為所屬機構建立應用程式工作負載。

事前準備

如要針對預先設定的 Bare Metal Kubernetes 叢集執行指令,請確認您擁有下列資源:

  1. 找出 Kubernetes 叢集名稱,或向平台管理員詢問叢集名稱。

  2. 如果沒有 Kubernetes 叢集的 kubeconfig 檔案,請登入並產生該檔案。

  3. 請使用 Kubernetes 叢集的 kubeconfig 路徑,替換這些操作說明中的 CLUSTER_KUBECONFIG

如要取得建立具狀態工作負載的必要權限,請要求機構 IAM 管理員在專案命名空間中授予您命名空間管理員角色 (namespace-admin)。

建立 StatefulSet 資源

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

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

如要建立 StatefulSetService 資源,請執行:

kubectl --kubeconfig 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
        resources:
          requests:
            nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
          limits:
            nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
        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

更改下列內容:

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

  • NAMESPACE:用於部署容器工作負載的專案命名空間。

  • SERVICE_NAMEService 物件的名稱。請確保 StatefulSet 物件也會在 serviceName 中設定 Service 物件。

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

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

  • STATEFULSET_NAMEStatefulSet 物件的名稱。

  • NUMBER_OF_REPLICAS:Deployment 管理的複製 Pod 物件數量。

  • CONTAINER_NAME:容器名稱。

  • CONTAINER_IMAGE:容器映像檔的名稱。您必須加入映像檔的容器登錄路徑和版本,例如 REGISTRY_PATH/nginx:1.23

  • 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
        resources:
          requests:
            nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
          limits:
            nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

在這個例子中:

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

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

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

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

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

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