本頁說明如何使用 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
,取得最新版本。
- 確保您的容器化應用程式儲存在映像檔註冊資料庫中,如 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:
app: APP_NAME
serviceName: "SERVICE_NAME"
replicas: 3
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: APP_NAME
spec:
containers:
- name: CONTAINER_NAME
image: ...
ports:
- containerPort: 80
name: PORT_NAME
volumeMounts:
- name: PVC_NAME
mountPath: ...
volumeClaimTemplates:
- metadata:
name: PVC_NAME
annotations:
...
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
更改下列內容:
STATEFULSET_NAME
:StatefulSet 的名稱。SERVICE_NAME
:服務名稱。APP_NAME
:在 Pod 中執行的應用程式名稱。CONTAINER_NAME
:Pod 中容器的名稱。PORT_NAME
:StatefulSet 開啟的通訊埠名稱。PVC_NAME
: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:
name: STORAGECLASS_NAME
parameters:
type: pd-standard
fstype: NTFS
provisioner: kubernetes.io/gce-pd
reclaimPolicy: Delete
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:
app: APP_NAME
template:
metadata:
labels:
app: APP_NAME
name: CONTAINER_NAME
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: CONTAINER_NAME
image: ...
ports:
- containerPort: 80
name: PORT_NAME
volumeMounts:
- name: PVC_NAME
mountPath: C:\mnt\state
volumeClaimTemplates:
- metadata:
name: PVC_NAME
spec:
storageClassName: STORAGECLASS_NAME
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
更改下列內容:
APP_NAME
:在 Pod 中執行的應用程式名稱。STATEFULSET_NAME
:StatefulSet 的名稱。CONTAINER_NAME
:Pod 中容器的名稱。PORT_NAME
:StatefulSet 開啟的通訊埠名稱。PVC_NAME
:PersistentVolumeClaim 的名稱。STORAGECLASS_NAME
:StorageClass 的名稱。
如要建立 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 的註解,讓您設定及停用自動化的滾動式更新。
如要進一步瞭解 StatefulSet 的更新策略,請參閱 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」(刪除)。