假設您是一位雲端工程師,負責維護經常增加新功能的重要應用程式,您的任務是盡可能降低對使用者的影響和應用程式停機時間,同時推出新功能和更新。您負責的是部署於 Kubernetes 的容器化應用程式。有時您必須因應使用者需求的變化,向上擴充或縮減應用程式的資源,此外還要控管來自網際網路的連入流量。維護及更新應用程式時,您必須考慮下列事項:
- 如何為叢集建立 Deployment 資訊清單?
- 如何手動調度 Deployment 的 Pod 數量?
- 如何建立 Service,用於控管應用程式的傳入流量?
- 如何推出更新,但盡可能不造成服務中斷?
- 如何執行初期測試部署,在全面推出之前測試新功能?
身為熟悉 Azure Kubernetes Service (AKS) 的雲端專業人員,您可能已有下列經驗:使用 YAML 資訊清單檔案,在 AKS 執行 Kubernetes 部署作業;使用 DevOps pipeline,將應用程式程式碼和容器提供給 Kubernetes 叢集。
如要依據需求調整 Pod 數量,您可以手動編輯資訊清單檔案,或使用 kubectl 指令。如要控管應用程式的傳入流量,您必須在 DevOps pipeline 規劃負載平衡器部署作業,然後執行 pipeline。需要更新容器映像檔時,您會執行 DevOps pipeline 來提供容器映像檔,然後使用 kubectl 指令觸發 Deployment 推出作業。
如要執行初期測試版本更新,您必須安裝 Prometheus、設定 pipeline、新增資訊清單檔案,然後執行開發作業 pipeline。
將這些概念納入考量後,接下來您將實際瞭解如何建立 Google Kubernetes Engine (GKE) 的 Deployment 資訊清單,進而建立、更新 Deployment 並調度資源。
總覽
在本研究室中,探索使用部署作業資訊清單的基本知識。資訊清單是包含部署所需設定的檔案,可以在不同的 Pod 上使用。資訊清單容易改變。
目標
在本研究室中,瞭解如何執行下列工作:
- 建立部署作業資訊清單、部署到叢集,並在節點停用時驗證 Pod 重新排程
- 在 Pod 部署作業中觸發手動擴充和縮減
- 觸發部署作業的推出 (滾動式更新至新版本) 和復原
- 執行初期測試部署
設定研究室
存取研究室
在每個研究室中,您都能在固定時間內免付費建立新的 Google Cloud 專案,並使用一組資源。
-
請透過無痕式視窗登入 Qwiklabs。
-
請記下研究室的存取時間 (例如 1:15:00
),並確保自己能在時間限制內完成作業。
研究室不提供暫停功能。如有需要,您可以重新開始,但原先的進度恕無法保留。
-
準備就緒後,請按一下「Start lab」。
-
請記下研究室憑證 (使用者名稱和密碼),這組資訊將用於登入 Google Cloud 控制台。
-
按一下「Open Google Console」。
-
按一下「Use another account」,然後複製這個研究室的憑證,並貼入提示訊息。
如果使用其他憑證,系統會顯示錯誤或向您收取費用。
-
接受條款,然後略過資源復原頁面。
完成初始登入步驟後,就會看到專案資訊主頁。
啟動 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:建立部署作業資訊清單並部署至叢集
在這項工作中,為叢集內的 Pod 建立部署作業資訊清單。
連線至研究室 GKE 叢集
- 在 Cloud Shell 輸入下列指令,設定可用區和叢集名稱的環境變數:
export my_zone={{{project_0.default_zone|Zone}}}
export my_cluster=standard-cluster-1
- 在 Cloud Shell 輸入下列指令,為 kubectl 設定 Tab 鍵完成功能:
source <(kubectl completion bash)
- 在 Cloud Shell 中,使用以下指令為 kubectl 指令列工具設定您叢集的存取權:
gcloud container clusters get-credentials $my_cluster --zone $my_zone
- 在 Cloud Shell 中輸入下列指令,將存放區複製到研究室 Cloud Shell:
git clone https://github.com/GoogleCloudPlatform/training-data-analyst
- 建立一個軟連結,做為工作目錄的捷徑:
ln -s ~/training-data-analyst/courses/ak8s/v1.1 ~/ak8s
- 切換到包含研究室範例檔案的目錄:
cd ~/ak8s/Deployments/
建立部署作業資訊清單
使用名稱為 nginx-deployment.yaml
的範例部署作業資訊清單,以建立部署作業。這項部署作業會設為執行三個 Pod 備用資源,每個 Pod 中都有一個 nginx 容器,用於監聽 TCP 通訊埠 80:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
- 若要部署資訊清單,請執行下列指令:
kubectl apply -f ./nginx-deployment.yaml
- 若要查看部署作業清單,請執行下列指令:
kubectl get deployments
輸出內容應如範例所示。
輸出內容:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 0/3 3 0 3s
- 請等待數秒後重複該指令,直到指令回報的當前部署作業所列數量與所需部署作業數量相符。
最終輸出內容應如範例所示。
輸出內容:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 42s
點選「Check my progress」確認目標已達成。
建立和部署資訊清單 nginx 部署作業
工作 2:手動擴充和縮減部署作業中的 Pod 數量
有時候,您想關閉 Pod 執行個體。而有時候,又會想要執行十個 Pod。在 Kubernetes 中,可以將特定的 Pod 調整至所需的執行個體數量。若要關閉,請將資源調度率降至零。
在本工作中,於 Google Cloud 控制台和 Cloud Shell 擴充和縮減 Pod。
在控制台中擴充和縮減 Pod
- 切換到 Google Cloud 控制台分頁。
- 在「導覽選單」
中,依序點選「Kubernetes Engine」>「工作負載」。
- 點選「nginx-deployment」(也就是您的部署作業),開啟部署作業的詳細資料頁面。
- 依序點選頂端的「動作」>「資源調度」>「編輯備用資源」。
- 輸入「1」,然後點選「調整資源配置」。
這個動作會縮減叢集。您應該會在「Managed Pods」(代管的 Pod) 下方看到 Pod 的更新狀態。您可能必須先按一下「Refresh」(重新整理)。
在殼層中擴充和縮減 Pod
- 切換回 Cloud Shell 瀏覽器分頁。
- 若要在 Cloud Shell 查看部署作業中的 Pod 清單,請執行下列指令:
kubectl get deployments
輸出內容:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 1/1 1 1 3m
- 若要將 Pod 擴充回三個備用資源,請執行下列指令:
kubectl scale --replicas=3 deployment nginx-deployment
- 若要查看部署作業中的 Pod 清單,請執行下列指令:
kubectl get deployments
輸出內容:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 4m
工作 3:觸發部署作業的推出和復原
僅有在部署作業的 Pod 範本 (即 .spec.template
) 變更時,才會觸發部署作業的推出,例如更新範本的標籤或容器映像檔。其他更新 (例如調整部署作業) 則不會觸發推出。
在本項工作中觸發部署作業推出,然後觸發部署作業復原。
觸發部署作業推出
- 若要在部署作業更新 nginx 版本,請執行下列指令:
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record
這會將部署作業中的容器映像檔更新至 nginx v1.9.1
。
- 若要查看推出狀態,請執行下列指令:
kubectl rollout status deployment.v1.apps/nginx-deployment
輸出內容應如範例所示。
輸出內容:
Waiting for rollout to finish: 1 out of 3 new replicas updated...
Waiting for rollout to finish: 1 out of 3 new replicas updated...
Waiting for rollout to finish: 1 out of 3 new replicas updated...
Waiting for rollout to finish: 2 out of 3 new replicas updated...
Waiting for rollout to finish: 2 out of 3 new replicas updated...
Waiting for rollout to finish: 2 out of 3 new replicas updated...
Waiting for rollout to finish: 1 old replicas pending termination...
Waiting for rollout to finish: 1 old replicas pending termination...
deployment "nginx-deployment" successfully rolled out
- 取得部署作業清單,驗證變更內容:
kubectl get deployments
輸出內容應如範例所示。
輸出內容:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 6m
點選「Check my progress」確認目標已達成。
更新部署作業中的 nginx 版本
- 查看部署作業的推出記錄:
kubectl rollout history deployment nginx-deployment
輸出內容應如範例所示。輸出內容可能不會完全符合。
輸出內容:
deployments "nginx-deployment"
REVISION CHANGE-CAUSE
1
2 kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true
觸發部署作業復原程序
若要復原物件推出,可以使用 kubectl rollout undo
指令。
- 若要將 nginx 部署作業復原至先前的版本,請執行以下指令:
kubectl rollout undo deployments nginx-deployment
- 查看更新後的部署作業推出記錄:
kubectl rollout history deployment nginx-deployment
輸出內容應如範例所示。輸出內容可能不會完全符合。
輸出內容:
deployments "nginx-deployment"
REVISION CHANGE-CAUSE
2 kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true
3
- 查看最新部署作業修訂版本的詳細資料:
kubectl rollout history deployment/nginx-deployment --revision=3
輸出內容應如範例所示。輸出內容可能不會完全符合,但會顯示目前版本已復原為 nginx:1.7.9
。
輸出內容:
deployments "nginx-deployment" with revision #3
Pod Template:
Labels: app=nginx
pod-template-hash=3123191453
Containers:
nginx:
Image: nginx:1.7.9
Port: 80/TCP
Host Port: 0/TCP
Environment:
Mounts:
Volumes:
工作 4:在資訊清單中定義服務類型
在這項工作中,建立並驗證控制應用程式傳入流量的服務。可將服務類型設定為 ClusterIP、NodePort,或是 LoadBalancer。在本研究室中設定為 LoadBalancer。
在資訊清單中定義服務類型
會產生一個名稱為 service-nginx.yaml
的資訊清單檔案,可部署 LoadBalancer 服務類型。本服務設定能分配 TCP 通訊埠 60000 到通訊埠 80 的傳入流量,適用在任何標籤為 app: nginx
的容器。
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- protocol: TCP
port: 60000
targetPort: 80
- 若要在 Cloud Shell 部署資訊清單,請執行下列指令:
kubectl apply -f ./service-nginx.yaml
這個資訊清單會定義服務,並能套用在與選取器對應的 Pod 上。在這種情況下,資訊清單適用於您在工作 1 中所部署的 nginx 容器。本服務也適用於其他具有 app: nginx
標籤的 Pod,包括在服務後所建立的任何 Pod。
驗證 LoadBalancer (負載平衡器) 建立
- 若要查看 nginx 服務的詳細資料,請執行下列指令:
kubectl get service nginx
輸出內容應如範例所示。
輸出內容:
NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGE
nginx 10.X.X.X X.X.X.X 60000/TCP run=nginx 1m
- 如果看到外部 IP,請在瀏覽器的新分頁中開啟
http://[EXTERNAL_IP]:60000/
,查看透過網路負載平衡提供的伺服器。
注意:「ExternalIP」欄位可能需要幾秒才會填入位址,這是正常現象。只要每隔幾秒重新執行 kubectl get services nginx
指令,直到該欄位填入內容即可。
點選「Check my progress」確認目標已達成。
部署 LoadBalancer 服務類型的部署資訊清單檔案
工作 5:執行初期測試部署
初期測試部署是一個分隔的部署作業,用於測試應用程式新版本。單一 Service 會同時指定初期測試版本和一般部署作業做為目標,且可以將部分使用者導向至初期測試版本,以降低新版本的風險。
與主要部署作業相比,以提供的資訊清單檔案 nginx-canary.yaml
部署單一 Pod,該 Pod 執行的 nginx 版本會較新。在這項工作中,您會使用這個新的部署作業檔案,建立初期測試部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-canary
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
track: canary
Version: 1.9.1
spec:
containers:
- name: nginx
image: nginx:1.9.1
ports:
- containerPort: 80
在上一個工作中部署的 nginx 服務資訊清單,會使用標籤選取器以鎖定具有 app: nginx
標籤的 Pod。正常部署作業和新的初期測試部署都有 app: nginx
標籤。服務會將傳入連線分配到正常 Pod 和初期測試部署 Pod。與一般部署作業相比,初期測試部署的備用資源 (Pod) 較少,因此僅供較少的使用者使用。
- 根據設定檔建立初期測試部署:
kubectl apply -f nginx-canary.yaml
- 部署作業完成後,確認 nginx 和 nginx 初期測試部署是否確實存在:
kubectl get deployments
- 切換回連結至外部 LoadBalancer 服務 IP 的瀏覽器分頁,並重新整理頁面。您應該仍會看到
Welcome to nginx
標準頁面。
- 切換回 Cloud Shell,將主要部署作業的備用資源數量縮減為 0 個:
kubectl scale --replicas=0 deployment nginx-deployment
- 驗證目前執行中的唯一備用資源為初期測試部署:
kubectl get deployments
- 切換回連結至外部 LoadBalancer 服務 IP 的瀏覽器分頁,並重新整理頁面。您應該會持續看到標準的
Welcome to nginx
頁面,顯示服務正在自動平衡初期測試部署的流量。
點選「Check my progress」確認目標已達成。
建立初期測試部署
工作階段相依性
在這個研究室中採用的服務設定,無法確保來自單一用戶端的所有要求,一律會連線至相同的 Pod。每項要求都會單獨處理,而且有可能連線至一般 nginx 部署作業或 nginx 初期測試部署。
如果初期測試版的功能有重大變更,切換到不同版本可能會造成問題。為了防止這種情況,請在服務規範中將 sessionAffinity
欄位設定為 ClientIP
,即可在用戶端提出第一個要求時,決定後續連線會使用哪一個 Pod。
例如:
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: LoadBalancer
sessionAffinity: ClientIP
selector:
app: nginx
ports:
- protocol: TCP
port: 60000
targetPort: 80
摘要
在這個實驗室中,您瞭解 GKE 如何運用資訊清單檔案,來部署應用程式並調度資源,以及如何執行初期測試版本更新。以下是 GKE 和 AKS 主要的異同處:
相似處:
GKE 和 EKS 都是代管 Kubernetes 服務,可讓開發人員部署、管理容器化應用程式及調度資源。
- 用於 Kubernetes Deployment 的 YAML 檔案,在 GKE 和 AKS 的基本架構和語法完全相同。
- AKS 和 GKE 都是使用 kubectl 指令。
差異處:
- 與 AKS 部署作業不同,您可以在 GKE 指定叢集、Pod 和管理機制的屬性,而不需建立 DevOps pipeline。這是因為 GKE 具備必要的後端基礎架構,讓您能依據資訊清單檔案執行佈建工作。
關閉研究室
如果您已完成研究室,請按一下「End Lab」(關閉研究室)。Google Cloud Skills Boost 會移除您使用的資源,並清除所用帳戶。
您可以針對研究室的使用體驗評分。請選取合適的星級評等並提供意見,然後按一下「Submit」(提交)。
星級評等代表您的滿意程度:
- 1 星 = 非常不滿意
- 2 星 = 不滿意
- 3 星 = 普通
- 4 星 = 滿意
- 5 星 = 非常滿意
如果不想提供意見回饋,您可以直接關閉對話方塊。
如有任何想法、建議或指教,請透過「Support」(支援) 分頁提交。
Copyright 2022 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。