本頁說明如何在 Google Distributed Cloud (GDC) 氣隙 Kubernetes 叢集中建立及管理有狀態的工作負載。有狀態的工作負載可讓您使用永久儲存空間,擴展應用程式部署作業。無論工作負載排程在哪裡,永久儲存空間都能為應用程式提供一致的身分和穩定的主機名稱。
本頁內容適用於應用程式運算子群組中的開發人員,他們負責為所屬機構建立應用程式工作負載。詳情請參閱 GDC air-gapped 說明文件適用對象。
事前準備
如要對 Kubernetes 叢集執行指令,請確認您具備下列資源:
- 找出 Kubernetes 叢集名稱,或詢問平台管理員叢集名稱。 
- 如果沒有 Kubernetes 叢集的 kubeconfig 檔案,請登入並產生該檔案。 
- 請使用 Kubernetes 叢集的 kubeconfig 路徑,替換這些操作說明中的 - KUBERNETES_CLUSTER_KUBECONFIG。
如要取得建立具狀態工作負載的必要權限,請要求機構 IAM 管理員在專案命名空間中授予您命名空間管理員角色 (namespace-admin)。
建立 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。如要進一步瞭解如何設定容器登錄路徑,請參閱「Managed Harbor Service 總覽」。
- 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的容器,這個容器執行的是- 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 物件。
詳情請參閱「設定容器儲存空間」。