在 Google Distributed Cloud 中建立及管理虛擬磁碟

本文適用於執行 Google Distributed Cloud 的應用程式擁有者。本文說明如何為使用 GDC 上的 VM 執行階段的虛擬機器 (VM) 建立及管理磁碟資源。

事前準備

如要完成這份文件,您必須存取下列資源:

建立附加磁碟的 VM

建立 VM 時,您可以附加現有的開機或資料磁碟、從映像檔建立磁碟 (包括開機磁碟),或是建立空白磁碟。

空白磁碟

在這個情境中,您會建立空白磁碟並連接至 VM。這個情境可讓您建立資料磁碟,用來儲存應用程式資料。

  1. 在您選擇的編輯器中,建立定義 VirtualMachineDiskVirtualMachine 的資訊清單,例如 my-vm.yaml

    nano my-vm.yaml
    
  2. 複製並貼上下列 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 區段中,您也必須附加開機磁碟,例如下一個章節所示的映像檔。

  3. 在編輯器中儲存並關閉資訊清單檔案。

  4. 使用 kubectl 建立 VM 和磁碟:

    kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
    

    KUBECONFIG 替換為叢集 kubeconfig 檔案的路徑。

從圖片

在這種情況下,您會從映像檔建立磁碟,並將其附加至 VM。這個情境可讓您從映像檔等項目建立開機磁碟。您也可以從映像檔建立及附加資料磁碟。

支援的圖片來源

GDC 上的 VM 執行階段支援多種映像檔格式,並支援三種可在 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 匯入圖片

  • 容器登錄檔範例

    支援符合開放容器倡議 (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 映像檔建立開機磁碟:

  1. 在您選擇的編輯器中建立資訊清單,定義 VirtualMachineDiskVirtualMachine,例如 my-vm.yaml

    nano my-vm.yaml
    
  2. 複製並貼上下列 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-dv20Gi (20 GiB) 磁碟。在 VM 的 spec.disks 區段中,磁碟會設為 boot: true

  3. 在編輯器中儲存並關閉資訊清單。

  4. 使用 kubectl 建立 VM 和磁碟:

    kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
    

    KUBECONFIG 替換為叢集 kubeconfig 檔案的路徑。

現有磁碟

在這個情境中,您會建立空白磁碟並連接至 VM。這個情境可讓您建立資料磁碟,用來儲存應用程式資料。

  1. 在您選擇的編輯器中建立 VirtualMachine 資訊清單,例如 my-vm.yaml:

    nano my-vm.yaml
    
  2. 複製並貼上下列 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 區段中,您也必須連結開機磁碟,例如上一節所示的映像檔。

  3. 在編輯器中儲存並關閉 VM 資訊清單。

  4. 使用 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。這個情境可讓您建立資料磁碟,用來儲存應用程式資料。

  1. 視需要使用 kubectl 停止 VM:

    kubectl virt stop vm VM_NAME --kubeconfig KUBECONFIG
    

    更改下列內容:

    • VM_NAME:要停止的 VM 名稱。
    • KUBECONFIG:叢集 kubeconfig 檔案的路徑。
  2. 編輯現有 VM 資源,例如 my-vm

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  3. 更新 VirtualMachine YAML 資訊清單,在頂端新增 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) 磁碟。

  4. 在編輯器中儲存並關閉更新後的 VM 資訊清單。

  5. 使用 kubectl 啟動 VM:

    kubectl virt start vm VM_NAME --kubeconfig KUBECONFIG
    

從圖片

在這個情境中,您會依據來源映像檔建立磁碟,並將其附加至 VM。

  1. 視需要使用 kubectl 停止 VM:

    kubectl virt stop vm VM_NAME --kubeconfig KUBECONFIG
    

    更改下列內容:

    • VM_NAME:要停止的 VM 名稱。
    • KUBECONFIG:叢集 kubeconfig 檔案的路徑。
  2. 編輯現有 VM 資源,例如 my-vm

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  3. 更新 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.qcow2 HTTP 來源建立名為 DISK_NAME10Gi (10 GiB) 磁碟。

  4. 在編輯器中儲存並關閉更新後的 VM 資訊清單。

  5. 使用 kubectl 啟動 VM:

    kubectl virt start vm VM_NAME --kubeconfig KUBECONFIG
    

建立磁碟

在此情境中,您會分別建立磁碟資源和 VM 資源。這個情境可讓您預先建立磁碟,然後視需要附加至 VM。

空白磁碟

如要建立空白磁碟,請完成下列步驟。

  1. 在您選擇的編輯器中建立 VirtualMachineDisk 資訊清單,例如 my-disk.yaml:

    nano my-disk.yaml
    
  2. 複製並貼上下列 YAML 定義:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 10Gi
    

    這個範例會建立名為 DISK_NAME 的空白 10Gi (10 GiB) 磁碟。

  3. 在編輯器中儲存並關閉磁碟資訊清單。

  4. 使用 kubectl 建立磁碟:

    kubectl apply -f my-disk.yaml --kubeconfig KUBECONFIG
    

    KUBECONFIG 替換為叢集 kubeconfig 檔案的路徑。

從圖片

如要從映像檔建立磁碟,請完成下列步驟。

  1. 在您選擇的編輯器中建立 VirtualMachineDisk 資訊清單,例如 my-disk.yaml

    nano my-disk.yaml
    
  2. 複製並貼上下列 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_NAME20Gi (20 GiB) 磁碟。

  3. 在編輯器中儲存並關閉磁碟資訊清單。

  4. 使用 kubectl 建立磁碟:

    kubectl apply -f my-disk.yaml --kubeconfig KUBECONFIG
    

    KUBECONFIG 替換為叢集 kubeconfig 檔案的路徑。

後續步驟