Crie e faça a gestão de discos virtuais no Google Distributed Cloud

Este documento destina-se a proprietários de aplicações que executam o Google Distributed Cloud. Este documento mostra-lhe como criar e gerir recursos de disco para máquinas virtuais (MVs) que usam o tempo de execução de MVs no GDC.

Antes de começar

Para preencher este documento, precisa de ter acesso aos seguintes recursos:

Crie uma VM com um disco anexado

Quando cria uma VM, pode anexar um disco de arranque ou de dados existente, criar um disco a partir de uma imagem (inclusive para o disco de arranque) ou criar um disco em branco.

Disco vazio

Neste cenário, cria um disco em branco e anexa-o à VM. Este cenário permite-lhe criar um disco de dados para armazenar dados de aplicações.

  1. Crie um manifesto que defina um VirtualMachineDisk e um VirtualMachine, como my-vm.yaml, no editor da sua preferência:

    nano my-vm.yaml
    
  2. Copie e cole a seguinte definição 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
    

    Substitua o seguinte:

    • DISK_NAME: o nome do disco em branco que está a criar e a anexar à sua VM.

    • VM_NAME: o nome da VM que está a criar.

      Este exemplo cria um disco em branco de 10Gi (10 gibibytes) com o nome DISK_NAME. Na secção spec.disks da VM, também tem de anexar um disco de arranque, como o de uma imagem, conforme mostrado na secção seguinte.

  3. Guarde e feche o ficheiro de manifesto no editor.

  4. Crie a VM e o disco com kubectl:

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

    Substitua KUBECONFIG pelo caminho para o ficheiro kubeconfig do cluster.

A partir de uma imagem

Neste cenário, cria um disco a partir de uma imagem e anexa-o à VM. Este cenário permite-lhe criar um disco de arranque, por exemplo, a partir de uma imagem. Também pode criar e anexar discos de dados a partir de uma imagem.

Origens de imagens suportadas

O tempo de execução da VM no GDC permite uma variedade de formatos de imagem e suporta três tipos de origens de imagens que podem ser especificados na especificação VirtualMachineDisk. Cada um dos exemplos seguintes cria um disco de 20 gibibytes a partir de uma origem de imagem suportada diferente.

  • Protocolo de Transferência de Hipertexto (HTTP)

    O exemplo VirtualMachineDisk seguinte mostra a estrutura básica de uma origem de imagem HTTP. O campo url espera um URL HTTP ou 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

    O exemplo seguinte mostra como criar um disco a partir de uma imagem num contentor do Cloud Storage. Se as credenciais predefinidas da aplicação na máquina não forem suficientes para aceder ao URL do Cloud Storage, tem de fornecer credenciais. No exemplo seguinte, my-gcs é um segredo que contém uma chave de conta de serviço codificada em 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
    

    Se usou chaves de contas de serviço transferidas para criar o cluster, pode usar a chave da conta de serviço do Artifact Registry para aceder ao Cloud Storage. Se criar uma conta de serviço separada para aceder ao Cloud Storage, consulte o artigo Configure uma conta de serviço que possa aceder a um contentor do Cloud Storage.

    Use o seguinte comando para criar um segredo do Kubernetes a partir do ficheiro de chave da conta de serviço transferido:

    kubectl create secret generic SECRET_NAME --from-file=KEY_FILE --namespace default \
        --kubeconfig KUBECONFIG
    

    Substitua o seguinte:

    • SECRET_NAME: nome do seu segredo.
    • KEY_FILE: caminho para o ficheiro JSON da chave da conta de serviço transferido. Por exemplo, bmctl-workspace/.sa-keys/my-project-anthos-baremetal-gcr.json.
    • KUBECONFIG: caminho para o ficheiro kubeconfig do cluster.

    Para mais informações sobre a utilização de credenciais para aceder ao Cloud Storage, consulte o artigo Crie e use credenciais para importar imagens do Cloud Storage.

  • Exemplo de registo de contentores

    Os registos de contentores em conformidade com a distribution-spec da Open Container Initiative (OCI) são suportados. O exemplo seguinte cria um disco a partir de uma imagem armazenada num registo do 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
    

Formatos de imagem válidos

Pode usar qualquer um dos seguintes formatos de imagem quando cria um disco a partir de uma imagem:

  • Arquivo GNU zip (gzip) (.gz)
  • RAW (.raw, .img)
  • Imagem de disco da versão 2 (qcow2) de cópia na gravação do QEMU (.qcow2)
  • Arquivo comprimido XZ (.xz)
  • Ficheiro de disco de máquina virtual (VMDK) (.vmdk)
  • Ficheiro de imagem de disco virtual (VDI) do VirtualBox (.vdi)
  • Ficheiro de imagem de disco rígido virtual (VHD) (.vdh)
  • Ficheiro de disco rígido virtual versão 2 (VDHX) (.vdhx)
  • Ficheiro de imagem de disco ISO (.iso)

Exemplo de um disco criado a partir de uma imagem HTTP

Os passos seguintes criam um disco de arranque a partir de uma imagem do Ubuntu:

  1. Crie um manifesto que defina um VirtualMachineDisk e VirtualMachine, como my-vm.yaml,no editor da sua preferência:

    nano my-vm.yaml
    
  2. Copie e cole a seguinte definição 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
    

    Este exemplo cria um disco de 20Gi (20 gibibytes) denominado VM_NAME-boot-dv com uma imagem pública do Ubuntu. Na secção spec.disks da VM, o disco está definido como boot: true.

  3. Guarde e feche o manifesto no editor.

  4. Crie a VM e o disco com kubectl:

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

    Substitua KUBECONFIG pelo caminho para o ficheiro kubeconfig do cluster.

Disco existente

Neste cenário, cria um disco em branco e anexa-o à VM. Este cenário permite-lhe criar um disco de dados para armazenar dados de aplicações.

  1. Crie um manifesto, como my-vm.yaml,no editor da sua escolha:VirtualMachine

    nano my-vm.yaml
    
  2. Copie e cole a seguinte definição 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
    

    Este exemplo anexa um disco existente denominado EXISTING_DISK_NAME.

    Na secção spec.disks da VM, também tem de anexar um disco de arranque, como a partir de uma imagem, conforme mostrado na secção anterior.

  3. Guarde e feche o manifesto da VM no editor.

  4. Crie a VM com kubectl:

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

    Substitua KUBECONFIG pelo caminho para o ficheiro kubeconfig do cluster.

A localizar discos

A partir da versão 1.13.0 do Google Distributed Cloud, quando cria uma VM, o VM Runtime no GDC usa os nomes de discos que especifica no recurso de VM para definir os números de série dos discos. Especificamente, os nomes que especificar com spec.disks.virtualMachineDiskName no recurso personalizado VirtualMachine são usados no número de série dos discos. Esta funcionalidade facilita a localização dos discos na VM quando precisa de realizar operações de disco, como a formatação ou a montagem.

Por exemplo, se criou uma VM e especificou um disco de arranque com o nome sample-boot-dv, o seu recurso personalizado VirtualMachine tem um aspeto semelhante ao seguinte:

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

Para VMs Linux, quando inicia sessão na sua VM, pode executar o seguinte comando para listar os discos pelo respetivo número de série:

ls -l /dev/disk/by-id/

A sua resposta deve ter um aspeto semelhante ao deste exemplo de resultado, em que os nomes dos discos aparecem como números de série:

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

Tenha em atenção o seguinte comportamento das funcionalidades situacionais:

  • Se o valor virtualMachineDiskName tiver mais de 20 carateres, o tempo de execução da VM no GDC usa apenas os primeiros 20 carateres como o número de série.
  • Se existirem dois discos com os mesmos primeiros 20 carateres, apenas o primeiro disco tem um número de série.

Crie e anexe discos a uma VM existente

Se tiver uma VM existente, pode criar e anexar discos para suportar os ciclos de vida da sua aplicação. A VM tem de estar num estado parado antes de anexar um disco.

Disco vazio

Neste cenário, cria um disco em branco e anexa-o à VM. Este cenário permite-lhe criar um disco de dados para armazenar dados de aplicações.

  1. Use kubectl para parar a VM, se necessário:

    kubectl virt stop vm VM_NAME --kubeconfig KUBECONFIG
    

    Substitua o seguinte:

    • VM_NAME: o nome da VM que quer parar.
    • KUBECONFIG: o caminho para o ficheiro kubeconfig do cluster.
  2. Edite o recurso de VM existente, como my-vm:

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  3. Atualize o manifesto YAML para adicionar uma secção VirtualMachineDisk na parte superior e, em seguida, anexe o disco no final da secção spec.disks da VM:VirtualMachine

    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
    

    Este exemplo cria um disco em branco de 10Gi (10 gibibytes) com o nome DISK_NAME.

  4. Guarde e feche o manifesto de VMs atualizado no editor.

  5. Use kubectl para iniciar a VM:

    kubectl virt start vm VM_NAME --kubeconfig KUBECONFIG
    

A partir de uma imagem

Neste cenário, cria um disco a partir de uma imagem de origem e anexa-o à VM.

  1. Use kubectl para parar a VM, se necessário:

    kubectl virt stop vm VM_NAME --kubeconfig KUBECONFIG
    

    Substitua o seguinte:

    • VM_NAME: o nome da VM que quer parar.
    • KUBECONFIG: o caminho para o ficheiro kubeconfig do cluster.
  2. Edite o recurso de VM existente, como my-vm:

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  3. Atualize o manifesto VirtualMachine para adicionar uma secção VirtualMachineDisk na parte superior e, em seguida, anexe o disco no final da secção spec.disks da VM:

    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
    

    Este exemplo cria um disco de 10Gi (10 gibibytes) denominado DISK_NAME a partir da origem HTTP http://example.com/my-disk-img.qcow2.

  4. Guarde e feche o manifesto de VMs atualizado no editor.

  5. Use kubectl para iniciar a VM:

    kubectl virt start vm VM_NAME --kubeconfig KUBECONFIG
    

Crie um disco

Neste cenário, cria os recursos de disco separadamente dos recursos de VM. Este cenário permite-lhe criar discos antecipadamente e, em seguida, anexá-los a VMs conforme necessário.

Disco vazio

Para criar um disco em branco, conclua os seguintes passos.

  1. Crie um manifesto VirtualMachineDisk, como my-disk.yaml,no editor da sua escolha:

    nano my-disk.yaml
    
  2. Copie e cole a seguinte definição YAML:

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

    Este exemplo cria um disco em branco de 10Gi (10 gibibytes) com o nome DISK_NAME.

  3. Guarde e feche o manifesto do disco no editor.

  4. Crie o disco com kubectl:

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

    Substitua KUBECONFIG pelo caminho para o ficheiro kubeconfig do cluster.

A partir de uma imagem

Para criar um disco a partir de uma imagem, conclua os passos seguintes.

  1. Crie um manifesto VirtualMachineDisk, como my-disk.yaml, no editor à sua escolha:

    nano my-disk.yaml
    
  2. Copie e cole a seguinte definição 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
    

    Este exemplo cria um disco de 20Gi (20 gibibytes) denominado DISK_NAME com uma imagem pública do Ubuntu.

  3. Guarde e feche o manifesto do disco no editor.

  4. Crie o disco com kubectl:

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

    Substitua KUBECONFIG pelo caminho para o ficheiro kubeconfig do cluster.

O que se segue?