Criar imagens personalizadas

Neste documento, descrevemos como criar uma imagem personalizada para uso com instâncias de máquina virtual (VM) isoladas do Google Distributed Cloud (GDC, na sigla em inglês).

É possível criar imagens personalizadas com base em discos de origem atuais e usá-las para criar e iniciar máquinas virtuais (VMs). As imagens personalizadas são ideais para quando você cria e modifica um disco de inicialização permanente para determinado estado e precisa salvar esse estado para criar VMs. Criar e salvar uma imagem personalizada para usar como uma nova imagem de VM na criação de VMs futuras evita a duplicação das etapas de configuração mais tarde.

Este documento é destinado a desenvolvedores em grupos de administradores de plataforma ou operadores de aplicativos que criam VMs e gerenciam imagens de VM em um ambiente isolado do Google Distributed Cloud (GDC, na sigla em inglês). Para mais informações, consulte Públicos-alvo da documentação do GDC com isolamento físico.

Antes de começar

Para usar comandos da interface de linha de comando (CLI) gdcloud, faça o download, a instalação, e a configuração da gdcloud CLI. Todos os comandos do Distributed Cloud usam a CLI gdcloud ou kubectl e exigem um ambiente de sistema operacional (SO).

Receber o caminho do arquivo kubeconfig

Para executar comandos no servidor da API Management, verifique se você tem os seguintes recursos:

  1. Faça login e gere o arquivo kubeconfig do servidor da API Management, se você não tiver um.

  2. Use o caminho para o arquivo kubeconfig do servidor da API Management para substituir MANAGEMENT_API_SERVER nestas instruções.

Solicitar papéis do IAM

Entre em contato com o administrador do IAM do projeto para solicitar os seguintes papéis no projeto:

  • Administrador do projeto de máquina virtual (project-vm-admin): cria, modifica, lista e exclui VMs no namespace do projeto.

  • Leitor do projeto(project-viewer): visualiza todos os recursos nos namespaces do projeto.

  • Administrador do projeto de imagem de máquina virtual (project-vm-image-admin): cria, lista e exclui imagens de VM personalizadas no namespace do projeto.

Todos os papéis de VM precisam ser vinculados ao namespace do projeto em que a VM reside. Siga as etapas para verificar seu acesso.

Criar uma imagem personalizada

Nesta seção, descrevemos como criar uma imagem personalizada em uma VM.

Prepare a VM para uma imagem

É possível criar uma imagem de um disco enquanto ele está anexado a uma VM em execução. No entanto, a imagem é mais confiável se você colocar a VM em um estado para que a imagem seja capturada.

Parar de gravar dados no disco permanente

Pare a VM para que ela possa desligar e parar de gravar dados no disco permanente.

Criar a imagem

Siga estas etapas para criar imagens de disco de um disco permanente, mesmo enquanto esse disco estiver anexado a uma VM:

Console

  1. Selecione um projeto.

  2. No menu de navegação, clique em Máquinas virtuais > Imagens.

  3. Clique em Criar imagem.

  4. Insira um nome exclusivo para a imagem. O nome não pode ter mais de 35 caracteres.

  5. Insira uma versão para adicionar ao nome da imagem.

  6. No campo Disco de origem, selecione um disco.

  7. No campo Tamanho mínimo do disco, insira um tamanho de disco.

  8. Insira uma descrição da imagem.

  9. Clique em Criar.

A imagem aparece na lista de imagens.

API

  1. Liste todos os objetos VirtualMachineDisk:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      get virtualmachinedisks.virtualmachine.gdc.goog
    
  2. Selecione um objeto VirtualMachineDisk para usar como disco de origem da nova imagem.

  3. Verifique se o disco da VM está anexado a uma VM:

      kubectl --kubeconfig MANAGEMENT_API_SERVER \
        -n PROJECT \
        get virtualmachinedisks.virtualmachine.gdc.goog DISK_NAME \
        -o jsonpath='{.status.virtualMachineAttachments}'
    

    O exemplo de saída a seguir mostra um disco anexado a uma VM:

      [{"autoDelete":true,"nameRef":{"name":"vm1"},"uid":"...."}]
    
  4. Verifique o status de execução da VM. Se o status não for Stopped, pare a VM e continue criando a VirtualMachineImage.

  5. Receba o size de VirtualMachineDisk para criar a imagem:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      get virtualmachinedisks.virtualmachine.gdc.goog DISK_NAME \
      -o jsonpath='{.spec.size}'
    
  6. Crie um objeto VirtualMachineImageImport e implante-o no servidor da API Management:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      apply -f - <<EOF
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineImageImport
    metadata:
      name: VM_IMAGE_IMPORT_NAME
    spec:
      source:
        diskRef:
          name: DISK_NAME
      imageMetadata:
        name: IMAGE_NAME
        operatingSystem: OS_NAME
        minimumDiskSize: MINIMUM_DISK_SIZE
    EOF
    
  7. Verifique se a importação da imagem foi concluída e se o status é Ready:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      get virtualmachineimageimports.virtualmachine.gdc.goog VM_IMAGE_IMPORT_NAME \
      -o jsonpath='{.status}'
    

    Quando a importação for concluída, a saída de status será semelhante a esta:

    {
      "conditions": [
        {
          "lastTransitionTime": "",
          "message": "",
          "observedGeneration": 1,
          "reason": "ImportJobComplete",
          "status": "True",
          "type": "Ready"
        }
      ],
      "imageName": IMAGE_NAME
    }
    
  8. Verifique se a imagem foi criada:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      get virtualmachineimages.virtualmachine.gdc.goog  \
      CREATED_IMAGE_NAME
    

    Substitua as variáveis usando as seguintes definições.

    VariávelDefinição
    MANAGEMENT_API_SERVER O arquivo kubeconfig do servidor da API Management.
    PROJECT O projeto do GDC em que a imagem será criada.
    DISK_NAME O nome do disco de origem, como vm1-boot-disk.
    VM_IMAGE_IMPORT_NAME O nome da importação da imagem da VM. O nome não pode ter mais de 35 caracteres.
    IMAGE_NAME O nome da imagem criada, como custom-image.
    OS_NAME O nome do SO da imagem precisa ser um destes quatro:
    ubuntu-2004, windows-2019, windows-2022, ou rhel-8.
    MINIMUM_DISK_SIZE O tamanho mínimo do disco na importação da imagem da VM, como 20G:
    minimumDiskSize precisa ser sempre maior ou igual ao tamanho do disco de inicialização de origem.
    CREATED_IMAGE_NAME O nome da imagem criada. O nome da imagem criada precisa ser exclusivo. Não é possível usar um nome de imagem que já exista no projeto.

Terraform

  1. Liste todos os objetos VirtualMachineDisk:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      get virtualmachinedisks.virtualmachine.gdc.goog
    
  2. Selecione um objeto VirtualMachineDisk para usar como disco de origem da nova imagem.

  3. Verifique se o disco da VM está anexado a uma VM:

      kubectl --kubeconfig MANAGEMENT_API_SERVER \
        -n PROJECT \
        get virtualmachinedisks.virtualmachine.gdc.goog DISK_NAME \
        -o jsonpath='{.status.virtualMachineAttachments}'
    

    Exemplo de saída mostrando um disco anexado a uma VM:

      [{"autoDelete":true,"nameRef":{"name":"vm1"},"uid":"...."}]
    
  4. Verifique o status de execução da VM. Se o status não for Stopped, pare a VM e continue criando a VirtualMachineImage.

  5. Receba o size de VirtualMachineDisk para criar a imagem:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      get virtualmachinedisks.virtualmachine.gdc.goog DISK_NAME \
      -o jsonpath='{.spec.size}'
    
  6. Crie um arquivo chamado main.tf com o seguinte conteúdo:

    provider "kubernetes" {
      config_path = "MANAGEMENT_API_SERVER"
    }
    
    resource "kubernetes_manifest" "image_import" {
      manifest = {
        "apiVersion" = "virtualmachine.gdc.goog/v1"
        "kind" = "VirtualMachineImageImport"
        "metadata" = {
          "name" = "VM_IMAGE_IMPORT_NAME"
          "namespace" = "PROJECT"
        }
        "spec" = {
          "source" = {
            "diskRef" = {
              "name" = "DISK_NAME"
            }
          }
          "imageMetadata" = {
            "name" = "IMAGE_NAME"
            "operatingSystem" = "OS_NAME"
            "minimumDiskSize" = "MINIMUM_DISK_SIZE"
          }
        }
      }
    }
    
  7. Aplique o objeto VirtualMachineImageImport usando o Terraform:

    terraform apply
    
  8. Verifique se a importação da imagem foi concluída e se o status é Ready:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      get virtualmachineimageimports.virtualmachine.gdc.goog VM_IMAGE_IMPORT_NAME \
      -o jsonpath='{.status}'
    

    O status será semelhante a este quando a importação for concluída:

    {
      "conditions": [
        {
          "lastTransitionTime": "",
          "message": "",
          "observedGeneration": 1,
          "reason": "ImportJobComplete",
          "status": "True",
          "type": "Ready"
        }
      ],
      "imageName": IMAGE_NAME
    }
    
  9. Verifique se a imagem foi criada:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      get virtualmachineimages.virtualmachine.gdc.goog  \
      CREATED_IMAGE_NAME
    

    Substitua as variáveis usando as seguintes definições.

    VariávelDefinição
    MANAGEMENT_API_SERVER O arquivo kubeconfig do servidor da API Management.
    PROJECT O projeto do GDC em que a imagem será criada.
    DISK_NAME O nome do disco de origem, como vm1-boot-disk.
    VM_IMAGE_IMPORT_NAME O nome da importação da imagem da VM. O nome não pode ter mais de 35 caracteres.
    IMAGE_NAME O nome da imagem criada, como custom-image.
    OS_NAME O nome do SO da imagem precisa ser um destes quatro:
    ubuntu-2004, windows-2019, windows-2022, ou rhel-8.
    MINIMUM_DISK_SIZE O tamanho mínimo do disco na importação da imagem da VM, como 20G:
    minimumDiskSize precisa ser sempre maior ou igual ao tamanho do disco de inicialização de origem.
    CREATED_IMAGE_NAME O nome da imagem criada. O nome da imagem criada precisa ser exclusivo. Não é possível usar um nome de imagem que já exista no projeto.

A seguir