總覽
在本研究室中,您將設定 PersistentVolume (永久磁碟區) 和 PersistentVolumeClaim (永久磁碟區要求)。PersistentVolume 是適用於 Kubernetes 叢集的儲存空間。Pod 可以透過 PersistentVolumeClaim 存取 PersistentVolume。若沒有 PersistentVolumeClaim,Pod 多為暫存空間。因此若希望資料在 Pod 資源調度、更新或遷移後仍可持續使用,就必須使用 PersistentVolumeClaim。
目標
在本研究室中瞭解如何執行下列工作:
- 為 Google Cloud 永久磁碟的 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 建立資訊清單 (動態建立或既有清單)
- 在 Pod 將 Google Gloud 永久磁碟 PVC 掛接為磁碟區
- 使用資訊清單建立 StatefulSet
- 在 StatefulSet 將 Google Cloud 永久磁碟 PVC 掛接為磁碟區
- 在 Pod 停止和重新啟動時,驗證 StatefulSet 中 Pod 和特定 PV 的連結
設定研究室
存取研究室
每個實驗室都會提供新的 Google Cloud 專案和一組資源,讓您在時限內免費使用。
-
按一下「Start Lab」按鈕。如果研究室會產生費用,畫面中會出現選擇付款方式的彈出式視窗。左側的「Lab Details」窗格會顯示下列項目:
- 「Open Google Cloud console」按鈕
- 剩餘時間
- 必須在這個研究室中使用的臨時憑證
- 完成這個實驗室所需的其他資訊 (如有)
-
點選「Open Google Cloud console」;如果使用 Chrome 瀏覽器,也能按一下滑鼠右鍵,選取「在無痕視窗中開啟連結」。
接著,實驗室會啟動相關資源並開啟另一個分頁,當中顯示「登入」頁面。
提示:您可以在不同的視窗中並排開啟分頁。
注意:如果頁面中顯示「選擇帳戶」對話方塊,請點選「使用其他帳戶」。
-
如有必要,請將下方的 Username 貼到「登入」對話方塊。
{{{user_0.username | "Username"}}}
您也可以在「Lab Details」窗格找到 Username。
-
點選「下一步」。
-
複製下方的 Password,並貼到「歡迎使用」對話方塊。
{{{user_0.password | "Password"}}}
您也可以在「Lab Details」窗格找到 Password。
-
點選「下一步」。
重要事項:請務必使用實驗室提供的憑證,而非自己的 Google Cloud 帳戶憑證。
注意:如果使用自己的 Google Cloud 帳戶來進行這個實驗室,可能會產生額外費用。
-
按過後續的所有頁面:
- 接受條款及細則。
- 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
- 請勿申請免費試用。
Google Cloud 控制台稍後會在這個分頁開啟。
注意:如要查看列出 Google Cloud 產品和服務的選單,請點選左上角的「導覽選單」,或在「搜尋」欄位輸入服務或產品名稱。
啟動 Google Cloud Shell
Google Cloud Shell 是搭載多項開發工具的虛擬機器,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作。
Google Cloud Shell 提供指令列存取權,方便您使用 Google Cloud 資源。
-
在 Cloud 控制台的右上方找到工具列,然後按一下「開啟 Cloud Shell」按鈕。

-
按一下「繼續」。
佈建並連線至環境的作業需要一些時間才能完成。連線建立完成即代表已通過驗證,而且專案已設為您的「PROJECT_ID」。示例如下:

gcloud 是 Google Cloud 的指令列工具,已預先安裝於 Cloud Shell,並支援 Tab 鍵完成功能。
gcloud auth list
輸出內容:
Credentialed accounts:
- @.com (active)
輸出內容示例:
Credentialed accounts:
- google1623327_student@qwiklabs.net
gcloud config list project
輸出內容:
[core]
project =
輸出內容示例:
[core]
project = qwiklabs-gcp-44776a13dea667a6
注意事項:如需 gcloud 的完整說明,請參閱 gcloud CLI 總覽指南。
工作 1:建立 PV 和 PVC
在這項工作中建立 PVC,觸發 Kubernetes 自動建立一個 PV。
連結到研究室 GKE 叢集
- 在 Cloud Shell 輸入下列指令,設定可用區和叢集名稱的環境變數:
export my_region={{{project_0.default_region|Region}}}
export my_cluster=autopilot-cluster-1
- 為 kubectl 指令列工具設定 Tab 鍵完成功能:
source <(kubectl completion bash)
- 為 kubectl 設定對叢集的存取權:
gcloud container clusters get-credentials $my_cluster --region $my_region
使用 PVC 建立和套用資訊清單
大多數情況下,不需直接設定 PV 物件或建立 Compute Engine 永久磁碟。若改為建立 PVC,Kubernetes 就會自動佈建永久磁碟。
讓我們建立名為 hello-web-disk
的 PVC,容量為 30 GB,可以做為讀取和寫入磁碟區,一次掛接至單一節點。
- 使用下列指令建立
pvc-demo.yaml
檔案,並在 nano 編輯器中開啟檔案:
nano pvc-demo.yaml
- 開啟 nano 編輯器後,將下列指令貼到
pvc-demo.yaml
檔案:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: hello-web-disk
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 30Gi
-
依序按下 Ctrl+O 和 Enter 鍵,儲存編輯過的檔案。
-
按下 Ctrl+X 鍵,退出 nano 文字編輯器。
-
如要顯示您目前沒有 PVC,請執行以下指令:
kubectl get persistentvolumeclaim
輸出內容:
No resources found in default namespace.
- 若要建立 PVC,請執行以下指令:
kubectl apply -f pvc-demo.yaml
- 若要顯示新建立的 PVC,請執行以下指令:
kubectl get persistentvolumeclaim
部分輸出內容:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
hello-web-disk Pending standard-rwo unset 15s
注意:在完成下個步驟前,此狀態會一直維持在「Pending」(待處理)。
點選「Check my progress」確認目標已達成。
建立 PV 和 PVC
工作 2:在 Pod 掛接和驗證 Google Cloud 永久磁碟 PVC
在這項工作中,將永久磁碟 PVC 連接到 Pod。將 PVC 掛接為磁碟區,作為 Pod 資訊清單的一部分。
將 PVC 掛接至 Pod
建立用來部署 nginx 容器的資訊清單檔案 pod-volume-demo.yaml
,將 pvc-demo-volume
連接至 Pod,並將該磁碟區掛接至 nginx 容器中的路徑 /var/www/html
。儲存至容器中該目錄的檔案會保留在永久磁碟區,即使關閉和重新建立 Pod 與容器,檔案也會保留下來。
- 使用下列指令建立
pod-volume-demo.yaml
檔案,並在 nano 編輯器中開啟檔案:
nano pod-volume-demo.yaml
- 開啟 nano 編輯器後,將下列指令貼到
pod-volume-demo.yaml
檔案:
kind: Pod
apiVersion: v1
metadata:
name: pvc-demo-pod
spec:
containers:
- name: frontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: pvc-demo-volume
volumes:
- name: pvc-demo-volume
persistentVolumeClaim:
claimName: hello-web-disk
-
依序按下 Ctrl+O 和 Enter 鍵,儲存編輯過的檔案。
-
按下 Ctrl+X 鍵,退出 nano 文字編輯器。
-
如要建立包含磁碟區的 Pod,請執行以下指令:
kubectl apply -f pod-volume-demo.yaml
- 在叢集中列出 Pod:
kubectl get pods
輸出內容:
NAME READY STATUS RESTARTS AGE
pvc-demo-pod 0/1 ContainerCreating 0 18s
若建立 Pod 後快速執行本操作,狀態變更為「執行中」前,您會看到掛接磁碟區時的狀態顯示為「ContainerCreating」。
- 若要驗證 Pod 中的 PVC 是否可以存取,必須獲得 Pod 的殼層存取權。若要開始殼層工作階段,請執行以下指令:
kubectl exec -it pvc-demo-pod -- sh
- 若要在 Pod 中將簡單的文字訊息建立為網頁,請輸入以下指令:
echo Test webpage in a persistent volume!>/var/www/html/index.html
chmod +x /var/www/html/index.html
- 驗證文字檔案是否包含您的訊息:
cat /var/www/html/index.html
輸出內容:
Test webpage in a persistent volume!
- 輸入下列指令,將互動殼層留在 nginx 容器:
exit
測試 PV 的持續性
現在將從叢集中刪除 Pod,確認 PV 仍然存在,然後重新部署 Pod 並驗證 PV 的內容維持不變。
- 刪除 pvc-demo-pod:
kubectl delete pod pvc-demo-pod
- 在叢集中列出 Pod:
kubectl get pods
輸出內容:
No resources found in default namespace.
叢集上不應存在 Pod。
- 若要顯示 PVC,請執行下列指令:
kubectl get persistentvolumeclaim
部分輸出內容:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
hello-web-disk Bound pvc-8...34 30Gi RWO standard-rwo unset 22m
PVC 仍然存在,且刪除 Pod 時未刪除 PVC。
- 重新部署 pvc-demo-pod:
kubectl apply -f pod-volume-demo.yaml
- 在叢集中列出 Pod:
kubectl get pods
輸出內容:
NAME READY STATUS RESTARTS AGE
pvc-demo-pod 1/1 Running 0 15s
Pod 將進行部署,由於 PV 已存在且不需建立,本次狀態會更快變為「執行中」。
- 若要驗證 Pod 中的 PVC 是否仍可存取,必須獲得 Pod 的殼層存取權。若要開始殼層工作階段,請執行以下指令:
kubectl exec -it pvc-demo-pod -- sh
- 若要驗證文字檔案是否仍包含訊息,請執行以下指令:
cat /var/www/html/index.html
輸出內容:
Test webpage in a persistent volume!
即使 Pod 已從叢集刪除並重新建立,永久磁碟區的內容仍不會遭到刪除:
- 輸入下列指令,將互動殼層留在 nginx 容器:
exit
點選「Check my progress」 驗證目標。
在 Pod 掛接和驗證 Google Cloud 永久磁碟 PVC
工作 3:使用 PVC 建立 StatefulSet
在這項工作中,在 StatefulSet 內使用 PVC。StatefulSet 類似於 Deployment,不同之處在於 Pod 可明確識別身分。
釋出 PVC
- 透過 Statefulset 使用 PVC 前,必須刪除目前正在使用 PVC 的 Pod。執行以下指令刪除 Pod:
kubectl delete pod pvc-demo-pod
- 確認已移除 Pod:
kubectl get pods
輸出內容:
No resources found in default namespace.
建立 StatefulSet
讓我們建立資訊清單檔案 statefulset-demo.yaml
,此檔案會建立 StatefulSet,包括 LoadBalancer 服務和三個 Pod 備用資源,內含 nginx 容器和 volumeClaimTemplates,後者會建立名為 hello-web-disk
的 PVC,容量為 30 GB。與上一個工作相同,nginx 容器會將名為 hello-web-disk
的 PVC 掛接至 /var/www/html
。
- 使用下列指令建立
statefulset-demo.yaml
檔案,並在 nano 編輯器中開啟檔案:
nano statefulset-demo.yaml
- 開啟 nano 編輯器後,將下列指令貼到
statefulset-demo.yaml
檔案:
kind: Service
apiVersion: v1
metadata:
name: statefulset-demo-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: LoadBalancer
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: statefulset-demo
spec:
selector:
matchLabels:
app: MyApp
serviceName: statefulset-demo-service
replicas: 3
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: MyApp
spec:
containers:
- name: stateful-set-container
image: nginx
ports:
- containerPort: 80
name: http
volumeMounts:
- name: hello-web-disk
mountPath: "/var/www/html"
volumeClaimTemplates:
- metadata:
name: hello-web-disk
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 30Gi
-
依序按下 Ctrl+O 和 Enter 鍵,儲存編輯過的檔案。
-
按下 Ctrl+X 鍵,退出 nano 文字編輯器。
- 如要建立包含磁碟區的 StatefulSet,請執行以下指令:
kubectl apply -f statefulset-demo.yaml
輸出內容:
service "statefulset-demo-service" created
statefulset.apps "statefulset-demo" created
現在有一個 Statefulset 在服務後方執行,名稱為 statefulset-demo-service
。
驗證 StatefulSet 中的 Pod 連結
- 使用「kubectl describe」查看 StatefulSet 的詳細資料:
kubectl describe statefulset statefulset-demo
注意輸出內容結尾的事件狀態。已成功建立服務和 Statefulset。
Normal SuccessfulCreate 10s statefulset-controller
Message: create Claim hello-web-disk-statefulset-demo-0 Pod statefulset-demo-0 in StatefulSet statefulset-demo success
Normal SuccessfulCreate 10s statefulset-controller
Message: create Pod statefulset-demo-0 in StatefulSet statefulset-demo successful
- 在叢集中列出 Pod:
kubectl get pods
輸出內容:
NAME READY STATUS RESTARTS AGE
statefulset-demo-0 1/1 Running 0 6m
statefulset-demo-1 1/1 Running 0 3m
statefulset-demo-2 1/1 Running 0 2m
- 若要列出 PVC,請執行以下指令:
kubectl get pvc
輸出內容:
NAME STATUS VOLUME CAPACITY ACCESS
hello-web-disk Bound pvc-86117ea6-...34 30Gi RWO
hello-web-disk-st...-demo-0 Bound pvc-92d21d0f-...34 30Gi RWO
hello-web-disk-st...-demo-1 Bound pvc-9bc84d92-...34 30Gi RWO
hello-web-disk-st...-demo-2 Bound pvc-a526ecdf-...34 30Gi RWO
原始的 hello-web-disk 仍然存在,可以在新的 Statefulset Pod 中看到為每個 Pod 所建立的個別 PVC。
- 使用「kubectl describe」查看 StatefulSet 內第一個 PVC 的詳細資料:
kubectl describe pvc hello-web-disk-statefulset-demo-0
點選「Check my progress」驗證目標。
使用 PVC 建立 StatefulSet
工作 4:驗證 StatefulSet 管理的 Pod 與永久磁碟區的連接持續性
在本工作中,當 Pod 停止和重新啟動時,需驗證 StatefulSet 中的 Pod 與特定 PV 的連結。
- 若要驗證 Pod 中的 PVC 是否可以存取,必須獲得 Pod 的殼層存取權。若要開始殼層工作階段,請執行以下指令:
kubectl exec -it statefulset-demo-0 -- sh
- 驗證
/var/www/html
目錄中是否不存在 index.html
文字檔案:
cat /var/www/html/index.html
- 若要在 Pod 中將簡單的文字訊息建立為網頁,請輸入以下指令:
echo Test webpage in a persistent volume!>/var/www/html/index.html
chmod +x /var/www/html/index.html
- 驗證文字檔案是否包含您的訊息:
cat /var/www/html/index.html
輸出內容:
Test webpage in a persistent volume!
- 輸入下列指令,將互動殼層留在 nginx 容器:
exit
- 刪除您在 PVC 上更新文件的 Pod:
kubectl delete pod statefulset-demo-0
- 在叢集中列出 Pod:
kubectl get pods
您會看見 StatefulSet 正在自動重新啟動 statefulset-demo-0
Pod。
注意: 請等到 Pod 狀態顯示再次執行,再繼續進行操作。
- 連結到新的
statefulset-demo-0
Pod 上的殼層:
kubectl exec -it statefulset-demo-0 -- sh
- 驗證文字檔案是否包含訊息:
cat /var/www/html/index.html
輸出內容:
Test webpage in a persistent volume!
StatefulSet 會重新啟動 Pod,將現有的專用 PVC 重新連線到新的 Pod,確保能保留 Pod 的資料。
- 輸入下列指令,將互動殼層留在 nginx 容器:
exit
關閉研究室
如果您已完成研究室,請按一下「End Lab」(關閉研究室)。Google Cloud Skills Boost 會移除您使用的資源,並清除所用帳戶。
您可以針對研究室的使用體驗評分。請選取合適的星級評等並提供意見,然後按一下「Submit」(提交)。
星級評等代表您的滿意程度:
- 1 星 = 非常不滿意
- 2 星 = 不滿意
- 3 星 = 普通
- 4 星 = 滿意
- 5 星 = 非常滿意
如果不想提供意見回饋,您可以直接關閉對話方塊。
如有任何想法、建議或指教,請透過「Support」(支援) 分頁提交。
Copyright 2022 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。