Usar VMs aninhadas com clusters do GKE

É possível criar instâncias de máquina virtual (VM) dentro de outras VMs usando a virtualização aninhada. O Compute Engine adiciona instruções de virtualização a séries de máquinas específicas para que essas instâncias de VM possam criar VMs aninhadas. Como os nós do Google Kubernetes Engine (GKE) são executados em VMs do Compute Engine, as cargas de trabalho do GKE podem criar e usar VMs aninhadas. Este documento mostra como ativar a virtualização aninhada no GKE.

Como as VMs aninhadas funcionam no GKE

Para usar VMs aninhadas no GKE, ative a virtualização aninhada para nós ou pools de nós específicos. As extensões de virtualização de CPU correspondentes, como Intel Virtualization Technology (VT-x) ou AMD Virtualization (AMD-V), estão ativadas nas VMs subjacentes. Em seguida, é possível acionar a criação de VMs aninhadas de pods usando softwares como QEMU ou Kata Containers.

No GKE, as VMs aninhadas são úteis para os seguintes casos de uso:

  • Execute códigos não confiáveis, como agentes de IA, em VMs leves, como os contêineres Kata. Para mais informações sobre esse caso de uso, consulte Usar contêineres Kata de código aberto com o GKE Agent Sandbox.
  • Adicione uma camada de isolamento assistido por hardware para cargas de trabalho multilocatárias.
  • Executar softwares especializados, como emuladores do Android, na nuvem.

Implicações do desempenho reduzido

Com a virtualização aninhada assistida por hardware, as cargas de trabalho em execução nas VMs aninhadas podem ter desempenho reduzido em comparação com as configurações de virtualização não aninhadas. O impacto no desempenho depende do perfil específico da carga de trabalho, incluindo as características de uso da memória e de E/S.

Além disso, a criação de VMs aninhadas nas VMs subjacentes dos nós do GKE pode afetar o desempenho de outras cargas de trabalho em execução nesses nós.

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ative a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a Google Cloud CLI para essa tarefa, instale e inicialize a CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão mais recente executando o comando gcloud components update. Talvez as versões anteriores da CLI gcloud não sejam compatíveis com a execução dos comandos neste documento.

Requisitos e limitações

Considere as informações a seguir antes de ativar a virtualização aninhada com o GKE e permitir que seus pods criem VMs aninhadas:

  • Só é possível configurar pools de nós com VMs aninhadas com um número limitado de séries de máquinas de VM. Consulte a linha Virtualização aninhada da Comparação de séries de máquinas para confirmar as séries de máquinas compatíveis.
  • A virtualização aninhada não é compatível com os pools de nós do Windows Server.
  • Não será possível usar a virtualização aninhada se a restrição Desativar virtualização aninhada da VM for aplicada à política da organização.
  • Defina securityContext.privileged:true para que os pods interajam com VMs aninhadas.
  • Se você usa o GKE Autopilot, não é possível criar nós de pods privilegiados, exceto nas seguintes situações:

  • Não é possível ativar a virtualização aninhada em pools de nós atuais.

  • A virtualização aninhada é uma configuração imutável no GKE.

  • Se você usar ComputeClasses para ativar a virtualização aninhada, seu cluster precisa executar o GKE versão 1.37.0-gke.4713000 ou posterior.

Ativar virtualização aninhada

As seções a seguir mostram como ativar a virtualização aninhada no GKE das seguintes maneiras:

  • Usar ComputeClasses: no modo Autopilot ou Standard, ative a virtualização aninhada para configurações de nós específicas em uma ComputeClass. Com esse método, é possível ativar a virtualização aninhada em pools de nós criados automaticamente e fazer failback em várias configurações de nós priorizadas.
  • Use a API GKE: no modo padrão, use um cliente como o console Google Cloud , a CLI gcloud ou o Terraform para criar pools de nós específicos que usam virtualização aninhada.

Ativar usando ComputeClasses

É possível usar uma ComputeClass para ativar a virtualização aninhada em grupos específicos de nós no modo Autopilot ou Standard. As ComputeClasses são o único método para ativar a virtualização aninhada em pools de nós e nós do Autopilot criados automaticamente. Para implantar uma ComputeClass de exemplo que ativa a virtualização aninhada, siga estas etapas:

  1. Salve o manifesto ComputeClass a seguir como um arquivo chamado nested-virt-class.yaml:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: nested-virt-class
    spec:
      priorities:
      - machineFamily: c3
        spot: true
        enableNestedVirtualization: true
      - machineFamily: c4
        spot: false
        enableNestedVirtualization: true
      - machineFamily: c4d
        spot: true
        enableNestedVirtualization: true
      nodePoolConfig:
        imageType: "cos_containerd"
      nodePoolAutoCreation:
        enabled: true
      whenUnsatisfiable: DoNotScaleUp
    

    Este exemplo de ComputeClass tem as seguintes propriedades:

    • Prioriza instâncias C3 em VMs spot, volta para instâncias C4 sob demanda e, em seguida, volta para instâncias C4D em VMs spot.
    • Ativa a virtualização aninhada para todas as instâncias.
    • Impede que o GKE faça escalonamento vertical da série de máquinas padrão do cluster se as instâncias priorizadas não estiverem disponíveis.
    • Usa a imagem de nó do Container-Optimized OS para todos os nós.
    • Ativa a criação automática de pool de nós para que o GKE possa criar novos pools de nós para executar pods quando necessário.

    Como alternativa, é possível ativar a virtualização aninhada para todas as regras de prioridade na sua ComputeClass especificando o campo enableNestedVirtualization: true no campo spec.priorityDefaults.

  2. Crie a ComputeClass:

    kubectl apply -f nested-virt-class.yaml
    

    Quando você ativa a virtualização aninhada em uma ComputeClass, o GKE verifica se a série de máquinas especificada é compatível com VMs aninhadas. Se uma série de máquinas em uma regra de prioridade que ativa a virtualização aninhada não for compatível, o GKE vai avisar você. No entanto, essa verificação pode não encontrar todas as configurações incompatíveis.

  3. Para acionar a criação do pool de nós, crie um pod que selecione a ComputeClass:

    1. Salve o seguinte manifesto de pod como um arquivo chamado nested-virt-example-pod.yaml:

      apiVersion: v1
      kind: Pod
      metadata:
        name: nested-virt-example-pod
      spec:
        nodeSelector:
          cloud.google.com/compute-class: nested-virt-class
        containers:
        - name: example-container
          image: registry.k8s.io/pause:3.9
      
    2. Crie o pod:

      kubectl apply -f nested-virt-example-pod.yaml
      

Os nós que o GKE cria para essa ComputeClass têm a virtualização aninhada ativada. É possível executar aplicativos que criam VMs aninhadas nesses nós. Todos os pods que usam a ComputeClass podem criar VMs aninhadas. Por exemplo, é possível instalar o Kata Containers nesses nós especificando um seletor de nós para o rótulo cloud.google.com/compute-class="nested-virt-class".

Ativar em pools de nós padrão

Se você não quiser usar ComputeClasses, ative manualmente a virtualização aninhada para pools de nós novos específicos em clusters padrão durante qualquer uma das seguintes operações:

  • Ao criar um cluster padrão, que ativa a virtualização aninhada para o pool de nós padrão. Essa ativação se aplica apenas ao pool de nós padrão. O GKE não ativa automaticamente a virtualização aninhada para outros pools de nós criados posteriormente.
  • Ao criar um pool de nós em um cluster padrão.

Para ativar a virtualização aninhada em pools de nós criados manualmente, selecione uma das seguintes opções:

Console

  • Ative a virtualização aninhada para o pool de nós padrão de um novo cluster:

    1. No console do Google Cloud , acesse a página Criar um cluster do Kubernetes.

      Acessar "Criar um cluster do Kubernetes"

    2. Configure as configurações básicas do cluster.
    3. No menu de navegação, na seção Pools de nós, expanda a seção default-pool e clique em Nós.
    4. Na seção Configuração da máquina, escolha um tipo de máquina compatível (consulte a linha Virtualização aninhada).
    5. Depois da seção Reservas, marque a caixa de seleção Ativar virtualização aninhada.
    6. Para criar o cluster, clique em Criar.
  • Ative a virtualização aninhada para um novo pool de nós em um cluster atual:

    1. No console do Google Cloud , acesse a página de clusters do Kubernetes.

      Acessar os clusters do Kubernetes

    2. Clique no nome do cluster em que você quer criar o novo pool de nós.

    3. Configure o pool de nós.

    4. Clique na guia Nós.

    5. No cabeçalho da seção Pools de nós, clique em Criar pool de nós gerenciado pelo usuário.

    6. No menu de navegação, selecione Nós.

    7. Na seção Configuração da máquina, escolha uma série de máquinas que ofereça suporte à virtualização aninhada. Para mais informações, filtre a tabela de comparação de séries de máquinas pela propriedade Virtualização aninhada.

    8. Marque a caixa de seleção Ativar virtualização aninhada. Se a caixa de seleção estiver desativada, verifique se você selecionou uma série de máquinas que oferece suporte à virtualização aninhada.

    9. Clique em Criar.

gcloud

  • Ative a virtualização aninhada para o pool de nós padrão de um novo cluster:

    gcloud container clusters create CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
        --enable-nested-virtualization \
        --node-labels=nested-virtualization=enabled \
        --machine-type=MACHINE_TYPE
    

    Substitua:

    • CLUSTER_NAME: um nome para o cluster.
    • CONTROL_PLANE_LOCATION: a região ou zona do plano de controle do cluster.
    • MACHINE_TYPE: um tipo de máquina que oferece suporte à virtualização aninhada, como n4-standard-8. Para mais informações, filtre a tabela de comparação de séries de máquinas pela propriedade Virtualização aninhada.
  • Ative a virtualização aninhada para um novo pool de nós em um cluster atual:

    gcloud container node-pools create NODEPOOL_NAME \
        --enable-nested-virtualization \
        --node-labels=nested-virtualization=enabled \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --machine-type=MACHINE_TYPE
    

    Substitua:

    • NODEPOOL_NAME: um nome para o pool de nós.
    • CLUSTER_NAME: o nome do cluster atual.
    • CONTROL_PLANE_LOCATION: o local do plano de controle do cluster.
    • MACHINE_TYPE: um tipo de máquina que oferece suporte à virtualização aninhada, como n4-standard-8. Para mais informações, filtre a tabela de comparação de séries de máquinas pela propriedade Virtualização aninhada.

Depois de criar o cluster ou o pool de nós, é possível verificar se a virtualização aninhada está ativada. Os nós nesses pools têm o rótulo de nó do Kubernetes nested-virtualization=enabled, que pode ser usado para programar pods que criam VMs aninhadas.

Programar um pod para um nó compatível com virtualização aninhada

Para programar um pod em um nó com virtualização aninhada ativada, adicione o seguinte seletor de nós à especificação:

nodeSelector:
  nested-virtualization: enabled

Além disso, para que o pod se conecte a uma VM aninhada, defina o pod como privilegiado configurando securityContext.privileged:true.

A seguir