有了 GDC 的 VM 執行階段,您就能直接將虛擬機器 (VM) 工作負載部署至僅限裸機的 Distributed Cloud 軟體安裝作業。在本教學課程中,您會將代表零售銷售點終端機的範例銷售點應用程式,從 Compute Engine VM 遷移至裸機叢集,並存取其網頁前端。
部署作業會使用預先準備的磁碟映像檔,其中工作負載會以 systemd 服務的形式執行。您也可以按照這些步驟,準備及部署自己的 VM 應用程式。
目標
事前準備
如要完成這份文件,您需要下列資源:
- 存取 1.12.0 以上版本的裸機叢集,該叢集是按照「使用手動負載平衡器安裝」指南建立。本文件會設定網路資源,讓您能透過瀏覽器存取 VM 內執行的工作負載。如果不需要這項行為,可以按照這份文件,使用任何僅適用於裸機的 Distributed Cloud 軟體安裝。
- 符合下列條件的工作站:
在 GDC 啟用 VM 執行階段,並安裝 virtctl 外掛程式
自 1.10 版起,所有裸機叢集都包含 GDC 自訂資源定義的 VM Runtime。安裝時,系統已建立 VMRuntime 自訂資源的執行個體。不過,系統預設會停用這項功能。
在 GDC 啟用 VM 執行階段:
sudo bmctl enable vmruntime --kubeconfig KUBECONFIG_PATH- KUBECONFIG_PATH:使用者叢集 kubeconfig 檔案的路徑。
確認
VMRuntime已啟用:kubectl wait --for=jsonpath='{.status.ready}'=true vmruntime vmruntimeVMRuntime可能需要幾分鐘才能準備就緒。如果尚未就緒,請稍候片刻,然後再檢查幾次。以下輸出範例顯示VMRuntime已就緒:vmruntime.vm.cluster.gke.io/vmruntime condition met安裝
kubectl的 virtctl 外掛程式:sudo -E bmctl install virtctl以下輸出範例顯示
virtctl外掛程式安裝程序已完成:Please check the logs at bmctl-workspace/log/install-virtctl-20220831-182135/install-virtctl.log [2022-08-31 18:21:35+0000] Install virtctl succeeded驗證
virtctl外掛程式的安裝作業:kubectl virt以下輸出範例顯示
virtctl外掛程式可與kubectl搭配使用:Available Commands: addvolume add a volume to a running VM completion generate the autocompletion script for the specified shell config Config subcommands. console Connect to a console of a virtual machine instance. create Create subcommands. delete Delete subcommands. ...
部署以 VM 為基礎的工作負載
將 VM 部署至僅限裸機的 Distributed Cloud 軟體安裝時,GDC 的 VM 執行階段會預期 VM 映像檔。這個映像檔會做為已部署 VM 的開機磁碟。
如要將現有 VM 遷移至叢集,必須先建立該 VM 的磁碟映像檔。接著,映像檔必須託管在叢集可存取的存放區中。最後,您可以使用該映像檔的網址建立 VM。GDC 的 VM 執行階段預期映像檔採用 qcow2 格式。如果您提供其他圖片類型,系統會自動轉換為 qcow2 格式。為避免重複轉換並啟用重複使用功能,您可以轉換虛擬磁碟映像檔並託管 qcow2 映像檔。
在下列步驟中,您將使用預先準備的 qcow2 映像檔,其中範例工作負載已建立為 VM 磁碟映像檔 (位於 Google Cloud ),並匯出至 Cloud Storage bucket。
您可以在 anthos-samples GitHub 存放區中找到本文件中的原始碼。您將使用這個存放區中的資源,完成後續步驟。
部署 MySQL
StatefulSet。銷售點應用程式會連線至 MySQL 資料庫,儲存商品目錄和付款資訊。銷售點存放區包含範例資訊清單,可部署 MySQLStatefulSet、設定相關聯的ConfigMap,以及 KubernetesService。ConfigMap會定義 MySQL 執行個體的憑證,這些憑證與傳遞至銷售點應用程式的憑證相同。kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/point-of-sale/main/k8-manifests/common/mysql-db.yaml使用預先準備的
qcow2映像檔部署 VM 工作負載:kubectl virt create vm pos-vm \ --boot-disk-size=80Gi \ --memory=4Gi \ --vcpu=2 \ --image=https://storage.googleapis.com/pos-vm-images/pos-vm.qcow2這個指令會建立以 VM 命名的 YAML 檔案 (
google-virtctl/pos-vm.yaml)。您可以檢查檔案,查看VirtualMachine和VirtualMachineDisk的定義。除了使用virtctl外掛程式,您也可以使用 Kubernetes 資源模型 (KRM) 定義部署 VM 工作負載,如建立的 YAML 檔案所示。指令成功執行後,會產生類似以下範例的輸出內容,說明已建立的不同資源:
Constructing manifest for vm "pos-vm": Manifest for vm "pos-vm" is saved to /home/tfadmin/google-virtctl/pos-vm.yaml Applying manifest for vm "pos-vm" Created gvm "pos-vm"查看 VM 建立狀態。
VirtualMachine資源是由 GDC VM 執行階段中的vm.cluster.gke.io/v1.VirtualMachine資源識別。簡稱gvm。建立 VM 時,系統會建立下列兩項資源:
- VirtualMachineDisk 是永久磁碟,用於匯入 VM 映像檔的內容。
- VirtualMachine 是 VM 執行個體本身。DataVolume 會在 VM 啟動前掛接至 VirtualMachine。
查看 VirtualMachineDisk 的狀態。VirtualMachineDisk 會在內部建立
DataVolume資源。VM 映像檔會匯入至掛接至 VM 的 DataVolume:kubectl get datavolume以下輸出範例顯示映像檔匯入作業的開頭:
NAME PHASE PROGRESS RESTARTS AGE pos-vm-boot-dv ImportScheduled N/A 8s查看
VirtualMachine的狀態。在DataVolume匯入完成前,VirtualMachine會處於Provisioning狀態:kubectl get gvm以下輸出範例顯示正在佈建
VirtualMachine:NAME STATUS AGE IP pos-vm Provisioning 1m等待 VM 映像檔完全匯入
DataVolume。繼續觀察圖片匯入進度:kubectl get datavolume -w以下輸出範例顯示正在匯入磁碟映像檔:
NAME PHASE PROGRESS RESTARTS AGE pos-vm-boot-dv ImportInProgress 0.00% 14s ... ... pos-vm-boot-dv ImportInProgress 0.00% 31s pos-vm-boot-dv ImportInProgress 1.02% 33s pos-vm-boot-dv ImportInProgress 1.02% 35s ...匯入完成並建立
DataVolume後,下列範例輸出會顯示Succeeded的PHASE:kubectl get datavolumeNAME PHASE PROGRESS RESTARTS AGE pos-vm-boot-dv Succeeded 100.0% 14m18s確認
VirtualMachine已成功建立:kubectl get gvm如果建立成功,
STATUS會顯示RUNNING,如下列範例所示,並顯示 VM 的 IP 位址:NAME STATUS AGE IP pos-vm Running 40m 192.168.3.250
連線至 VM 並檢查應用程式狀態
VM 使用的映像檔包含銷售點範例應用程式。應用程式已設為在開機時自動啟動,做為 systemd 服務。您可以在 pos-systemd-services 目錄中查看 systemd 服務的設定檔。
連線至 VM 控制台。執行下列指令,並在看到
Successfully connected to pos-vm…訊息後按下 Enter⏎:kubectl virt console pos-vm這個指令會產生下列範例輸出內容,提示您輸入登入詳細資料:
Successfully connected to pos-vm console. The escape sequence is ^] pos-from-public-image login:請使用下列使用者帳戶和密碼。這個帳戶是在原始 VM 中設定,而 GDC VirtualMachine 的 VM 執行階段映像檔就是從該 VM 建立。
- 登入使用者名稱:
abmuser - 密碼:
abmworks
- 登入使用者名稱:
查看銷售點應用程式服務的狀態。POS 應用程式包含三個服務:API、Inventory 和 Payments。這些服務都會以系統服務的形式執行。
這三項服務都透過 localhost 相互連結。不過,應用程式會使用先前步驟中建立的 mysql-db Kubernetes 服務連線至 MySQL 資料庫。這項行為代表 VM 會自動連線至與
Pods和Services相同的網路,讓 VM 工作負載與其他容器化應用程式之間能順暢通訊。您不必採取任何額外動作,即可讓使用 VM Runtime on GDC 部署的 VM 存取 KubernetesServices。sudo systemctl status pos*以下範例輸出內容顯示三個服務和根系統服務
pos.service的狀態:● pos_payments.service - Payments service of the Point of Sale Application Loaded: loaded (/etc/systemd/system/pos_payments.service; enabled; vendor > Active: active (running) since Tue 2022-06-21 18:55:30 UTC; 1h 10min ago Main PID: 750 (payments.sh) Tasks: 27 (limit: 4664) Memory: 295.1M CGroup: /system.slice/pos_payments.service ├─750 /bin/sh /pos/scripts/payments.sh └─760 java -jar /pos/jars/payments.jar --server.port=8083 ● pos_inventory.service - Inventory service of the Point of Sale Application Loaded: loaded (/etc/systemd/system/pos_inventory.service; enabled; vendor> Active: active (running) since Tue 2022-06-21 18:55:30 UTC; 1h 10min ago Main PID: 749 (inventory.sh) Tasks: 27 (limit: 4664) Memory: 272.6M CGroup: /system.slice/pos_inventory.service ├─749 /bin/sh /pos/scripts/inventory.sh └─759 java -jar /pos/jars/inventory.jar --server.port=8082 ● pos.service - Point of Sale Application Loaded: loaded (/etc/systemd/system/pos.service; enabled; vendor preset: e> Active: active (exited) since Tue 2022-06-21 18:55:30 UTC; 1h 10min ago Main PID: 743 (code=exited, status=0/SUCCESS) Tasks: 0 (limit: 4664) Memory: 0B CGroup: /system.slice/pos.service Jun 21 18:55:30 pos-vm systemd[1]: Starting Point of Sale Application... Jun 21 18:55:30 pos-vm systemd[1]: Finished Point of Sale Application. ● pos_apiserver.service - API Server of the Point of Sale Application Loaded: loaded (/etc/systemd/system/pos_apiserver.service; enabled; vendor> Active: active (running) since Tue 2022-06-21 18:55:31 UTC; 1h 10min ago Main PID: 751 (api-server.sh) Tasks: 26 (limit: 4664) Memory: 203.1M CGroup: /system.slice/pos_apiserver.service ├─751 /bin/sh /pos/scripts/api-server.sh └─755 java -jar /pos/jars/api-server.jar --server.port=8081退出 VM。如要結束控制台連線,請按下
Ctrl + ],使用逸出序列^]。
存取以 VM 為基礎的工作負載
如果您是按照「使用手動負載平衡器安裝」指南設定叢集,則叢集已有名為 pos-ingress 的 Ingress 資源。這項資源會將流量從 Ingress 負載平衡器的外部 IP 位址,轉送至 Point of Sale 範例應用程式的 API 伺服器服務。
如果叢集沒有這項
Ingress資源,請套用下列資訊清單來建立:kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-samples/main/anthos-bm-gcp-terraform/resources/manifests/pos-ingress.yaml建立 Kubernetes
Service,將流量轉送至 VM。Ingress資源會將流量轉送至這個Service:kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-samples/main/anthos-vmruntime/pos-service.yaml下列輸出範例確認已建立 Service:
service/api-server-svc created取得
Ingress負載平衡器的外部 IP 位址。Ingress負載平衡器會根據Ingress資源規則轉送流量。您已有pos-ingress規則,可將要求轉送至 API 伺服器Service。這個Service會將要求轉送至 VM:INGRESS_IP=$(kubectl get ingress/pos-ingress -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo $INGRESS_IP以下輸出範例顯示
Ingress負載平衡器的 IP 位址:172.29.249.159 # you might have a different IP address在瀏覽器中使用 Ingress 負載平衡器 IP 位址存取應用程式。以下螢幕截圖範例顯示有兩項商品的銷售點資訊站。你可以點選商品 (如要訂購多個,請點選多次),然後使用「付款」按鈕下單。這項體驗顯示,您已成功使用 VM Runtime on GDC,將以 VM 為基礎的工作負載部署至叢集。
清除所用資源
您可以刪除本教學課程中建立的所有資源,也可以只刪除 VM 並保留可重複使用的資源。刪除 VM:詳細說明可用選項。
全部刪除
刪除 GDC
VirtualMachine上的 VM Runtime 和所有資源:kubectl virt delete vm pos-vm --all以下輸出內容範例確認刪除作業:
vm "pos-vm" used the following resources: gvm: pos-vm VirtualMachineDisk: pos-vm-boot-dv Start deleting the resources: Deleted gvm "pos-vm". Deleted VirtualMachineDisk "pos-vm-boot-dv".
僅刪除 VM
如果只刪除 VM,系統會保留建立的
VirtualMachineDisk。這樣就能重複使用這個 VM 映像檔,並節省建立新 VM 時匯入映像檔的時間。kubectl virt delete vm pos-vm以下輸出內容範例確認刪除:
vm "pos-vm" used the following resources: gvm: pos-vm VirtualMachineDisk: pos-vm-boot-dv Start deleting the resources: Deleted gvm "pos-vm".
後續步驟
- 本指南使用的原始 VM 是執行 Ubuntu 20.04 LTS 的 Compute Engine 執行個體。這個 VM 的映像檔可透過 pos-vm-images Cloud Storage bucket 公開存取。如要進一步瞭解 VM 的設定方式和映像檔的建立方式,請參閱銷售點存放區中的操作說明。
- 使用
kubectl virt create vm pos-vm指令在叢集中建立 VM 時,系統會建立以 VM 命名的 YAML 檔案 (google-virtctl/pos-vm.yaml)。您可以檢查檔案,查看VirtualMachine和VirtualMachineDisk的定義。您可以使用 KRM 定義部署 VM,而不使用virtctl外掛程式,如建立的 YAML 檔案所示。