在 GDC 上啟用或停用 VM 執行階段

本文說明如何更新 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。

    如果已啟用 GDC 中的 VM 執行階段,指令會傳回錯誤。

如要設定模擬或圖片格式等其他設定,請編輯 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:支援兩種磁碟映像檔格式值:raw 和 qcow2。如果未設定 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

如果不再需要使用 GDC 中的 VM 執行階段,可以停用這項功能。

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 參數,如上一節所示。

下表說明將此註解設為 true 或 false 時,執行中 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 執行階段。bmctl 指令會傳回錯誤。

GDC 預檢的 VM 執行階段

在 GDC 上使用 VM 執行階段和 VM 前,GDC 預檢的 VM 執行階段會驗證機器環境中的一組必要條件。如果 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. 啟用 GDC 上的 VM 執行階段功能,例如 useEmulation

  3. 升級叢集

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

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

如果 GDC 上最新的 VM 執行階段預檢成功,您就可以啟動 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 執行階段。以下範例顯示 VMRuntimePreflightCheck YAML 資訊清單:

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

後續步驟