虛擬機器疑難排解

本頁說明如何排解 Google Distributed Cloud (GDC) 實體隔離裝置中,應用程式運算子 (AO) 的虛擬機器 (VM) 問題。

復原完整 VM 開機磁碟

如果 VM 的開機磁碟空間不足 (例如應用程式將記錄檔填滿開機磁碟分割區),VM 的重要功能就會無法運作。您可能無法透過 VirtualMachineAccessRequest 資源新增 SSH 金鑰,也無法使用現有金鑰建立與 VM 的 SSH 連線。

本頁說明如何建立新的 VM,並附加磁碟,將內容復原到新的 VM 做為額外磁碟。這些步驟會示範下列事項:

  • 成功透過 SSH 連線至新 VM。
  • 掛接磁碟以復原及刪除不必要的資料,即可增加空間。
  • 刪除新 VM,並將原始磁碟還原至原始 VM。

事前準備

繼續操作前,請務必要求專案層級的 VM 存取權。請按照這裡的步驟指派專案虛擬機器管理員 (project-vm-admin) 角色。

如要使用 gdcloud CLI 執行 VM 作業,請要求專案 IAM 管理員同時指派專案 VirtualMachine 管理員角色和專案檢視者 (project-viewer) 角色。

如要使用 gdcloud 指令列介面 (CLI) 指令,請務必下載、安裝及設定 gdcloud CLI。GDC 氣隙裝置的所有指令都使用 gdcloudkubectl CLI,且需要作業系統 (OS) 環境。

取得 kubeconfig 檔案路徑

如要對 Management API 伺服器執行指令,請確認您具備下列資源:

  1. 找出 Management API 伺服器名稱,或詢問平台管理員 (PA) 伺服器名稱。

  2. 登入並產生 Management API 伺服器的 kubeconfig 檔案 (如果沒有)。

  3. 請使用路徑取代這些操作說明中的 MANAGEMENT_API_SERVER{"</var>"}}

從空間不足的 VM 磁碟復原

如要復原空間不足的 VM 開機磁碟,請完成下列步驟:

  1. 按照「停止 VM」一文的說明停止現有 VM。

  2. 編輯現有 VM:

    kubectl --kubeconfig ADMIN_KUBECONFIG edit \
        virtualmachine.virtualmachine.gdc.goog -n PROJECT VM_NAME
    

    spec 欄位中的現有 VM 磁碟名稱替換為新的預留位置名稱:

    ...
    spec:
      disks:
      - boot: true
        virtualMachineDiskRef:
          name: VM_DISK_PLACEHOLDER_NAME
    
  3. 建立新的 VM,並使用與原始 VM 不同的映像檔作業系統 (OS)。舉例來說,如果原始磁碟使用 OS ubuntu-2004,請使用 rocky-8 建立新的 VM。

  4. 將原始磁碟附加至新 VM 做為額外磁碟:

    ...
    spec:
      disks:
      - boot: true
        autoDelete: true
        virtualMachineDiskRef:
          name: NEW_VM_DISK_NAME
      - virtualMachineDiskRef:
          name: ORIGINAL_VM_DISK_NAME
    

    更改下列內容:

    • NEW_VM_DISK_NAME:您為新 VM 磁碟指定的名稱。
    • ORIGINAL_VM_DISK_NAME:原始 VM 磁碟的名稱。
  5. 建立 VM 並執行後,請按照「連線至 VM」一文的說明,與 VM 建立 SSH 連線。

  6. 建立目錄,然後將原始磁碟掛接至掛接點。例如:/mnt/disks/new-disk

  7. 使用額外空間檢查掛接目錄中的檔案和目錄:

    cd /mnt/disks/MOUNT_DIR
    du -hs -- * | sort -rh | head -10
    

    MOUNT_DIR 替換為原始磁碟的掛接目錄名稱。

    輸出結果會與下列內容相似:

    18G   home
    1.4G  usr
    331M  var
    56M   boot
    5.8M  etc
    36K   snap
    24K   tmp
    16K   lost+found
    16K   dev
    8.0K  run
    
  8. 逐一檢查檔案和目錄,確認每個檔案和目錄使用的空間大小。這個範例會檢查 home 目錄,因為該目錄使用 18G 的空間。

    cd home
    du -hs -- * | sort -rh | head -10
    

    輸出結果會與下列內容相似:

    17G   log_file
    ...
    4.0K  readme.md
    4.0K  main.go
    

    範例檔案 log_file 佔用 17G 空間,而且並非必要,因此可以清除。

  9. 刪除不需要的檔案,釋出額外空間,或將檔案備份到新的 VM 開機磁碟:

    • 移動要保留的檔案:

      mv /mnt/disks/MOUNT_DIR/home/FILENAME/home/backup/
      
    • 刪除佔用額外空間的檔案:

      rm /mnt/disks/MOUNT_DIR/home/FILENAME
      

      FILENAME 替換為要移動或刪除的檔案名稱。

  10. 登出新 VM,然後停止 VM

  11. 編輯新 VM,從 spec 欄位移除原始磁碟:

    kubectl --kubeconfig ADMIN_KUBECONFIG \
        edit virtualmachine.virtualmachine.gdc.goog -n PROJECT NEW_VM_NAME
    

    移除包含原始 VM 磁碟名稱的 virtualMachineDiskRef 清單:

    spec:
      disks:
      - autoDelete: true
        boot: true
        virtualMachineDiskRef:
          name: NEW_VM_DISK_NAME
      - virtualMachineDiskRef: # Remove this list
          name: ORIGINAL_VM_DISK_NAME # Remove this disk name
    
  12. 編輯原始 VM,並將您在步驟 2 中設定的 VM_DISK_PLACEHOLDER_NAME 替換為先前的名稱:

    ...
    spec:
      disks:
      - boot: true
        virtualMachineDiskRef:
          name: VM_DISK_PLACEHOLDER_NAME # Replace this name with the previous VM name
    
  13. 啟動原始 VM。如果清除的空間足夠,VM 就能順利啟動。

  14. 如果不需要新的 VM,請刪除該 VM:

    kubectl --kubeconfig ADMIN_KUBECONFIG \
        delete virtualmachine.virtualmachine.gdc.goog -n PROJECT NEW_VM_NAME
    

佈建虛擬機器

本節說明如何排解在 Google Distributed Cloud (GDC) 氣隙裝置中佈建新虛擬機器 (VM) 時可能發生的問題。

應用程式運算子 (AO) 必須針對預設使用者叢集執行所有指令。

無法建立磁碟

如果 PersistentVolumeClaim (PVC) 處於 Pending 狀態,請查看下列替代方案,解決這個狀態:

  • 儲存空間類別不支援使用 ReadWriteMany 存取模式建立 PVC:

    1. 使用支援 ReadWriteMany 存取模式的儲存空間類別,更新虛擬機器的 spec.dataVolumeTemplate.spec.pvc.storageClassName 值,並使用容器儲存空間介面 (CSI) 驅動程式做為儲存空間佈建工具。

    2. 如果叢集上沒有其他儲存空間類別可提供 ReadWriteMany 功能,請更新 spec.dataVolumeTemplate.spec.pvc.accessMode 值,加入 ReadWriteOnce 存取模式。

  • CSI 驅動程式無法佈建 PersistentVolume

    1. 查看錯誤訊息:

      kubectl describe pvc VM_NAME-boot-dv -n NAMESPACE_NAME
      

      請替換下列變數:

      • VM_NAME:虛擬機器的名稱。
      • NAMESPACE_NAME:命名空間的名稱。
    2. 設定驅動程式,解決錯誤。為確保 PersistentVolume 佈建作業正常運作,請在新的 spec 中建立測試 PVC,並使用與 dataVolumeTemplate.spec.pvc 中指定的名稱不同的名稱:

      cat <<EOF | kubectl apply -
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: test-pvc
        namespace: NAMESPACE_NAME
      spec:
        storageClassName: standard-rwx
        accessModes:
        - ReadWriteMany
        resources:
          requests:
            storage: 10Gi
      EOF
      
    3. PersistentVolume 物件佈建成功後,請在驗證後刪除測試 PVC:

      kubectl delete pvc test-pvc -n NAMESPACE_NAME
      

無法建立虛擬機器

如果虛擬機器資源已套用,但未進入 Running 狀態,請按照下列步驟操作:

  1. 查看虛擬機器記錄:

    kubectl get vm VM_NAME -n NAMESPACE_NAME
    
  2. 檢查虛擬機器的對應 Pod 狀態:

    kubectl get pod -l kubevirt.io/vm=VM_NAME
    

    輸出內容會顯示 Pod 狀態。可能選項如下:

ContainerCreating 狀態

如果 Pod 處於 ContainerCreating 狀態,請按照下列步驟操作:

  1. 取得 Pod 狀態的其他詳細資料:

    kubectl get pod -l kubevirt.io/vm=VM_NAME
    
  2. 如果磁碟區已卸載,請確認 spec.volumes 欄位中指定的所有磁碟區都已成功掛接。如果磁碟區是磁碟,請檢查磁碟狀態。

  3. spec.accessCredentials 欄位會指定要掛接 SSH 公開金鑰的值。 確認密鑰與虛擬機器建立在相同命名空間。

如果叢集資源不足,無法建立 Pod,請按照下列步驟操作:

  1. 如果叢集的運算資源不足,無法排定虛擬機器 Pod,請移除其他不需要的 Pod,釋出資源。

  2. 降低虛擬機器的 spec.domain.resources.requests.cpuspec.domain.resources.requests.memory 值。

ErrorCrashLoopBackoff 狀態

如要解決 ErrorCrashLoopBackoff 狀態的 Pod,請從虛擬機器運算 Pod 擷取記錄:

kubectl logs -l  kubevirt.io/vm=VM_NAME  -c compute

Running狀態和虛擬機器故障

如果 Pod 處於 Running 狀態,但虛擬機器本身發生故障,請按照下列步驟操作:

  1. 查看虛擬機器記錄 Pod 的記錄:

    kubectl logs -l  kubevirt.io/vm=VM_NAME  -c log
    
  2. 如果記錄顯示虛擬機器啟動時發生錯誤,請檢查虛擬機器的正確開機裝置。將主要開機磁碟的 spec.domain.devices.disks.bootOrder 值設為 1 值。請參考以下範例:

      spec:
          domain:
            devices:
              disks:
              - bootOrder: 1
                disk:
                  bus: virtio
                name: VM_NAME-boot-dv
      

如要排解虛擬機器映像檔的設定問題,請使用其他映像檔建立虛擬機器。

存取序列埠控制台

本節說明如何使用 VM 執行個體的序列主控台偵錯啟動與網路問題、疑難排解發生異常的執行個體、與 Grand Unified Bootloader (GRUB) 互動,及執行其他疑難排解工作。

與序列埠互動就像使用終端機視窗:輸入和輸出內容都是文字模式,不支援圖形介面。執行個體的作業系統 (OS)、基本輸入/輸出系統 (BIOS) 通常會將輸出內容寫入序列埠,並接受指令等輸入。

如要存取序列埠主控台,請完成下列各節的步驟:

設定使用者名稱和密碼

根據預設,不會將 GDC Linux 系統映像檔設定為允許本機使用者的密碼式登入。

如果 VM 執行的映像檔已預先設定序列控制台登入功能,您可以在 VM 上設定本機密碼,並透過序列控制台登入。在 GDC Linux VM 中,您可以在建立 VM 時或之後,透過儲存為 Kubernetes 密鑰的開機指令碼設定使用者名稱和密碼。

以下操作說明介紹如何在建立 VM 後設定本機密碼。如要設定使用者名稱和密碼,請完成下列步驟:

  1. 建立文字檔案。
  2. 在文字檔中設定使用者名稱和密碼:

    #!/bin/bash
    username="USERNAME"
    password="PASSWORD"
    sudo useradd -m -s /bin/bash "$username"
    echo "$username:$password" | sudo chpasswd
    sudo usermod -aG sudo "$username"
    

    更改下列內容:

    • USERNAME:要新增的使用者名稱。
    • PASSWORD:使用者名稱的密碼。請避免使用基本密碼,因為部分作業系統可能會要求密碼長度和複雜度下限。
  3. 將開機指令碼建立為 Kubernetes 密鑰:

    kubectl --kubeconfig=ADMIN_KUBECONFIG create secret \
    generic STARTUP_SCRIPT_NAME -n PROJECT_NAMESPACE \
    --from-file=STARTUP_SCRIPT_PATH
    

    更改下列內容:

    • PROJECT_NAMESPACE:VM 所在的專案命名空間。
    • STARTUP_SCRIPT_NAME: the name you give to the startup script. For example,configure-credentials`。
    • STARTUP_SCRIPT_PATH:開機指令碼的路徑,其中包含您設定的使用者名稱和密碼。
  4. 停止 VM

  5. 編輯 VM 規格:

    kubectl --kubeconfig=ADMIN_KUBECONFIG edit gvm \
    -n PROJECT_NAMESPACE VM_NAME
    

    VM_NAME 替換為要在開機指令碼中新增的 VM 名稱。

  6. startupScripts 欄位中,加入您在步驟 3 中建立的 Kubernetes 密鑰參照:

    spec:
      compute:
        memory: 8Gi
        vcpus: 8
      disks:
      - boot: true
        virtualMachineDiskRef:
          name: disk-name 
      startupScripts:
      - name: STARTUP_SCRIPT_NAME
        scriptSecretRef:
          name: STARTUP_SCRIPT_NAME
    
  7. 啟動 VM

    • 如果您正在使用新的 VM,請略過這個步驟。

存取 VM 序列控制台

如要開始存取 VM 序列埠控制台,請執行下列步驟:

  1. 連線至序列主控台:

    gdcloud compute connect-to-serial-port VM_NAME \
    --project PROJECT_NAMESPACE
    
  2. 系統提示時,請輸入您在「設定使用者名稱和密碼」中定義的使用者名稱和密碼。