使用 Migrate for Anthos 從 Compute Engine 遷移至 Kubernetes Engine

1. 總覽

您不一定可以手動或重新設計現有應用程式,以便在 Kubernetes 中運作。Migrate for Anthos 可協助您翻新現有應用程式,並在 Kubernetes 中運作。在本程式碼研究室中,您會使用 Migrate for Anthos 將託管於 Compute Engine 的現有網頁應用程式遷移至 Kubernetes Engine。

課程內容

  • 如何在 Kubernetes 叢集中部署 Migrate for Anthos
  • 如何以現有的 Compute Engine 執行個體,以有狀態的集合建立容器
  • 如何將容器部署至 Kubernetes 並設定負載平衡器

軟硬體需求

  • 已設定帳單的 Google Cloud 專案。如果沒有 Google 帳戶,請先建立帳戶

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 流量進入我們的網路

執行個體成功建立後,系統會顯示包含執行個體詳細資料的資料表。記下外部 IP,我們需要這項資訊,才能驗證我們的網路伺服器稍後運作。

a08aa5bf924b107d.png

執行個體啟動並執行後,您就可以透過 SSH 從 Cloud Shell 登入執行個體,安裝 nginx 並啟動網路伺服器:

gcloud compute ssh --zone us-central1-a webserver

登入運算執行個體後,安裝 nginx:

sudo apt install nginx

使用 logout 指令登出 SSH 工作階段

請再次在瀏覽器中輸入執行個體的外部 IP,驗證網路伺服器是否正在執行。您應該會看到預設的 nginx 歡迎畫面:

5c08e3b2bd17e03.png

這個網路伺服器將會做為舊版網頁應用程式,我們會透過 Migrate for Anthos 遷移至 Kubernetes。

3. 搭配使用 Kubernetes 叢集與 Migrate for Anthos

接下來,我們會建立 GKE 叢集,而這個叢集最終會遷移 Compute Engine 網路伺服器。在 Cloud 控制台中,執行下列指令:

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

請稍候幾分鐘,讓系統完成這個指令。叢集建立完畢之後,您會收到一些輸出內容和詳細資料:

c69778b8fb8ac72b.png

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

45f5753cae53ccb5.png

在 Migrate for Anthos 的市集頁面中按一下「設定」。如果出現提示,請從清單中選取您的專案。繼續頁面將會顯示已輸入一些預設值的表單。確認所選叢集是我們剛剛建立的叢集,然後按一下「Deploy」(部署)

94dc6238b2affd16.png

現在,請將 Migrate for Anthos 部署至 Kubernetes 叢集。部署作業完成後,系統會顯示「確定」狀態 Kubernetes Engine「Applications」頁面上:

5bf601103a5335cf.png

4. 從運算執行個體到有狀態集合

我們已建立執行 Migrate for Anthos 的 Kubernetes 叢集,現在可以開始遷移程序。為了將運算執行個體部署至 Kubenetes 叢集,我們將關閉 Compute Engine 執行個體,以建立磁碟的快照。在繼續之前,請先記下執行個體 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 執行個體已關閉
  • 從每個執行個體的磁碟建立快照
  • 根據各個快照建立新磁碟
  • 刪除 VM 建立的快照
  • 在目前的工作目錄中產生 YAML 檔案,以部署用來託管網路伺服器的有狀態集

產生的 yaml 檔案會在 Kubernetes 叢集中佈建一個有狀態的組合,以及將複製的磁碟掛接至網路伺服器容器所需的永久磁碟區要求。我們可透過 kubectl 套用這些變更:

kubectl apply -f containerized-webserver.yaml

檢查「工作負載」頁面中 webserver-statefulset 的狀態:

狀態顯示「Pod 待處理」狀態正常執行 kubectl apply 後幾分鐘。狀態顯示「確定」時,請出發。

5. 向負載平衡器公開叢集

此時,我們的 Kubenetes 叢集應以有狀態集的形式執行網路伺服器,但我們也必須將容器公開至負載平衡器,才能透過外部 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 歡迎畫面:

5c08e3b2bd17e03.png

我們做到了!我們的 GCE 網路伺服器現已託管於 Kubernetes!太棒了!

6. Stackdriver 監控功能

指標

Kubernetes Engine 屬於代管型 Kubernetes 服務,因此會透過 Stackdriver 自動檢測,用於記錄和監控作業。讓我們來看看 Stackdriver 自動擷取的指標。

點選產品選單上的「Monitoring」連結。首次透過專案存取這項作業可能需要幾分鐘的時間,請稍候片刻。

載入後,請將滑鼠遊標懸停在左側窗格中的「資源」上,然後選取「Kubernetes Engine (新版)」。

4e62c8ad3f2b3fe9.png

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

62066a9251d19843.png

在「工作負載」檢視畫面中,展開「my-gke-cluster」然後細查預設類別 >webserver-statefulset >webserver-statefulset-0 >網路伺服器-statefulset按一下「webserver-stateful set」容器。以下說明 Stackdriver 擷取的一些立即可用的指標,包括記憶體使用率和 CPU 使用率。

d054778de301429e.png

這個資訊主頁中顯示的圖表是我們可用來建立自訂資訊主頁的圖表。

自訂資訊主頁

Stackdriver 讓我們建立自訂資訊主頁,方便為可用的指標資料整理圖表與圖形。現在來建立自訂資訊主頁,以快速瀏覽部分網路伺服器的指標。

在左側窗格中,將遊標懸停在「資訊主頁」上,然後按一下「建立資訊主頁」。

56a0513efe60de3e.png

有空白的資訊主頁後,我們就可以新增需要密切留意的指標。為未命名的資訊主頁命名,例如「我的網路伺服器容器」然後按一下 [新增圖表]

bd66ba91f3125028.png

還記得現成的指標嗎?讓我們新增關於容器 CPU 使用率的圖表。在「圖表標題」欄位中輸入「CPU 使用率」。在「Find resource type and metric」(尋找資源類型和指標) 方塊中,輸入 request_utilization,然後從篩選清單中選取 CPU 要求使用率。這個選項會填入「資源類型」和「指標」欄位。

接著,依據 project_id (如有多個專案) 和 container_name 進行篩選。在篩選器方塊中輸入「project_id」project_id,從篩選清單中選取專案,然後在「值」欄位中選取您的專案。我們也必須按照 container_name 進行篩選。在「篩選器」方塊中輸入「container_name」,從篩選清單中選取所需項目,然後在「值」欄位中選取「webserver-statefulset」。按一下「儲存」。

我們現在擁有顯示第一張圖表的資訊主頁。

3d3d45e4357454e0.png

7. 運作時間檢查和快訊政策

Stackdriver 可以設定快訊,在指標達到指定的任何門檻值時通知我們。舉例來說,當上個步驟的 CPU 使用率超過特定門檻時,我們就可以讓 Stackdriver 傳送電子郵件給我們,這可能代表應用程式發生問題。為了展示這些快訊的模樣,請設定運作時間檢查,然後模擬服務中斷情形。

在左側窗格中,依序選取「運作時間檢查」和「運作時間檢查總覽」:

49368e5700274cf2.png

如「運作時間檢查」頁面建議,讓我們設定第一項運作時間檢查。按一下頁面右上方的「新增運作時間檢查」按鈕。

d884560f91011009.png

在繼續表單中輸入「端點運作時間」做為主機名稱,並使用負載平衡器的外部 IP 位址做為主機名稱。

568a8f1e27ae8417.png

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

f89d53a106a709f4.png

按一下「建立快訊政策」

我們將這項「端點運作時間政策」命名為「端點運作時間政策」。在「Configuration」(設定) 部分中,設定「Condition trigger if」改為「Any time series violation」(任何時間序列違反條件時)然後按一下「儲存」

74609849348bd03e.png

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

44c474e28a497659.png

按一下「Add Notification Channe」。最後,在表單底部將政策命名為「網頁應用程式運作時間」然後按一下「儲存」

如要查看快訊的呈現方式,請在 Cloud 控制台中再次開啟 Cloud Shell。下列指令會停止在網路伺服器 Pod 中執行的 nginx 服務:

kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx -s stop"

幾分鐘後,您應該會收到服務中斷的電子郵件:

808ac1d75ce3681f.png

讓我們恢復計時返回 Cloud Shell,重新啟動 nginx:

kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx"

幾分鐘後,您還會收到另一封 Stackdriver 電子郵件,但這次有好消息要告訴您:

5b8262fbbc4877c.png

8. 清除

既然我們已透過 Migrate for Anthos 從 GCE 遷移至 GKE,讓我們來清除已建立的所有資源。

刪除專案

如有需要,您可以刪除整個專案。前往 GCP Console 的「Cloud Resource Manager」頁面。

在專案清單中,選取處理中的專案,然後按一下「Delete」(刪除)。系統會提示您輸入專案 ID。輸入 PIN 碼,然後按一下「關閉」

如果想逐一刪除不同元件,請按照下一節的說明操作。

Stackdriver

資訊主頁

在資訊主頁頁面中,按一下頁面頂端的設定圖示 dc259295eb33cb42.png,然後選取「刪除資訊主頁」

快訊政策

政策頁面中,為您建立的每項政策,從右側的「動作」選單 2ef75d82e76accaa.png 中選取「刪除」

運作時間檢查

在「運作時間檢查」頁面中,從您建立的每個檢查項目右側的「動作」選單中,選取「刪除」

GCE 和 Kubernetes

Google Compute Engine 執行個體

gcloud compute instances delete webserver --zone=us-central1-a

Kubernetes 叢集 (包括 Migrate for Anthos、有狀態的集合和負載平衡器服務)

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 並建立自訂資訊主頁
  • 我們設定了運作時間檢查與快訊政策,在網路伺服器當機時通知我們