本頁說明如何在 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
。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
物件。
詳情請參閱「設定容器儲存空間」。