É 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. Neste documento, mostramos 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 Tecnologia de virtualização Intel (VT-x) ou Virtualização AMD (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 do Kata. Para mais informações sobre esse caso de uso, consulte Usar o Kata Containers 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.
- Verifique se a política da organização permite a criação de VMs aninhadas.
- Analise as restrições para VMs aninhadas.
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:truepara 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:
- Os pods são de propriedade do GKE, de um parceiro do GKE ou de um projeto de código aberto aprovado.
- Os pods são de sua propriedade e estão incluídos em uma WorkloadAllowlist.
Não é possível ativar a virtualização aninhada em pools de nós que já existem.
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. Ao usar esse método, é possível ativar a virtualização aninhada em pools de nós criados automaticamente e fazer fallback em várias configurações de nós priorizadas.
- Use a API GKE: no modo padrão, use um cliente como o console do Google Cloud , a CLI gcloud ou o Terraform para criar pools de nós específicos que usam a 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:
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: DoNotScaleUpEste 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 o 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 ComputeClass especificando o campo
enableNestedVirtualization: trueno campospec.priorityDefaults.Crie a ComputeClass:
kubectl apply -f nested-virt-class.yamlQuando 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.
Para acionar a criação do pool de nós, crie um pod que selecione a ComputeClass:
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.9Crie 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:
- No console do Google Cloud , acesse a página Criar um cluster do Kubernetes.
- Configure as configurações básicas do cluster.
- No menu de navegação, na seção Pools de nós, expanda a seção default-pool e clique em Nós.
- Na seção Configuração da máquina, escolha um tipo de máquina compatível (consulte a linha Virtualização aninhada).
- Depois da seção Reservas, marque a caixa de seleção Ativar virtualização aninhada.
- Para criar o cluster, clique em Criar.
Ative a virtualização aninhada para um novo pool de nós em um cluster atual:
No console do Google Cloud , acesse a página de clusters do Kubernetes.
Clique no nome do cluster em que você quer criar o novo pool de nós.
Configure o pool de nós.
Clique na guia Nós.
No cabeçalho da seção Pools de nós, clique em add_box Criar pool de nós gerenciado pelo usuário.
No menu de navegação, selecione Nós.
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.
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.
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_TYPESubstitua:
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, comon4-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_TYPESubstitua:
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 compatível com virtualização aninhada, comon4-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.