教學課程:使用 GDC 中的 VM 執行階段,在叢集中部署現有 VM

有了 GDC 的 VM 執行階段,您就能直接將虛擬機器 (VM) 工作負載部署至僅限裸機的 Distributed Cloud 軟體安裝作業。在本教學課程中,您會將代表零售銷售點終端機的範例銷售點應用程式,從 Compute Engine VM 遷移至裸機叢集,並存取其網頁前端。

部署作業會使用預先準備的磁碟映像檔,其中工作負載會以 systemd 服務的形式執行。您也可以按照這些步驟,準備及部署自己的 VM 應用程式。

目標

事前準備

如要完成這份文件,您需要下列資源:

  • 存取 1.12.0 以上版本的裸機叢集,該叢集是按照「使用手動負載平衡器安裝」指南建立。本文件會設定網路資源,讓您能透過瀏覽器存取 VM 內執行的工作負載。如果不需要這項行為,可以按照這份文件,使用任何僅適用於裸機的 Distributed Cloud 軟體安裝。
  • 符合下列條件的工作站:
    • 可使用 bmctl CLI 存取叢集。
    • 可使用 kubectl CLI 存取叢集。

在 GDC 啟用 VM 執行階段,並安裝 virtctl 外掛程式

自 1.10 版起,所有裸機叢集都包含 GDC 自訂資源定義的 VM Runtime。安裝時,系統已建立 VMRuntime 自訂資源的執行個體。不過,系統預設會停用這項功能。

  1. 在 GDC 啟用 VM 執行階段:

    sudo bmctl enable vmruntime --kubeconfig KUBECONFIG_PATH
    
    • KUBECONFIG_PATH:使用者叢集 kubeconfig 檔案的路徑。
  2. 確認 VMRuntime 已啟用:

    kubectl wait --for=jsonpath='{.status.ready}'=true vmruntime vmruntime
    

    VMRuntime 可能需要幾分鐘才能準備就緒。如果尚未就緒,請稍候片刻,然後再檢查幾次。以下輸出範例顯示 VMRuntime 已就緒:

    vmruntime.vm.cluster.gke.io/vmruntime condition met
    
  3. 安裝 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
    
  4. 驗證 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 存放區中找到本文件中的原始碼。您將使用這個存放區中的資源,完成後續步驟。

  1. 部署 MySQL StatefulSet。銷售點應用程式會連線至 MySQL 資料庫,儲存商品目錄和付款資訊。銷售點存放區包含範例資訊清單,可部署 MySQL StatefulSet、設定相關聯的 ConfigMap,以及 Kubernetes Service。ConfigMap 會定義 MySQL 執行個體的憑證,這些憑證與傳遞至銷售點應用程式的憑證相同。

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/point-of-sale/main/k8-manifests/common/mysql-db.yaml
    
  2. 使用預先準備的 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"
    
  3. 查看 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
    
  4. 查看 VirtualMachine 的狀態。在 DataVolume 匯入完成前,VirtualMachine 會處於 Provisioning 狀態:

    kubectl get gvm
    

    以下輸出範例顯示正在佈建 VirtualMachine:

    NAME      STATUS         AGE     IP
    pos-vm    Provisioning   1m
    
  5. 等待 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 datavolume
    
    NAME              PHASE             PROGRESS   RESTARTS   AGE
    pos-vm-boot-dv    Succeeded         100.0%                14m18s
    
  6. 確認 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 服務的設定檔。

  1. 連線至 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
  2. 查看銷售點應用程式服務的狀態。POS 應用程式包含三個服務:API、Inventory 和 Payments。這些服務都會以系統服務的形式執行。

    這三項服務都透過 localhost 相互連結。不過,應用程式會使用先前步驟中建立的 mysql-db Kubernetes 服務連線至 MySQL 資料庫。這項行為代表 VM 會自動連線至與 Pods 和 Services 相同的網路,讓 VM 工作負載與其他容器化應用程式之間能順暢通訊。您不必採取任何額外動作,即可讓使用 VM Runtime on GDC 部署的 VM 存取 Kubernetes Services。

    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
    
  3. 退出 VM。如要結束控制台連線,請按下 Ctrl + ],使用逸出序列 ^]。

存取以 VM 為基礎的工作負載

如果您是按照「使用手動負載平衡器安裝」指南設定叢集,則叢集已有名為 pos-ingress 的 Ingress 資源。這項資源會將流量從 Ingress 負載平衡器的外部 IP 位址,轉送至 Point of Sale 範例應用程式的 API 伺服器服務。

  1. 如果叢集沒有這項 Ingress 資源,請套用下列資訊清單來建立:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-samples/main/anthos-bm-gcp-terraform/resources/manifests/pos-ingress.yaml
    
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: pos-ingress
    spec:
      rules:
      - http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: api-server-svc
                port:
                  number: 8080
  2. 建立 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
    
    apiVersion: v1
    kind: Service
    metadata:
      name: api-server-svc
    spec:
      selector:
        kubevirt/vm: pos-vm
      ports:
      - protocol: TCP
        port: 8080
        targetPort: 8081
  3. 取得 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
    
  4. 在瀏覽器中使用 Ingress 負載平衡器 IP 位址存取應用程式。以下螢幕截圖範例顯示有兩項商品的銷售點資訊站。你可以點選商品 (如要訂購多個,請點選多次),然後使用「付款」按鈕下單。這項體驗顯示,您已成功使用 VM Runtime on GDC,將以 VM 為基礎的工作負載部署至叢集。

銷售點應用程式 UI
Point of Sale 應用程式 UI (按一下圖片可放大)

清除所用資源

您可以刪除本教學課程中建立的所有資源,也可以只刪除 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 檔案所示。