本文適用於執行 Google Distributed Cloud 的應用程式擁有者。本文說明如何為使用 GDC 上的 VM 執行階段的虛擬機器 (VM) 建立及管理磁碟資源。
事前準備
如要完成這份文件,您必須存取下列資源:
- 存取 Google Distributed Cloud 1.12.0 版 (anthosBareMetalVersion: 1.12.0) 以上版本的叢集。您可以使用任何可執行工作負載的叢集類型。 如有需要,請在 Compute Engine 上試用 Google Distributed Cloud,或參閱叢集建立總覽。
- virtctl用戶端工具已安裝為- kubectl的外掛程式。視需要安裝 virtctl 用戶端工具。
建立附加磁碟的 VM
建立 VM 時,您可以附加現有的開機或資料磁碟、從映像檔建立磁碟 (包括開機磁碟),或是建立空白磁碟。
空白磁碟
在這個情境中,您會建立空白磁碟並連接至 VM。這個情境可讓您建立資料磁碟,用來儲存應用程式資料。
- 在您選擇的編輯器中,建立定義 - VirtualMachineDisk和- VirtualMachine的資訊清單,例如- my-vm.yaml:- nano my-vm.yaml
- 複製並貼上下列 YAML 定義: - apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: DISK_NAME spec: size: 10Gi --- apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - boot: true virtualMachineDiskName: VM_NAME-boot-dv - virtualMachineDiskName: DISK_NAME- 更改下列內容: - DISK_NAME:您要建立並附加至 VM 的空白磁碟名稱。
- VM_NAME:您要建立的 VM 名稱。- 這個範例會建立名為 - DISK_NAME的空白- 10Gi(10 GiB) 磁碟。在 VM 的- spec.disks區段中,您也必須附加開機磁碟,例如下一個區段所示的映像檔。
 
- 在編輯器中儲存並關閉資訊清單檔案。 
- 使用 - kubectl建立 VM 和磁碟:- kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG- 將 - KUBECONFIG替換為叢集 kubeconfig 檔案的路徑。
從圖片
在這種情況下,您會從映像檔建立磁碟,並將其附加至 VM。這個情境可讓您從映像檔等項目建立開機磁碟。您也可以從映像檔建立及附加資料磁碟。
支援的圖片來源
GDC 上的 VM Runtime 支援多種映像檔格式,並支援三種可在 VirtualMachineDisk 規格中指定的映像檔來源。以下範例分別從不同的支援映像檔來源建立 20 GiB 的磁碟。
- 超文本傳輸通訊協定 (HTTP) - 下列 - VirtualMachineDisk範例顯示 HTTP 圖片來源的基本結構。「- url」欄位必須是 HTTP 或 HTTPS 網址。- apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: my-disk spec: source: http: url: https://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img size: 20GiB storageClassName: local-shared
- Cloud Storage - 下列範例說明如何從 Cloud Storage bucket 中的映像檔建立磁碟。如果機器上的應用程式預設憑證不足以存取 Cloud Storage 網址,您必須提供憑證。在下列範例中, - my-gcs是包含以 base64 編碼服務帳戶金鑰的密鑰。- apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: my-disk spec: source: gcs: url: gs://kubevirt-ci-vm-images/rhel8.2/rhel8_2_cloud.qcow2 secretRef: my-gcs size: 20GiB storageClassName: local-shared- 如果您使用下載的服務帳戶金鑰建立叢集,可以將 Artifact Registry 服務帳戶金鑰用於 Cloud Storage 存取權。如要建立個別服務帳戶來存取 Cloud Storage,請參閱「設定可存取 Cloud Storage 值區的服務帳戶」。 - 使用下列指令,從下載的服務帳戶金鑰檔案建立 Kubernetes 密鑰: - kubectl create secret generic SECRET_NAME --from-file=KEY_FILE --namespace default \ --kubeconfig KUBECONFIG- 更改下列內容: - SECRET_NAME:密鑰的名稱。
- KEY_FILE:下載的服務帳戶金鑰 JSON 檔案路徑。例如:- bmctl-workspace/.sa-keys/my-project-anthos-baremetal-gcr.json。
- KUBECONFIG:叢集 kubeconfig 檔案的路徑。
 - 如要進一步瞭解如何使用憑證存取 Cloud Storage,請參閱建立及使用憑證,從 Cloud Storage 匯入圖片。 
- Container Registry 範例 - 支援符合開放容器倡議 (OCI) 發布規格的容器登錄檔。下列範例會從 Docker 登錄檔中儲存的映像檔建立磁碟。 - apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: my-disk spec: source: registry: url: docker://kubevirt/fedora-cloud-registry-disk-demo size: 20GiB storageClassName: local-shared
有效圖片格式
從映像檔建立磁碟時,可以使用下列任一映像檔格式:
- GNU zip (gzip) 封存檔 (.gz)
- RAW (.raw、.img)
- QEMU 寫入時複製第 2 版 (qcow2) 磁碟映像檔 (.qcow2)
- XZ 壓縮檔 (.xz)
- 虛擬機器磁碟 (VMDK) 檔案 (.vmdk)
- VirtualBox 虛擬磁碟映像檔 (VDI) 檔案 (.vdi)
- 虛擬硬碟 (VHD) 映像檔 (.vdh)
- 虛擬硬碟第 2 版 (VDHX) 檔案 (.vdhx)
- ISO 磁碟映像檔 (.iso)
透過 HTTP 映像檔建立的磁碟範例
下列步驟會從 Ubuntu 映像檔建立開機磁碟:
- 在您選擇的編輯器中建立資訊清單,定義 - VirtualMachineDisk和- VirtualMachine,例如 my-vm.yaml:- nano my-vm.yaml
- 複製並貼上下列 YAML 定義: - apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: VM_NAME-boot-dv spec: size: 20Gi source: http: url: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img --- apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - boot: true virtualMachineDiskName: VM_NAME-boot-dv- 這個範例會使用 Ubuntu 公開映像檔,建立名為 - VM_NAME-boot-dv的- 20Gi(20 GiB) 磁碟。在 VM 的- spec.disks區段中,磁碟會設為- boot: true。
- 在編輯器中儲存並關閉資訊清單。 
- 使用 - kubectl建立 VM 和磁碟:- kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG- 將 - KUBECONFIG替換為叢集 kubeconfig 檔案的路徑。
現有磁碟
在這個情境中,您會建立空白磁碟並連接至 VM。這個情境可讓您建立資料磁碟,用來儲存應用程式資料。
- 在您選擇的編輯器中建立 - VirtualMachine資訊清單,例如 my-vm.yaml:- nano my-vm.yaml
- 複製並貼上下列 YAML 定義: - apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - boot: true virtualMachineDiskName: VM_NAME-boot-dv - virtualMachineDiskName: EXISTING_DISK_NAME- 這個範例會附加名為 - EXISTING_DISK_NAME的現有磁碟。- 在 VM 的 - spec.disks區段中,您也必須連結開機磁碟,例如上一節所示的映像檔。
- 在編輯器中儲存並關閉 VM 資訊清單。 
- 使用 - kubectl建立 VM:- kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG- 將 - KUBECONFIG替換為叢集 kubeconfig 檔案的路徑。
尋找磁碟
從 Google Distributed Cloud 1.13.0 版開始,建立 VM 時,GDC 的 VM Runtime 會使用您在 VM 資源中指定的磁碟名稱,設定磁碟序號。具體來說,您在 VirtualMachine 自訂資源中以 spec.disks.virtualMachineDiskName 指定的名稱,會用於磁碟的序號。這項功能可讓您在需要執行磁碟作業 (例如格式化或掛接) 時,更輕鬆地在 VM 中找到磁碟。
舉例來說,如果您建立 VM 並指定名為 sample-boot-dv 的開機磁碟,則 VirtualMachine 自訂資源會類似於下列內容:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: sample-vm
spec:
  osType: Linux
  compute:
    cpu:
      vcpus: 2
    memory:
      capacity: 4Gi
  interfaces:
    - name: eth0
      networkName: pod-network
      default: true
  disks:
    - boot: true
      virtualMachineDiskName: sample-vm-boot-dv
    - virtualMachineDiskName: attached-disk
如果是 Linux VM,登入 VM 後,可以執行下列指令,依序號列出磁碟:
ls -l /dev/disk/by-id/
回應內容應如下列範例輸出內容所示,其中磁碟名稱會顯示為序號:
total 0
lrwxrwxrwx 1 root root  9 Oct 19 17:17 ata-QEMU_HARDDISK_agentInstallation -> ../../sdb
lrwxrwxrwx 1 root root  9 Oct 19 17:17 ata-QEMU_HARDDISK_agentSADisk -> ../../sda
lrwxrwxrwx 1 root root  9 Oct 19 17:17 virtio-sample-boot-dv -> ../../vda
lrwxrwxrwx 1 root root 10 Oct 19 17:17 virtio-sample-boot-dv-part1 -> ../../vda1
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-sample-boot-dv-part14 -> ../../vda14
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-sample-boot-dv-part15 -> ../../vda15
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-attached-disk -> ../../vdb
請注意下列情境式功能行為:
- 如果 virtualMachineDiskName值超過 20 個字元,VM Runtime on GDC 只會使用前 20 個字元做為序號。
- 如果兩個磁碟的前 20 個字元相同,只有第一個磁碟會有序號。
建立磁碟並連接至現有 VM
如果您有現有 VM,可以建立及連結磁碟,支援應用程式生命週期。VM 必須處於停止狀態,才能連結磁碟。
空白磁碟
在這個情境中,您會建立空白磁碟並連接至 VM。這個情境可讓您建立資料磁碟,用來儲存應用程式資料。
- 視需要使用 - kubectl停止 VM:- kubectl virt stop vm VM_NAME --kubeconfig KUBECONFIG- 更改下列內容: - VM_NAME:要停止的 VM 名稱。
- KUBECONFIG:叢集 kubeconfig 檔案的路徑。
 
- 編輯現有 VM 資源,例如 - my-vm:- kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
- 更新 - VirtualMachineYAML 資訊清單,在頂端新增- VirtualMachineDisk區段,然後在 VM 的- spec.disks區段結尾附加磁碟:- apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: DISK_NAME spec: size: 10Gi --- apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - boot: true virtualMachineDiskName: VM_NAME-boot-dv - virtualMachineDiskName: DISK_NAME- 這個範例會建立名為 - DISK_NAME的空白- 10Gi(10 GiB) 磁碟。
- 在編輯器中儲存並關閉更新後的 VM 資訊清單。 
- 使用 - kubectl啟動 VM:- kubectl virt start vm VM_NAME --kubeconfig KUBECONFIG
從圖片
在這個情境中,您會依據來源映像檔建立磁碟,並將其附加至 VM。
- 視需要使用 - kubectl停止 VM:- kubectl virt stop vm VM_NAME --kubeconfig KUBECONFIG- 更改下列內容: - VM_NAME:要停止的 VM 名稱。
- KUBECONFIG:叢集 kubeconfig 檔案的路徑。
 
- 編輯現有 VM 資源,例如 - my-vm:- kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
- 更新 - VirtualMachine資訊清單,在頂端新增- VirtualMachineDisk區段,然後在 VM 的- spec.disks區段結尾附加磁碟:- apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: DISK_NAME spec: size: 10Gi source: http: url: http://example.com/my-disk-img.qcow2 --- apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - boot: true virtualMachineDiskName: VM_NAME-boot-dv - virtualMachineDiskName: DISK_NAME- 這個範例會從 - http://example.com/my-disk-img.qcow2HTTP 來源建立名為- DISK_NAME的- 10Gi(10 GiB) 磁碟。
- 在編輯器中儲存並關閉更新後的 VM 資訊清單。 
- 使用 - kubectl啟動 VM:- kubectl virt start vm VM_NAME --kubeconfig KUBECONFIG
建立磁碟
在此情境中,您會分別建立磁碟資源和 VM 資源。這個情境可讓您預先建立磁碟,然後視需要附加至 VM。
空白磁碟
如要建立空白磁碟,請完成下列步驟。
- 在您選擇的編輯器中建立 - VirtualMachineDisk資訊清單,例如 my-disk.yaml:- nano my-disk.yaml
- 複製並貼上下列 YAML 定義: - apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: DISK_NAME spec: size: 10Gi- 這個範例會建立名為 - DISK_NAME的空白- 10Gi(10 GiB) 磁碟。
- 在編輯器中儲存並關閉磁碟資訊清單。 
- 使用 - kubectl建立磁碟:- kubectl apply -f my-disk.yaml --kubeconfig KUBECONFIG- 將 - KUBECONFIG替換為叢集 kubeconfig 檔案的路徑。
從圖片
如要從映像檔建立磁碟,請完成下列步驟。
- 在您選擇的編輯器中建立 - VirtualMachineDisk資訊清單,例如- my-disk.yaml:- nano my-disk.yaml
- 複製並貼上下列 YAML 定義: - apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: DISK_NAME spec: size: 20Gi source: http: url: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img- 這個範例會使用 Ubuntu 公開映像檔,建立名為 - DISK_NAME的- 20Gi(20 GiB) 磁碟。
- 在編輯器中儲存並關閉磁碟資訊清單。 
- 使用 - kubectl建立磁碟:- kubectl apply -f my-disk.yaml --kubeconfig KUBECONFIG- 將 - KUBECONFIG替換為叢集 kubeconfig 檔案的路徑。
後續步驟
- 建立及使用憑證,從 Cloud Storage 匯入圖片。
- 在 Google Distributed Cloud 中建立及使用儲存空間類別。
- 不再需要 VM 或虛擬磁碟資源時,請刪除 Google Distributed Cloud 中的 VM。