本頁說明如何在 Google Distributed Cloud (GDC) 氣隙裝置 Kubernetes 叢集中,建立及管理有狀態的工作負載。有狀態的工作負載可讓您使用永久儲存空間,擴展應用程式部署作業。無論工作負載排程在哪裡,永久儲存空間都能為應用程式提供一致的身分和穩定的主機名稱。
本頁內容適用於應用程式運算子群組中的開發人員,負責為所屬機構建立應用程式工作負載。
事前準備
如要針對預先設定的 Bare Metal Kubernetes 叢集執行指令,請確認您擁有下列資源:
找出 Kubernetes 叢集名稱,或詢問平台管理員叢集名稱。
如果沒有 Kubernetes 叢集的 kubeconfig 檔案,請登入並產生該檔案。
請使用 Kubernetes 叢集的 kubeconfig 路徑,替換這些操作說明中的
CLUSTER_KUBECONFIG。
如要取得建立具狀態工作負載的必要權限,請要求機構 IAM 管理員在專案命名空間中授予您命名空間管理員角色 (namespace-admin)。
建立 StatefulSet 資源
編寫 StatefulSet 資訊清單並執行 kubectl apply,即可建立 StatefulSet 物件。如要為用戶端提供穩定的方式,將要求傳送至 StatefulSet 資源的 Pod,您也必須建立 Service 物件。
kubectl apply 指令會使用資訊清單檔案,在叢集中建立、更新及刪除資源。這是物件設定的宣告式方法。這種方法保留對使用中物件所做的寫入,而不會將變更併回物件設定檔。
如要建立 StatefulSet 和 Service 資源,請執行:
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_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
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
在這個例子中:
- 建立名為
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 物件。
詳情請參閱「設定容器儲存空間」。