總覽
在本實驗室中,您將瞭解使用 Deployment 資訊清單的基本知識。資訊清單是包含 Deployment 所需設定的檔案,可以在不同的 Pod 上使用。變更資訊清單並不困難。
目標
本實驗室將說明如何執行下列工作:
- 建立 Deployment 資訊清單、部署至叢集,並在節點停用時驗證 Pod 重新排程作業。
 
- 在 Deployment 中觸發手動擴充和縮減 Pod。
 
- 觸發 Deployment 的推出 (滾動式更新至新版本) 和復原作業。
 
- 執行初期測試部署作業。
 
設定實驗室
存取實驗室
每個實驗室都會提供新的 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:建立 Deployment 資訊清單並部署至叢集
在這項工作中,為叢集內的 Pod 建立 Deployment 資訊清單。
連線至實驗室 GKE 叢集
- 在 Cloud Shell 輸入下列指令,設定可用區和叢集名稱的環境變數:
 
export my_region={{{ project_0.default_region | REGION }}}
export my_cluster=dev-cluster
- 在 Cloud Shell 為 kubectl 設定 Tab 鍵完成功能:
 
source <(kubectl completion bash)
- 在 Cloud Shell 輸入下列指令,為 kubectl 指令列工具設定叢集的存取權:
 
gcloud container clusters get-credentials $my_cluster --region $my_region
建立 Deployment 資訊清單
建立 Deployment 時,應使用名稱為 nginx-deployment.yaml 的範例 Deployment 資訊清單。這個 Deployment 會設為執行三個 Pod 備用資源,每個 Pod 都有一個 nginx 容器,用來監聽 TCP 通訊埠 80。
- 執行下列 nano 指令,建立 
nginx-deployment.yaml 檔案並在編輯器中開啟: 
nano nginx-deployment.yaml
- 開啟 nano 編輯器後,將下列指令貼到 
nginx-deployment.yaml 檔案: 
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.27.0
        ports:
        - containerPort: 80
- 
依序按下 Ctrl+O 和 Enter 鍵,儲存編輯過的檔案。
 
- 
按下 Ctrl+X 鍵,退出 nano 文字編輯器。
 
- 
執行下列指令來部署資訊清單:
 
kubectl apply -f ./nginx-deployment.yaml
- 執行下列指令即可查看 Deployment 清單:
 
kubectl get deployments
輸出內容應如範例所示。
輸出內容:
NAME               READY      UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   0/3        3            0           3s
- 數分鐘後重複執行該指令,直到指令回報「目前」的 Deployment 數量,等同於「所需」的 Deployment 數量為止。
 
最終輸出內容應如範例所示。
輸出內容:
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           42s
點選「Check my progress」,確認目標已達成。
建立和部署 nginx Deployment 資訊清單
工作 2:手動擴充和縮減 Deployment 中的 Pod 數量
有時候,您想關閉 Pod 執行個體,有時候,又會想要執行十個 Pod。在 Kubernetes 中,特定的 Pod 可調整至所需的執行個體數量。將資源調度率降至零即可關閉。
這個工作的目標就是在 Google Cloud 控制台及 Cloud Shell 擴充和縮減 Pod。
在控制台中擴充和縮減 Pod
- 切換到 Google Cloud 控制台分頁。
 
- 從「導覽選單」
 依序點選「Kubernetes Engine」>「工作負載」。 
- 點選「nginx-deployment」(也就是您的 Deployment),開啟 Deployment 的詳細資料頁面。
 
- 依序點選頂端的「動作」>「資源調度」>「編輯備用資源」。
 
- 輸入「1」,然後點選「調整資源配置」。
 
這個動作會縮減叢集。您應該會在「代管的 Pod」下方看到 Pod 的更新狀態,有時候需要先按一下「重新整理」。
在殼層中擴充和縮減 Pod
- 切換回 Cloud Shell 瀏覽器分頁。
 
- 執行下列指令,在 Cloud Shell 查看 Deployment 中的 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
- 執行下列指令,查看 Deployment 中的 Pod 清單:
 
kubectl get deployments
輸出內容:
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           4m
工作 3:觸發 Deployment 的推出和復原
僅在 Deployment 的 Pod 範本 (即 .spec.template) 變更時,才會觸發 Deployment 的推出,例如更新範本的標籤或容器映像檔。其他更新 (例如調整 Deployment) 則不會觸發推出。
在本項工作中觸發 Deployment 推出,然後觸發 Deployment 復原。
觸發 Deployment 推出
- 執行下列指令,在 Deployment 更新 nginx 版本:
 
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.28.0 
這會將 Deployment 中的容器映像檔更新至 nginx v1.28.0。
- 執行下列指令,為推出作業加上異動詳情的註解:
 
kubectl annotate deployment nginx-deployment kubernetes.io/change-cause="version change to 1.28.0" --overwrite=true
- 執行下列指令,查看推出狀態:
 
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
- 取得 Deployment 清單,驗證變更內容:
 
kubectl get deployments
輸出內容應如範例所示。
輸出內容:
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           6m
點選「Check my progress」,確認目標已達成。
更新 Deployment 中的 nginx 版本
- 查看 Deployment 的推出記錄:
 
kubectl rollout history deployment nginx-deployment
輸出內容應如範例所示,可能不會完全符合。
輸出內容:
deployments "nginx-deployment"
REVISION  CHANGE-CAUSE
1         
2         version change to 1.28.0
觸發 Deployment 復原程序
若要復原物件推出,可以使用 kubectl rollout undo 指令。
- 執行以下指令,將 nginx Deployment 復原至先前的版本:
 
kubectl rollout undo deployments nginx-deployment
- 查看更新後的 Deployment 推出記錄:
 
kubectl rollout history deployment nginx-deployment
輸出內容應如範例所示,可能不會完全符合。
輸出內容:
deployments "nginx-deployment"
REVISION  CHANGE-CAUSE
2        version change to 1.28.0
3         
注意:「CHANGE-CAUSE」部分未列出最近一次更新內容,是因為我們並未使用 kubectl annotate 指令。
- 查看最新 Deployment 修訂版本的詳細資料:
 
kubectl rollout history deployment/nginx-deployment --revision=3
輸出內容應如範例所示,可能不會完全符合,但會顯示目前修訂版本已復原為 nginx:1.27.0。
輸出內容:
deployments "nginx-deployment" with revision #3
Pod Template:
  Labels:       app=nginx
        pod-template-hash=3123191453
  Containers:
   nginx:
    Image:      nginx:1.27.0
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        
    Mounts:     
  Volumes:      
工作 4:在資訊清單中定義 Service 類型
在這項工作中,建立並驗證控制應用程式傳入流量的服務。Service 類型可設定為 ClusterIP、NodePort,或是 LoadBalancer。在本實驗室中將設定為 LoadBalancer。
在資訊清單中定義 Service 類型
您會看到一個名稱為 service-nginx.yaml 的資訊清單檔案,可部署 LoadBalancer Service 類型。這項 Service 會設為將 TCP 通訊埠 60000 的傳入流量分配給通訊埠 80,並適用於任何標籤為 app: nginx 的容器。
- 執行下列 nano 指令,建立 
service-nginx.yaml 檔案並在編輯器中開啟: 
nano service-nginx.yaml
- 開啟 nano 編輯器後,將下列指令貼到 
service-nginx.yaml 檔案: 
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 60000
    targetPort: 80
- 
依序按下 Ctrl+O 和 Enter 鍵,儲存編輯過的檔案。
 
- 
按下 Ctrl+X 鍵,退出 nano 文字編輯器。
 
- 
在 Cloud Shell 執行下列指令,部署資訊清單:
 
kubectl apply -f ./service-nginx.yaml
這個資訊清單會定義 Service,並能套用在與選取器對應的 Pod 上。在這種情況下,資訊清單適用於您在工作 1 中所部署的 nginx 容器。本 Service 也適用於其他具有 app: nginx 標籤的 Pod,包括在 Service 後所建立的任何 Pod。
驗證 LoadBalancer 建立
- 執行下列指令,查看 nginx Service 的詳細資料:
 
kubectl get service nginx
輸出內容應如範例所示。
輸出內容:
NAME   Type          CLUSTER-IP   EXTERNAL-IP    PORT(S)           AGE
nginx  LoadBalancer  10.X.X.X     X.X.X.X        60000:31798/TCP   1m
- 如果看到外部 IP,請在瀏覽器的新分頁開啟 
http://[EXTERNAL_IP]:60000/,查看透過網路負載平衡提供的伺服器。 
注意:「ExternalIP」欄位可能需要幾秒才會填入位址,這是正常現象。每隔幾秒重新執行 kubectl get services nginx 指令,直到該欄位填入內容即可。
點選「Check my progress」,確認目標已達成。
部署 LoadBalancer Service 類型的資訊清單檔案
工作 5:執行初期測試部署
初期測試部署是單獨的 Deployment,用來測試應用程式新版本。單一 Service 會同時指定初期測試版本和正常 Deployment 為目標,且可以將部分使用者導向至初期測試版本,降低新版本的風險。
您會在這項工作中建立初期測試部署,僅部署單一 Pod,但執行的 nginx 版本比主要 Deployment 還新。
- 執行下列 nano 指令,建立 
nginx-canary.yaml 檔案並在編輯器中開啟: 
nano nginx-canary.yaml
- 開啟 nano 編輯器後,將下列指令貼到 
nginx-canary.yaml 檔案: 
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.28.0
    spec:
      containers:
      - name: nginx
        image: nginx:1.28.0
        ports:
        - containerPort: 80
- 
依序按下 Ctrl+O 和 Enter 鍵,儲存編輯過的檔案。
 
- 
按下 Ctrl+X 鍵,退出 nano 文字編輯器。
 
您在先前的工作中部署的 nginx Service 資訊清單,會以標籤選取器來指定加上 app: nginx 標籤的 Pod。正常部署作業和新的初期測試部署都有 app: nginx 標籤。Service 會將傳入連線分配到正常 Pod 和初期測試部署 Pod。與正常部署相比,初期測試部署的備用資源 (Pod) 較少,因此僅供較少的使用者使用。
- 根據設定檔建立初期測試部署:
 
kubectl apply -f ./nginx-canary.yaml
- 部署作業完成後,確認 nginx 和 nginx-canary 這兩項 Deployment 是否確實存在:
 
kubectl get deployments
- 切換回連結至外部 LoadBalancer Service IP 的瀏覽器分頁,並重新整理頁面。您應該仍會看到 
Welcome to nginx 標準頁面。 
- 切換回 Cloud Shell,將主要 Deployment 的備用資源數量縮減為 0 個:
 
kubectl scale --replicas=0 deployment nginx-deployment
- 驗證目前執行中的唯一備用資源是初期測試部署:
 
kubectl get deployments
- 切換回連結至外部 LoadBalancer Service IP 的瀏覽器分頁,並重新整理頁面。您應該會持續看到標準的 
Welcome to nginx 頁面,顯示該 Service 正在自動平衡初期測試部署的流量。 
點選「Check my progress」,確認目標已達成。
建立初期測試部署
工作階段相依性
在這個實驗室中採用的 Service 設定,無法確保來自單一用戶端的所有要求,一律會連線至相同的 Pod。每項要求都會單獨處理,而且有可能連線至正常 nginx 或 nginx-canary 的 Deployment。
如果初期測試版的功能有重大變更,切換到不同版本可能會造成問題。為了防止這種情況,請在 Service 規範中將 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
關閉研究室
如果您已完成研究室,請按一下「End Lab」(關閉研究室)。Google Cloud Skills Boost 會移除您使用的資源,並清除所用帳戶。
您可以針對研究室的使用體驗評分。請選取合適的星級評等並提供意見,然後按一下「Submit」(提交)。
星級評等代表您的滿意程度:
- 1 星 = 非常不滿意
 
- 2 星 = 不滿意
 
- 3 星 = 普通
 
- 4 星 = 滿意
 
- 5 星 = 非常滿意
 
如果不想提供意見回饋,您可以直接關閉對話方塊。
如有任何想法、建議或指教,請透過「Support」(支援) 分頁提交。
Copyright 2022 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。