1. 總覽
手動重寫或重新設計現有應用程式,使其能在 Kubernetes 上運作,有時並不可行。Migrate for Anthos 可協助您翻新現有應用程式,並在 Kubernetes 中執行。在本程式碼研究室中,您將使用 Migrate for Anthos,將 Compute Engine 上託管的現有網頁應用程式遷移至 Kubernetes Engine。
課程內容
- 如何在 Kubernetes 叢集上部署 Migrate for Anthos
- 如何從現有 Compute Engine 執行個體,在有狀態集建立容器
- 如何將容器部署至 Kubernetes,並透過負載平衡器進行設定
軟硬體需求
- 已設定帳單的 Google Cloud 專案。如果沒有,請建立一個。
2. 開始設定
本程式碼研究室完全可在 Google Cloud Platform 上執行,不需進行任何本機安裝或設定。
啟用 API
開始前,請務必在 Google Cloud 專案中啟用必要 API:
建立 Compute 執行個體網路伺服器
讓我們建立運算執行個體,用來託管初始 nginx 網頁伺服器,並建立防火牆規則,允許我們查看網頁伺服器的預設到達網頁。我們可以使用幾種方式執行這項操作,但為了方便起見,我們將使用 Cloud Shell。
在 Cloud Shell 中執行下列指令:
gcloud compute instances create webserver --zone=us-central1-a && \ gcloud compute firewall-rules create default-allow-http --allow=tcp:80
這項指令的前半部會在 us-central1-a 區域中建立 Google Cloud 執行個體,後半部則會建立名為「default-allow-http」的防火牆規則,允許 HTTP 流量進入網路。
執行個體建立成功後,系統會顯示包含執行個體詳細資料的表格。記下「External IP」(外部 IP),稍後我們會使用這個 IP 確認網路伺服器是否正在執行。

執行個體啟動並開始運作後,我們就能從 Cloud Shell 透過 SSH 連線至執行個體,安裝 nginx 並啟動網路伺服器:
gcloud compute ssh --zone us-central1-a webserver
登入運算執行個體後,請安裝 Nginx:
sudo apt install nginx
使用 logout 指令登出 SSH 工作階段
請在瀏覽器中輸入稍早的執行個體外部 IP,確認網頁伺服器是否正在執行。您應該會看到預設的 nginx 歡迎畫面:

這個網路伺服器將做為舊版網路應用程式,我們將使用 Migrate for Anthos 遷移至 Kubernetes。
3. 搭載 Migrate for Anthos 的 Kubernetes 叢集
接著,我們要建立 GKE 叢集,最終將 Compute Engine 網頁伺服器遷移至該叢集。在 Cloud Shell 中執行下列指令:
gcloud container clusters create my-gke-cluster \ --zone us-central1-a \ --cluster-version 1.13 \ --machine-type n1-standard-4 \ --image-type "UBUNTU" \ --num-nodes 1 \ --enable-stackdriver-kubernetes
請稍候幾分鐘,等待這個指令完成。叢集建立完成後,您會收到一些輸出內容,其中包含叢集詳細資料:

接著前往 GCP Marketplace 部署 Migrate for Anthos:

在 Migrate for Anthos 的 Marketplace 頁面中,按一下「設定」,然後在系統提示時從清單中選取專案。後續頁面會顯示表單,並預先填入部分預設值。確認選取的叢集是我們剛建立的叢集,然後按一下「Deploy」(部署):

現在應該已在 Kubernetes 叢集上部署 Migrate for Anthos。部署完成後, Kubernetes Engine 應用程式頁面會顯示「OK」狀態:

4. 從運算執行個體到有狀態的集合
我們已執行 Migrate for Anthos 的 Kubernetes 叢集,現在可以開始遷移程序。如要將運算執行個體部署至 Kubernetes 叢集,請關閉運算引擎執行個體,以便建立磁碟快照。請先記下執行個體 ID,後續步驟會用到:
gcloud compute instances describe webserver --zone us-central1-a | grep ^id
現在要關閉運算執行個體:
gcloud compute instances stop webserver --zone us-central1-a
執行個體停止後,我們就能安全地執行下列指令碼,為磁碟建立快照。請務必插入專案 ID 和執行個體 ID:
python3 /google/migrate/anthos/gce-to-gke/clone_vm_disks.py \ -p <project-id> -i <instance-id> \ -z us-central1-a \ -T us-central1-a \ -A webserver-statefulset \ -o containerized-webserver.yaml
有了這些旗標,clone_vm_disks.py 會:
- 確認 GCE 執行個體已關閉
- 為每個執行個體的磁碟建立快照
- 使用每個快照建立新磁碟
- 刪除建立的快照
- 在目前的工作目錄中產生 YAML 檔案,用於部署將代管網路伺服器的有狀態集
產生的 yaml 檔案會在 Kubernetes 叢集中佈建有狀態集,以及將複製的磁碟掛接到網頁伺服器容器所需的永久磁碟區聲明。我們可以透過 kubectl 套用這些變更:
kubectl apply -f containerized-webserver.yaml
在「工作負載」頁面檢查 webserver-statefulset 的狀態:
執行 kubectl apply 後,狀態顯示「Pods are pending」幾分鐘是正常現象。狀態顯示「正常」後,即可繼續操作。
5. 將叢集公開至負載平衡器
此時,我們的 Kubernetes 叢集應會以有狀態集的形式執行網路伺服器,但我們也需要將容器公開至負載平衡器,才能透過外部 IP 位址存取網路伺服器。在 Cloud Shell 中,建立名為 loadbalancer.yaml 的新檔案,並在其中加入下列內容:
loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
name: webserver-loadbalancer
spec:
type: LoadBalancer
selector:
app: webserver-statefulset
ports:
- protocol: TCP
port: 80
targetPort: 80
現在使用 kubectl 應用程式套用:
kubectl apply -f loadbalancer.yaml
我們可以使用 kubectl 擷取 webserver-container 服務的外部 IP 位址:
kubectl get services
在瀏覽器中輸入外部 IP 位址,應該會看到與先前相同的預設 nginx 歡迎畫面:

我們辦到了!我們的 GCE 網頁伺服器現在已託管於 Kubernetes!太棒了!
6. Stackdriver 監控
指標
Kubernetes Engine 是代管 Kubernetes 服務,因此會自動透過 Stackdriver 進行記錄和監控。接下來要介紹 Stackdriver 自動擷取的幾項指標。
按一下產品選單中的「Monitoring」連結。如果是第一次從專案存取,系統可能需要幾分鐘設定工作區。
載入完成後,將游標懸停在左窗格中的「資源」上,然後從選單中選取「Kubernetes Engine NEW」。

這裡顯示的資訊主頁中,每一列都代表一個 Kubernetes 資源。您可以透過資訊主頁上方的連結,切換基礎架構、工作負載或服務檢視畫面。

在「工作負載」檢視畫面中,展開「my-gke-cluster」,然後依序向下鑽研至 default > webserver-statefulset > webserver-statefulset-0 > webserver-statefulset。按一下 webserver-stateful set 容器。您可以在這裡找到 Stackdriver 擷取的幾項指標,包括記憶體使用率和 CPU 使用率。

這個資訊主頁中顯示的圖表,可用於建立自訂資訊主頁。
自訂資訊主頁
Stackdriver 可讓我們建立自訂資訊主頁,用來整理任何可用指標資料的圖表。現在,請建立自訂資訊主頁,以便快速查看網路伺服器的一些指標。
在左側窗格中,將游標懸停在「資訊主頁」上,然後按一下「建立資訊主頁」。

現在我們有了空白資訊主頁,可以加入要監控的指標。讓我們為未命名的資訊主頁取個實用的名稱,例如「我的網頁伺服器容器」,然後按一下右上方的「新增圖表」:

還記得預設指標嗎?我們來新增容器 CPU 使用率的圖表。在「圖表標題」欄位中,輸入「CPU 使用率」。在「尋找資源類型和指標」方塊中,輸入 request_utilization,然後從篩選後的清單中選取「CPU request utilization」(CPU 請求用量)。系統會根據這項選取項目,填入「資源類型」和「指標」欄位。
接著,我們要依 project_id (如果有多個專案) 和 container_name 進行篩選。在「篩選器」方塊中輸入 project_id,從篩選後的清單中選取該項目,然後在「值」欄位中選取專案。我們也需要依 container_name 篩選。在「篩選器」方塊中輸入 container_name,從篩選後的清單中選取該項目,然後在「值」欄位中選取 webserver-statefulset。按一下「儲存」。
現在我們有第一個圖表的資訊主頁。

7. 運作時間檢查和快訊政策
透過 Stackdriver,我們可以設定快訊,在任何指標達到我們指定的門檻值時通知我們。舉例來說,如果上一個步驟的 CPU 使用率在一段時間內持續高於特定門檻,Stackdriver 可以傳送電子郵件通知我們,這可能表示應用程式有問題。為了示範這些快訊的樣子,請設定正常運作時間檢查,然後模擬中斷。
從左側窗格中,依序選取「運作時間檢查」和「運作時間檢查總覽」:

如「運作時間檢查」頁面所示,請設定第一個運作時間檢查。按一下頁面右上方的「新增運作時間檢查」按鈕。
在後續表單中,輸入「Endpoint Uptime」做為標題,並輸入負載平衡器的外部 IP 位址做為主機名稱。

按一下「儲存」,系統會提示您建立隨附的「快訊政策」:

按一下「建立快訊政策」。
我們將此政策命名為「Endpoint Uptime Policy」。在「設定」部分,將「符合下列情況時觸發條件」設為「任何時間序列違反條件時」,然後按一下「儲存」。

我們還沒完成。接著,我們會指定通知管道,以便在違反快訊政策時收到通知。在「通知管道類型」下拉式選單中選取「電子郵件」,然後輸入有效的電子郵件地址。

按一下「新增通知管道」。最後,在表單底部將政策命名為「Web App Uptime」,然後按一下「儲存」。
如要查看快訊的顯示方式,請再次開啟 Cloud Shell。下列指令會停止在網路伺服器 Pod 中執行的 nginx 服務:
kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx -s stop"
幾分鐘後,您應該會收到通知服務中斷的電子郵件:

讓我們復原這項操作。回到 Cloud Shell,重新啟動 Nginx:
kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx"
幾分鐘後,您會收到另一封 Stackdriver 電子郵件,這次的內容比之前好:

8. 清除
我們已使用 Migrate for Anthos 從 GCE 遷移至 GKE,現在要清除專案中建立的所有資源。
刪除專案
如有需要,也可以刪除整個專案。前往 GCP 主控台的「Cloud Resource Manager」頁面:
在專案清單中,選取我們一直在處理的專案,然後按一下「刪除」。系統會提示您輸入專案 ID。輸入後,按一下「關機」。
如要逐一刪除不同元件,請參閱下一節。
Stackdriver
資訊主頁
在資訊主頁頁面中,按一下頁面頂端的設定圖示
,然後選取「刪除資訊主頁」。
快訊政策
在「政策」頁面中,針對您建立的每項政策,從右側的「動作」選單
選取「刪除」。
運作時間檢查
在「運作時間檢查」頁面中,從您建立的每項檢查右側「動作」選單中選取「刪除」。
GCE 和 Kubernetes
Google Compute Engine 執行個體
gcloud compute instances delete webserver --zone=us-central1-a
Kubernetes 叢集 (包括 Migrate for Anthos、StatefulSet 和負載平衡器服務)
gcloud container clusters delete my-gke-cluster --zone=us-central1-a
磁碟
我們的有狀態集使用了我們建立的磁碟。使用下列指令擷取名稱:
gcloud compute disks list --filter=webserver
使用您的磁碟名稱取代我的名稱,然後使用以下指令刪除磁碟:
gcloud compute disks delete vls-690d-webserver --zone=us-central1-a
全部清除完畢!
9. 恭喜!
太棒了!您使用 Migrate for Anthos,將網頁伺服器從 GCE 執行個體遷移至 Kubernetes 叢集。
涵蓋內容
- 我們使用 Migrate for Anthos,將網頁伺服器從 GCE 遷移至 Kubernetes 叢集
- 我們透過 Kubernetes 負載平衡器服務公開有狀態集網頁伺服器,讓全世界都能存取。
- 我們已啟用 Stackdriver 並建立自訂資訊主頁
- 我們設定了運作時間檢查和快訊政策,以便在網路伺服器停機時收到通知
