在 GDC 上啟用或停用 VM Runtime

本文說明如何更新 VMRuntime 自訂資源或執行 bmctl 指令,在 Google Distributed Cloud 上啟用或停用 VM 執行階段。

事前準備

如要在 GDC 上啟用或停用 VM Runtime,您需要存取下列資源和工具:

在 GDC 上啟用 VM Runtime

Google Distributed Cloud 1.10 以上版本會自動安裝 GDC 的 VM Runtime,但預設為停用。您必須先在 Google Distributed Cloud 上啟用 VM Runtime,才能執行 VM 資源。

bmctl

  • 如要啟用執行階段,請使用 bmctl 工具:

    bmctl enable vmruntime --kubeconfig KUBECONFIG_PATH
    

    提供叢集的 kubeconfig 檔案路徑。 建立叢集時,Google Distributed Cloud 會在管理工作站產生 kubeconfig 檔案。預設路徑為 bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig

    如果已啟用 VM Runtime on GDC,指令會傳回錯誤。

如要設定其他項目 (例如模擬或圖片格式),請編輯 VMRuntime 自訂資源。

自訂資源

如要啟用執行階段,請更新 VMRuntime 自訂資源。這項自訂資源預設會安裝。

  1. 編輯 VMRuntime 自訂資源:

    kubectl edit vmruntime
    
  2. 在規格中設定 enabled:true

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      enabled: true
      # useEmulation defaults to "false" if not set.
      useEmulation: true
      # vmImageFormat defaults to "qcow2" if not set.
      vmImageFormat: qcow2
    

    在上述 spec 區段中,可以設定下列值:

    • enabled:設為 true,即可在 GDC 上啟用 VM 執行階段
    • useEmulation:如果節點不支援硬體虛擬化,或您不確定,請將值設為 true。如果可以,硬體虛擬化比軟體模擬效能更佳。如未指定,useEmulation 欄位預設為 false
    • vmImageFormat:支援兩個磁碟映像檔格式值:rawqcow2。如果未設定 vmImageFormat,GDC 上的 VM 執行階段會使用 raw 磁碟映像檔格式建立 VM。raw 格式的效能可能優於 qcow2 (寫入時複製格式),但可能會佔用更多磁碟空間。如要進一步瞭解 VM 的映像檔格式,請參閱 QEMU 說明文件中的「磁碟映像檔格式」。
  3. 在編輯器中儲存自訂資源。

  4. 確認已啟用 VMRuntime 自訂資源:

    kubectl describe vmruntime vmruntime
    

    VMRuntime自訂資源的詳細資料包括 Status 區段。 當 VMRuntime.Status.Ready 顯示為 true 時,表示 GDC 的 VM Runtime 已啟用並正常運作。

在 GDC 上停用 VM Runtime

如果不再需要使用 VM Runtime on GDC,可以停用這項功能。

bmctl

  • 如要停用執行階段,請使用 bmctl 工具:

    bmctl disable vmruntime --kubeconfig KUBECONFIG_PATH \
      --force=true
    

    提供叢集的 kubeconfig 檔案路徑,以及下列設定選項的值:

    • --force:設為 true,確認要刪除現有 VM 資源。預設值為 false

自訂資源

如要停用執行階段,請更新 VMRuntime 自訂資源:

  1. 編輯 VMRuntime 自訂資源:

    kubectl edit vmruntime
    
  2. 在規格中設定 enabled:false

    apiVersion: vm.cluster.gke.io/v1`
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      enabled: false
      useEmulation: true
      vmImageFormat: qcow2
    
  3. 在編輯器中儲存更新後的自訂資源規格。

  4. 如要確認 VMRuntime 自訂資源已停用,請查看 vm-system 命名空間中執行的 Pod:

    kubectl get pods --namespace vm-system
    

    如果命名空間中只執行屬於 vmruntime-controller-manager 部署作業的 Pod,系統就會停用 GDC 上的 VM Runtime。

瞭解執行 VM 的行為

在 GDC 資源的 VM 執行階段上,可以使用 baremetal.cluster.gke.io/vmrumtime-force-disable 註解,定義在叢集中執行 VM 時停用執行階段的行為。

以下範例顯示這項註解的值預設為 false

// VM runtime yaml file
apiVersion: vm.cluster.gke.io/v1
kind: VMRuntime
metadata:
  annotations:
    baremetal.cluster.gke.io/vmrumtime-force-disable: "false"
  name: vmruntime
[...]

如果將這個註解設為 false,GDC 上的 VM Runtime 會嘗試保護正在執行的 VM。停用 GDC 上的 VM Runtime 之前,請先刪除所有正在執行的 VM,或使用 bmctl disable vmruntime 指令指定 --force=true 參數,如上一節所示。

下表說明將此註解設為 truefalse 時,執行中 VM 的情況,以及您是否指定 --force=true 參數:

叢集狀態 --force 參數 vmrumtime-force-disable 註解 行為
沒有任何 VM 不適用 不適用 在 GDC 上停用 VM Runtime。
現有 VM True 刪除所有執行中的 VM 和相關資源。在 GDC 上停用 VM Runtime。
True 刪除所有執行中的 VM 和相關資源。在 GDC 上停用 VM Runtime。
False 系統會提示您刪除執行中的 VM 和相關資源。刪除所有執行中的 VM 後,請在 GDC 上停用 VM Runtime。
False 請勿刪除任何正在執行的現有 VM。請勿停用 GDC 上的 VM Runtime。bmctl 指令會傳回錯誤。

GDC 預檢的 VM 執行階段

在 GDC 上使用 VM 執行階段和 VM 前,GDC 預檢會驗證機器環境中的一組必要條件。如果 GDC 預檢的 VM Runtime 失敗,系統會封鎖 VM 建立作業。當 spec.enabled 設為 true 時,系統會自動執行 GDC 預檢的 VM 執行階段。

kubectl label nodes NODE_NAME "kubevm.io/VM-SkipSchedule"= --kubeconfig KUBECONFIG_PATH

執行下列任一作業時,系統會執行 GDC 預檢的 VM 執行階段檢查:

  1. 在 GDC 上啟用 VM Runtime

  2. 啟用 VM Runtime on GDC 功能,例如 useEmulation

  3. 升級叢集

  4. 移除節點的「kubevm.io/VM-SkipSchedule」標籤

  5. 執行 bmctl check vmruntimepfc --kubeconfig KUBECONFIG_PATH 指令或套用 VMRuntimePreflightCheck YAML 資訊清單,獨立建立 VM Runtime on GDC 前置檢查物件。

如果最新版 VM Runtime on GDC 預檢成功,您就可以啟動 VM。如果預檢失敗,系統會封鎖 VM 建立作業,並顯示預檢錯誤。

確認預檢成功

如要確認預檢是否成功,請執行下列指令:

  1. 找出上次執行的預檢:

    kubectl get vmruntimepfc -n vm-system --kubeconfig KUBECONFIG_PATH
    

    輸出內容應如下列範例所示:

    NAME                                                             PASS    AGE
    vmruntime-preflight-check-6ee61513-ea5d-4340-9374-90396cac129e   false   42s
    vmruntime-preflight-check-f8d71751-a01c-471e-bab5-3370fc2addd5   true    21s
    
  2. 如要查看前置檢查的狀態,請執行下列指令:

    kubectl get vmruntime vmruntime -o yaml --kubeconfig KUBECONFIG_PATH
    
    ...
      preflightCheckSummary:
      preflightCheckSummary:
        featureStatuses:
          CPU:
            passed: true
          KVM:
            passed: true
        preflightCheckName: vmruntime-preflight-check-f8d71751-a01c-471e-bab5-3370fc2addd5
        preflightCheckPassed: true
    ...
    

偵錯預檢失敗

如果前置檢查失敗,請按照下列步驟進行偵錯:

  1. 找出上次執行的預檢。

    kubectl get vmruntimepfc -n vm-system
    
  2. 如要瞭解詳情,請查看該項前置檢查的狀態。

    kubectl get vmruntimepfc -n vm-system \
        vmruntime-preflight-check-6ee61513-ea5d-4340-9374-90396cac129e -o yaml \
        --kubeconfig KUBECONFIG_PATH
    
    ...
    status:
    checks:
      worker-0--52229ee15841099-22c41577139a7b8c.lab.anthos:
        passed: false
        results:
        - checkName: CPU
          passed: true
        - checkName: KVM
          message: |
            command terminated with exit code 1
            ls: /mnt/dev/kvm: No such file or directory
          passed: false
    ...
    
  3. 修正問題,然後再次執行 GDC 預檢的 VM Runtime。以下範例顯示 VMRuntimePreflightCheck YAML 資訊清單:

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntimePreflightCheck
    metadata:
      name: vmruntime-preflight-check-manual
      namespace: vm-system
    

後續步驟