本頁說明如何使用 Google Kubernetes Engine (GKE) 部署有狀態的應用程式。
總覽
有狀態的應用程式會將資料儲存至永久磁碟儲存空間,以便提供給伺服器、用戶端和其他應用程式使用。有狀態應用程式的範例為資料庫或鍵/值存放區,資料會儲存在這類空間中,並由其他應用程式擷取。
永久儲存空間可以動態佈建,因此基礎磁碟區會根據需求建立。在 Kubernetes 中,您可以建立 StorageClass 來設定動態佈建。在 GKE 中,預設的 StorageClass 可讓您動態佈建 Compute Engine 永久磁碟。
Kubernetes 使用 StatefulSet 控制器,將有狀態的應用程式部署為 StatefulSet 物件。StatefulSet 中的 Pod 彼此不可互換:每個 Pod 皆有一個唯一識別碼,無論排定在那個位置,都會保留這個識別碼。
有狀態應用程式與無狀態應用程式不同,後者不會在各個工作階段之間將用戶端資料儲存至伺服器。
進一步瞭解多區域和區域性叢集中的永久儲存空間。
事前準備
開始之前,請確認您已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
- 確保您的容器化應用程式儲存在映像檔註冊資料庫中,如 Artifact Registry。
您可以按照快速入門指南啟用 GKE API、建立叢集,並進一步瞭解 GKE。
在 StatefulSet 中要求永久儲存空間
應用程式可以透過 PersistentVolumeClaim 要求永久儲存空間。
一般來說,除了建立 Pod,您還必須建立 PersistentVolumeClaim 物件。但 StatefulSet 物件含有 volumeClaimTemplates 陣列,因此可自動產生 PersistentVolumeClaim 物件。每個 StatefulSet 副本都會取得自己的 PersistentVolumeClaim 物件。
建立 StatefulSet
如要建立 StatefulSet 資源,請使用 kubectl apply 指令。
kubectl apply 指令會使用資訊清單檔案,在叢集中建立、更新及刪除資源。這是物件設定的宣告式方法。這種方法保留對使用中物件所做的寫入,而不會將變更併回物件設定檔。
Linux
下列資訊清單檔案是 StatefulSet 的簡單範例,由個別建立的 Service 控管:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: STATEFULSET_NAME
spec:
selector:
matchLabels:
# Selects Pods with this label.
app: APP_NAME
# Headless Service for network identity.
serviceName: "SERVICE_NAME"
replicas: 3
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: APP_NAME
spec:
containers:
- name: CONTAINER_NAME
image: IMAGE
ports:
- containerPort: 80
name: PORT_NAME
volumeMounts:
- name: PVC_NAME
mountPath: MOUNT_PATH
volumeClaimTemplates:
- metadata:
name: PVC_NAME
annotations:
KEY: VALUE
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
更改下列內容:
STATEFULSET_NAME:StatefulSet 的名稱,例如web。SERVICE_NAME:服務名稱,例如nginx。APP_NAME:在 Pod 中執行的應用程式名稱,例如nginx。CONTAINER_NAME:Pod 中的容器名稱,例如nginx。IMAGE:容器映像檔,例如registry.k8s.io/nginx-slim:0.8。PORT_NAME:StatefulSet 開啟的通訊埠名稱,例如web。PVC_NAME:PersistentVolumeClaim 的名稱,例如www。MOUNT_PATH:容器中掛接儲存空間的路徑,例如/usr/share/nginx/html。KEY和VALUE:要套用至 PersistentVolumeClaim 中繼資料的註解鍵/值組合。您可以透過註解,將不含識別資訊的任意中繼資料附加至物件,供工具和程式庫等用戶端擷取。詳情請參閱「註解」。
在這個檔案中,kind 欄位會指定 StatefulSet 物件應以檔案中定義的規格來建立。這個 StatefulSet 範例會產生三個複製的 Pod,並開啟通訊埠 80 以便將 StatefulSet 公開發布至網際網路。
Windows
使用含有 Windows Server 節點集區的叢集時,您必須建立 StorageClass,因為預設 StorageClass 使用 ext4 做為檔案系統類型,這只適用於 Linux 容器。如果您使用 Compute Engine 永久磁碟,則必須使用 NTFS 做為檔案儲存類型,如下列範例所示:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
# Defines a name for this StorageClass.
name: STORAGECLASS_NAME
parameters:
# Specifies the type of Google Compute Engine persistent disk.
type: pd-standard
# Uses NTFS file system, which is crucial for Windows nodes
fstype: NTFS
# The provisioner for Google Compute Engine persistent disks.
provisioner: kubernetes.io/gce-pd
# Specifies that the PersistentVolume will be deleted if the PersistentVolumeClaim is deleted.
reclaimPolicy: Delete
# Delays volume binding until a Pod using the PVC is scheduled.
volumeBindingMode: WaitForFirstConsumer
下列 StatefulSet 資訊清單會使用上述定義的 StorageClass。這會建立四組 PersistentVolume 和 PersistentVolumeClaim,代表四個 Compute Engine 永久磁碟。StatefulSet 中的每個 Pod 都會耗用一個永久磁碟。
如要確保 Pod 正確排定至 Windows Server 節點,請務必在 Pod 規格中新增節點選取器。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: STATEFULSET_NAME
spec:
replicas: 4
selector:
matchLabels:
# Selects Pods with this label.
app: APP_NAME
template:
metadata:
labels:
# Labels applied to the Pods created by the StatefulSet.
app: APP_NAME
name: CONTAINER_NAME
spec:
nodeSelector:
# Ensures Pods are scheduled on Windows nodes.
kubernetes.io/os: windows
containers:
- name: CONTAINER_NAME
image: IMAGE
ports:
- containerPort: 80
name: PORT_NAME
volumeMounts:
- name: PVC_NAME
mountPath: MOUNT_PATH
volumeClaimTemplates:
- metadata:
name: PVC_NAME
spec:
# Specifies the StorageClass to use, which is crucial for Windows nodes.
storageClassName: STORAGECLASS_NAME
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
更改下列內容:
STATEFULSET_NAME:StatefulSet 的名稱,例如web-windows。APP_NAME:在 Pod 中執行的應用程式名稱,例如iis。CONTAINER_NAME:Pod 中的容器名稱,例如iis。IMAGE:容器映像檔,例如mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019。PORT_NAME:StatefulSet 開啟的通訊埠名稱,例如http。PVC_NAME:PersistentVolumeClaim 的名稱,例如iis-state。MOUNT_PATH:容器中掛接儲存空間的路徑,例如C:\mnt\state。STORAGECLASS_NAME:StorageClass 的名稱,例如my-storage-class。
如要建立 StatefulSet 資源,請執行下列指令,並將 STATEFULSET_FILE 替換為資訊清單檔案名稱:
kubectl apply -f STATEFULSET_FILE
您也可以使用 kubectl apply -f DIRECTORY/ 來建立儲存目錄的設定檔所定義的所有物件 (不包含現有物件)。
檢查 StatefulSet
kubectl
如要檢查 StatefulSet,請執行下列指令:
kubectl get statefulset STATEFULSET_NAME -o yaml
這個指令會以 YAML 格式顯示 StatefulSet 資源的即時設定。
如要列出由 StatefulSet 建立的 Pod,請執行下列指令:
kubectl get pods -l app=APP_NAME
在這個指令中,-l 標記會指示 kubectl 針對 APP_NAME,取得所有「加上標籤」的 Pod。
輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE
pod-name 1/1 Running 0 1m
pod-name 1/1 Running 0 1m
如要取得 StatefulSet 的詳細資訊,請執行下列指令:
kubectl describe statefulset STATEFULSET_NAME
如要取得特定 Pod 的資訊,請執行下列指令:
kubectl describe pod POD_NAME
如要列出已建立的 PersistentVolumeClaim 物件,請執行下列指令:
kubectl get pvc
輸出結果會與下列內容相似:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
STATEFULSET_NAME-PVC_NAME-0 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800002 1G RWO standard 9s
STATEFULSET_NAME-PVC_NAME-1 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800003 1G RWO standard 9s
STATEFULSET_NAME-PVC_NAME-2 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800004 1G RWO standard 9s
如要取得特定 PersistentVolumeClaim 的資訊,請執行下列指令:
kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0
如要取得特定 PersistentVolume 的資訊,請執行下列指令:
kubectl describe pv PV_NAME
控制台
如要檢查 StatefulSet,請執行下列步驟:
前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。
在工作負載清單中,按一下要檢查的 StatefulSet 名稱。
在「Stateful Set details」(有狀態集詳細資料) 頁面上,執行下列任一操作:
- 按一下「修訂版本記錄」分頁標籤,即可查看 StatefulSet 的修訂版本記錄。
- 按一下「事件」分頁標籤,即可查看與 StatefulSet 相關的所有事件。
- 按一下「Logs」(記錄) 分頁標籤,即可查看 StatefulSet 的容器記錄。
- 按一下「YAML」YAML分頁標籤,即可查看、複製或下載 StatefulSet 的設定 YAML。
更新 StatefulSet
有多種方式可以更新 StatefulSet,常用的陳述式方法為 kubectl apply。如要從殼層或在偏好的編輯器中直接更新 StatefulSet,您可以使用 kubectl edit。您也可以前往 Google Cloud 控制台的「GKE 工作負載」選單來使用 YAML 編輯器。
您可以將更新發布到 StatefulSet 資源的 Pod 規格,如映像檔、資源用量/要求或設定等。
kubectl apply
您可以「套用」新的或更新過的資訊清單檔案來更新 StatefulSet。 這樣的做法適用於對 StatefulSet 進行各種變更的情況,像是資源調度或指定應用程式的新版本等。
如要更新 StatefulSet,請執行下列指令:
kubectl apply -f STATEFULSET_FILE
請將 STATEFULSET_FILE 替換為更新後的資訊清單檔案。
kubectl apply 指令會將資訊清單檔案套用至資源。如果指定的資源不存在,則這個指令會建立該資源。
如要進一步瞭解 kubectl apply,請參閱kubectl 參考文件。
控制台
如要編輯 StatefulSet 的使用中設定,請執行下列步驟:
前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。
在工作負載清單中,按一下要修改的 StatefulSet 名稱。
按一下「Edit」(編輯)edit。
視需要變更設定 YAML。
按一下 [儲存]。
檢查更新發布作業
如要檢查 StatefulSet 的發布作業,請執行下列指令:
kubectl rollout status statefulset STATEFULSET_NAME
如要查看 StatefulSet 的發布記錄,請執行下列指令:
kubectl rollout history statefulset STATEFULSET_NAME
如要復原推出作業,請執行下列指令:
kubectl rollout undo statefulset STATEFULSET_NAME
更新策略
StatefulSet 的 updateStrategy 欄位可針對 StatefulSet 中的容器、標籤、資源要求、限制和 Pod 的註解,讓您設定及停用自動化的滾動式更新。
詳情請參閱 Kubernetes 說明文件中的 更新策略。
調整 StatefulSet 的資源配置
kubectl
您隨時可以使用 kubectl scale 指令調整 StatefulSet 的資源配置。
如要手動調整 StatefulSet 的資源配置,請執行下列指令:
kubectl scale statefulset STATEFULSET_NAME --replicas NUMBER_OF_REPLICAS
將 NUMBER_OF_REPLICAS 替換為所需的複製 Pod 數量。
控制台
如要調整 StatefulSet 的資源配置,請執行下列步驟:
前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。
在工作負載清單中,按一下要修改的 StatefulSet 名稱。
依序點選「動作」list>「資源調度」>「編輯備用資源」。
輸入 StatefulSet 的新副本數量。
按一下 [Scale] (擴充)。
刪除 StatefulSet
kubectl
如要刪除 StatefulSet,請執行下列指令:
kubectl delete statefulset STATEFULSET_NAME
主控台
如要刪除 StatefulSet,請執行下列步驟:
前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。
在工作負載清單中,選取要刪除的一或多個 StatefulSet。
按一下「刪除」圖示 delete。
當系統提示時,按一下「Delete」(刪除)。