本頁說明如何排解 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 氣隙裝置的所有指令都使用 gdcloud
或 kubectl
CLI,且需要作業系統 (OS) 環境。
取得 kubeconfig 檔案路徑
如要對 Management API 伺服器執行指令,請確認您具備下列資源:
找出 Management API 伺服器名稱,或詢問平台管理員 (PA) 伺服器名稱。
登入並產生 Management API 伺服器的 kubeconfig 檔案 (如果沒有)。
請使用路徑取代這些操作說明中的
MANAGEMENT_API_SERVER{"</var>"}}
。
從空間不足的 VM 磁碟復原
如要復原空間不足的 VM 開機磁碟,請完成下列步驟:
按照「停止 VM」一文的說明停止現有 VM。
編輯現有 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
建立新的 VM,並使用與原始 VM 不同的映像檔作業系統 (OS)。舉例來說,如果原始磁碟使用 OS
ubuntu-2004
,請使用rocky-8
建立新的 VM。將原始磁碟附加至新 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 磁碟的名稱。
建立 VM 並執行後,請按照「連線至 VM」一文的說明,與 VM 建立 SSH 連線。
建立目錄,然後將原始磁碟掛接至掛接點。例如:
/mnt/disks/new-disk
。使用額外空間檢查掛接目錄中的檔案和目錄:
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
逐一檢查檔案和目錄,確認每個檔案和目錄使用的空間大小。這個範例會檢查
home
目錄,因為該目錄使用18G
的空間。cd home du -hs -- * | sort -rh | head -10
輸出結果會與下列內容相似:
17G log_file ... 4.0K readme.md 4.0K main.go
範例檔案
log_file
佔用17G
空間,而且並非必要,因此可以清除。刪除不需要的檔案,釋出額外空間,或將檔案備份到新的 VM 開機磁碟:
移動要保留的檔案:
mv /mnt/disks/MOUNT_DIR/home/FILENAME/home/backup/
刪除佔用額外空間的檔案:
rm /mnt/disks/MOUNT_DIR/home/FILENAME
將 FILENAME 替換為要移動或刪除的檔案名稱。
登出新 VM,然後停止 VM。
編輯新 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
編輯原始 VM,並將您在步驟 2 中設定的 VM_DISK_PLACEHOLDER_NAME 替換為先前的名稱:
... spec: disks: - boot: true virtualMachineDiskRef: name: VM_DISK_PLACEHOLDER_NAME # Replace this name with the previous VM name
啟動原始 VM。如果清除的空間足夠,VM 就能順利啟動。
如果不需要新的 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:使用支援
ReadWriteMany
存取模式的儲存空間類別,更新虛擬機器的spec.dataVolumeTemplate.spec.pvc.storageClassName
值,並使用容器儲存空間介面 (CSI) 驅動程式做為儲存空間佈建工具。如果叢集上沒有其他儲存空間類別可提供
ReadWriteMany
功能,請更新spec.dataVolumeTemplate.spec.pvc.accessMode
值,加入ReadWriteOnce
存取模式。
CSI 驅動程式無法佈建
PersistentVolume
:查看錯誤訊息:
kubectl describe pvc VM_NAME-boot-dv -n NAMESPACE_NAME
請替換下列變數:
VM_NAME
:虛擬機器的名稱。NAMESPACE_NAME
:命名空間的名稱。
設定驅動程式,解決錯誤。為確保
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
PersistentVolume
物件佈建成功後,請在驗證後刪除測試 PVC:kubectl delete pvc test-pvc -n NAMESPACE_NAME
無法建立虛擬機器
如果虛擬機器資源已套用,但未進入 Running
狀態,請按照下列步驟操作:
查看虛擬機器記錄:
kubectl get vm VM_NAME -n NAMESPACE_NAME
檢查虛擬機器的對應 Pod 狀態:
kubectl get pod -l kubevirt.io/vm=VM_NAME
輸出內容會顯示 Pod 狀態。可能選項如下:
ContainerCreating
狀態
如果 Pod 處於 ContainerCreating
狀態,請按照下列步驟操作:
取得 Pod 狀態的其他詳細資料:
kubectl get pod -l kubevirt.io/vm=VM_NAME
如果磁碟區已卸載,請確認
spec.volumes
欄位中指定的所有磁碟區都已成功掛接。如果磁碟區是磁碟,請檢查磁碟狀態。spec.accessCredentials
欄位會指定要掛接 SSH 公開金鑰的值。 確認密鑰與虛擬機器建立在相同命名空間。
如果叢集資源不足,無法建立 Pod,請按照下列步驟操作:
如果叢集的運算資源不足,無法排定虛擬機器 Pod,請移除其他不需要的 Pod,釋出資源。
降低虛擬機器的
spec.domain.resources.requests.cpu
和spec.domain.resources.requests.memory
值。
Error
或 CrashLoopBackoff
狀態
如要解決 Error
或 CrashLoopBackoff
狀態的 Pod,請從虛擬機器運算 Pod 擷取記錄:
kubectl logs -l kubevirt.io/vm=VM_NAME -c compute
Running
狀態和虛擬機器故障
如果 Pod 處於 Running
狀態,但虛擬機器本身發生故障,請按照下列步驟操作:
查看虛擬機器記錄 Pod 的記錄:
kubectl logs -l kubevirt.io/vm=VM_NAME -c log
如果記錄顯示虛擬機器啟動時發生錯誤,請檢查虛擬機器的正確開機裝置。將主要開機磁碟的
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 後設定本機密碼。如要設定使用者名稱和密碼,請完成下列步驟:
- 建立文字檔案。
在文字檔中設定使用者名稱和密碼:
#!/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
:使用者名稱的密碼。請避免使用基本密碼,因為部分作業系統可能會要求密碼長度和複雜度下限。
將開機指令碼建立為 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
:開機指令碼的路徑,其中包含您設定的使用者名稱和密碼。
編輯 VM 規格:
kubectl --kubeconfig=ADMIN_KUBECONFIG edit gvm \ -n PROJECT_NAMESPACE VM_NAME
將
VM_NAME
替換為要在開機指令碼中新增的 VM 名稱。在
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
-
- 如果您正在使用新的 VM,請略過這個步驟。
存取 VM 序列控制台
如要開始存取 VM 序列埠控制台,請執行下列步驟:
連線至序列主控台:
gdcloud compute connect-to-serial-port VM_NAME \ --project PROJECT_NAMESPACE