GDC 上的 VM 執行階段可讓您在建立虛擬機器 (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 gibibyte) 磁碟。在 VM 的spec.disks區段中,您也必須附加開機磁碟,例如下一節所示的映像檔。
在編輯器中儲存並關閉資訊清單檔案。
使用
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-sharedCloud 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 bucket 的服務帳戶」。
使用下列指令,從下載的服務帳戶金鑰檔案建立 Kubernetes Secret:
kubectl create secret generic SECRET_NAME --from-file=KEY_FILE --namespace default \ --kubeconfig KUBECONFIG更改下列內容:
SECRET_NAME:Secret 的名稱。KEY_FILE:下載的服務帳戶金鑰 JSON 檔案路徑。例如:bmctl-workspace/.sa-keys/my-project-anthos-baremetal-gcr.json。KUBECONFIG:叢集 kubeconfig 檔案的路徑。
如要進一步瞭解如何使用憑證存取 Cloud Storage,請參閱「建立及使用憑證,從 Cloud Storage 匯入映像檔」。
Container Registry 範例
支援符合 Open Container Initiative (OCI) distribution-spec 的 Container Registry。以下範例會依據儲存在 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 映像檔,建立
20Gi(20 Gibibyte) 的磁碟,並命名為VM_NAME-boot-dv。在 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 執行階段會使用您在 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 個字元,GDC 上的 VM 執行階段只會使用前 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 來源建立10Gi(10 GiB) 磁碟,名為DISK_NAME。在編輯器中儲存並關閉更新後的 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 gibibyte) 磁碟。儲存並關閉編輯器中的磁碟資訊清單。
使用
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 gibibyte) 磁碟。儲存並關閉編輯器中的磁碟資訊清單。
使用
kubectl建立磁碟:kubectl apply -f my-disk.yaml --kubeconfig KUBECONFIG將
KUBECONFIG替換為叢集 kubeconfig 檔案的路徑。
後續步驟
- 建立及使用憑證,從 Cloud Storage 匯入映像檔。
- 在 Google Distributed Cloud 建立及使用儲存空間類別。
- 如果不再需要 VM 或其虛擬磁碟資源,請刪除 Google Distributed Cloud 中的 VM。