Os snapshots de pods do Google Kubernetes Engine (GKE) ajudam a melhorar a latência de inicialização da carga de trabalho restaurando snapshots de pods em execução. Um snapshot de pod salva todo o estado do pod, incluindo mudanças na memória e no sistema de arquivos. Quando você cria novas réplicas, elas são restauradas do snapshot, permitindo que a carga de trabalho seja retomada em vez de começar de um novo estado. Esse recurso é útil para escalonar horizontalmente cargas de trabalho, como modelos de inferência de IA que carregam pesos grandes na memória ou aplicativos que carregam dependências extensas.
Use este documento para entender como os snapshots de pods do GKE funcionam e avaliar se as cargas de trabalho podem se beneficiar deles.
Os administradores e operadores de plataforma e os desenvolvedores de aplicativos podem usar este documento para avaliar a compatibilidade da carga de trabalho, planejar políticas de armazenamento de snapshots e entender como o GKE gerencia o checkpoint e a restauração. Para mais informações sobre os papéis comuns e as tarefas de exemplo referenciados no conteúdo doCloud de Confiance by S3NS , consulte Tarefas e papéis de usuário comuns do GKE.
Para se preparar e usar snapshots de pods nos clusters, consulte os seguintes guias:
- Preparar para snapshots de pods
- Acionar um snapshot de pod
- Restaurar uma carga de trabalho de um snapshot de pod
Quando usar snapshots de pod
Use snapshots de pods para cargas de trabalho com tempos de inicialização longos. Os exemplos incluem cargas de trabalho de inferência de IA que carregam modelos grandes na memória da CPU ou da GPU ou aplicativos grandes que carregam muitas bibliotecas e dependências. As cargas de trabalho que já têm tempos de inicialização rápidos geralmente não se beneficiam dos snapshots de pod.
Como funcionam os snapshots de pod
Os snapshots de pods do GKE armazenam uma cópia exata do estado do processo de um pod em um momento específico. Ao criar novas réplicas, em vez de inicializar o pod de um estado novo, o GKE restaura o pod de um snapshot. Essa restauração significa que o pod retoma a execução do ponto em que o snapshot foi tirado.
Para configurar snapshots de pods de maneira declarativa, crie recursos personalizados do Kubernetes para definir o comportamento do snapshot. Um agente executado em cada nó do GKE gerencia o ciclo de vida do snapshot. Com base nas políticas definidas, o agente determina quando criar novos snapshots e quando usar os snapshots atuais para restaurar novos pods. Um controlador executado no plano de controle do GKE limpa snapshots obsoletos e resolve problemas. O Cloud Storage armazena os snapshots de pod.
Conteúdo do snapshot
A tabela a seguir lista o que um snapshot de pod inclui e exclui:
| Categoria | Incluído | Excluído |
|---|---|---|
| Estado do aplicativo |
|
Nada (todo o estado do processo na memória é capturado) |
| Sistemas de arquivos |
|
|
| Rede |
|
|
Recursos personalizados
Para configurar snapshots de pods de forma declarativa, use os seguintes recursos personalizados:
- PodSnapshotStorageConfig: especifica o local de armazenamento dos snapshots. Oferece suporte apenas a buckets do Cloud Storage.
- PodSnapshotPolicy: define quais pods serão capturados com base nos seletores de rótulos do Kubernetes. Esse recurso personalizado contém a maioria das opções de configuração do recurso, incluindo como os snapshots são acionados, o escopo do snapshot e as políticas de retenção.
- PodSnapshotManualTrigger (opcional): se você não usar um gatilho de carga de trabalho, defina um gatilho manual para criar um snapshot de um pod específico.
Para especificações de referência, consulte a referência de CustomResourceDefinition do PodSnapshot.
Acionadores de snapshot
É possível acionar um snapshot de pod das seguintes maneiras:
- Gatilho de carga de trabalho: o aplicativo dentro do pod sinaliza ao agente do GKE que está pronto para um snapshot. Esse tipo de gatilho é executado uma vez em um ciclo de carga de trabalho, por exemplo, em um estado de carga de trabalho pronta. Essa abordagem é ideal para melhorar a latência de inicialização de cargas de trabalho com escalonamento horizontal.
- Gatilho manual: é possível acionar um snapshot sob demanda para um pod específico criando um recurso personalizado PodSnapshotManualTrigger. Esse tipo de gatilho pode ser executado quantas vezes forem necessárias. Essa abordagem é melhor para situações em que não é possível modificar o aplicativo para sinalizar a prontidão.
Correspondência e compatibilidade de snapshots
Para garantir que um snapshot seja compatível com uma carga de trabalho restaurada, o GKE realiza uma correspondência de compatibilidade entre o pod original com checkpoint e o pod de destino.
O GKE usa as seguintes regras para determinar a compatibilidade:
- Ordem de seleção: por padrão, o GKE restaura cargas de trabalho do recurso personalizado PodSnapshot mais recente que corresponde ao namespace e à configuração do pod.
- Critérios de correspondência: a verificação de compatibilidade depende do escopo do snapshot
configurado no recurso personalizado PodSnapshotPolicy (
whole-podourootfs-only).
Correspondência de escopo whole-pod (padrão)
Para políticas com o escopo padrão whole-pod, o GKE verifica
o seguinte:
Hash de especificação destilado: o GKE gera um hash exclusivo com base em campos de ambiente de execução essenciais na especificação do pod. Para que uma restauração seja bem-sucedida, o pod de destino precisa gerar um hash idêntico da especificação destilada. Essa verificação confirma se os pods de checkpoint e restaurados são idênticos nas configurações de ambiente de execução.
Os campos a seguir do objeto do pod fazem parte da especificação destilada e influenciam o hash exclusivo:
metadata:annotations: apenas as anotações relevantes para o GKE Sandbox, como as que começam com o prefixodev.gvisor.*.labels:batch.kubernetes.io/job-completion-index
spec:volumes:name,volumeSource,hostPath,persistentVolumeClaim,configMapcontainers:nameimagecommandargsworkingDirports:name,containerPort,protocolvolumeMounts:name,readOnly,recursiveReadOnly,mountPath,subPath,mountPropagation,subPathExprvolumeDevices:namelifecycle:postStart,preStopterminationMessagePathterminationMessagePolicysecurityContext(e todos os subcampos)stdinstdinOncetty
initContainers: os mesmos subcampos decontainers.dnsPolicyautomountServiceAccountTokenhostNetworkhostPIDhostIPCshareProcessNamespacesecurityContextdnsConfigruntimeClassNameoshostUsers
Compatibilidade de hardware: o pod de destino precisa ser executado em um nó com a mesma série de máquinas, fornecedor de CPU e conjunto de atributos de CPU (flags
CPUID) que o pod com checkpoint. Por exemplo, os dois nós precisam usar a mesma série N2 ou G2 e os mesmos recursos de processador Intel ou AMD. O GKE Sandbox verifica os recursos da CPU antes de restaurar a memória do processo e o estado da CPU. Portanto, um snapshot com o escopowhole-podnão pode ser restaurado em um nó com recursos de CPU diferentes.Compatibilidade de versão: a versão do kernel do GKE Sandbox e a versão do driver da GPU precisam corresponder à versão capturada no snapshot original.
Correspondência de escopo de rootfs-only
Quando você configura a política com o escopo rootfs-only
(disponível no GKE versão 1.35.3-gke.1031000 e posterior), os
requisitos de correspondência são menos rigorosos:
- O GKE não calcula nem compara o hash da especificação do pod destilado. Essa correspondência flexível permite restaurar um snapshot para um pod de destino com diferentes recursos, ambientes ou outros campos de configuração. No entanto, a imagem do contêiner e as versões do nó precisam ser compatíveis.
- Como a memória do processo não é restaurada, é possível restaurar snapshots tirados em uma família de máquinas para outra diferente (incluindo tipos de máquina E2).
Correspondência de regras de agrupamento
Se a política usar o campo snapshotGroupingRules para agrupar snapshots por
valores de rótulo específicos (como locatário ou ambiente), o pod restaurado
precisará ter chaves e valores de rótulo correspondentes. O controlador de snapshot de pod seleciona um
snapshot apenas do grupo correspondente. Para mais informações sobre como configurar
rótulos de agrupamento, consulte Configurar outras políticas de snapshot de pod.
Restauração da prontidão e carregamento em segundo plano
Quando um pod é restaurado de um snapshot, o kernel do GKE Sandbox é restaurado primeiro, o que geralmente leva alguns segundos. Para minimizar a latência de inicialização, o aplicativo é retomado imediatamente após a restauração do kernel. Ele não espera que a memória do aplicativo seja totalmente carregada. A memória do aplicativo é restaurada usando um mecanismo de streaming em segundo plano.
Se o aplicativo tentar ler uma parte da memória que ainda não foi carregada, vai ocorrer uma falha de página. O GKE Sandbox intercepta essa falha, pausa a linha de execução do aplicativo e busca imediatamente a página de memória necessária no armazenamento. Essa busca on demand é priorizada em relação ao stream em segundo plano.
Devido a esse carregamento em segundo plano, o acesso à memória pode apresentar uma breve latência nos primeiros segundos após uma restauração se o aplicativo solicitar memória não transmitida. Essa latência desaparece quando o estado da memória é totalmente sincronizado.
Esse comportamento de carregamento em segundo plano também se aplica ao estado da GPU. Por exemplo, um
pod de modelo de linguagem grande (LLM) pode parecer estar no estado Running e
responder a verificações de rede, mesmo que a memória da GPU ainda esteja sendo preenchida.
O modelo não será totalmente responsivo para inferência até que o estado da GPU seja
completamente restaurado. Devido a esse atraso, ao medir a velocidade de restauração,
verifique se o servidor de modelos está pronto para atender às solicitações.
É possível verificar a prontidão do servidor de modelos usando métricas como o tempo até o primeiro token
(TTFT) ou sondagens de prontidão de pods.
Estado da GPU
Os snapshots de pods permitem capturar o estado das GPUs. Quando você aciona um snapshot
para um pod que usa GPUs, a ferramenta cuda-checkpoint da NVIDIA salva o estado da GPU
na memória do processo. Essa etapa ajuda a garantir que os dados armazenados na GPU,
como pesos de modelo, sejam incluídos no snapshot. O GKE pausa
o pod e cria um snapshot. Durante a restauração, o GKE reverte essa
operação.
Como o estado da GPU é gravado na memória do processo, o uso da memória do pod aumenta durante as operações de snapshot e restauração. Considere esse requisito de memória adicional ao definir limites de memória para os pods.
Considerações sobre pods restaurados
Do ponto de vista da API do Kubernetes, um novo objeto de pod é criado. Quando o pod é iniciado, se houver um snapshot correspondente, o GKE vai restaurar o pod desse snapshot, incluindo a memória original e o estado do processo. No entanto, alguns aspectos do estado do pod precisam mudar para que ele funcione como uma instância nova e exclusiva.
Considere as seguintes mudanças de estado após uma restauração:
- Interfaces de rede: o pod restaurado recebe um novo endereço IP. Todas as interfaces e rotas são reconfiguradas. As conexões de rede ativas que existiam no momento do snapshot são fechadas na restauração. Os soquetes de detecção, as conexões de loopback e as conexões de soquete de domínio Unix continuam funcionando.
- Nome do host: o pod restaurado assume uma nova identidade e recebe um novo nome do host.
- Tempo real decorrido: o tempo real decorrido avança para o horário atual.
- Estado do aplicativo: o estado do aplicativo precisa ser exclusivo para cada pod, como IDs de experimento ou sementes de números aleatórios, e precisa ser reinicializado após uma restauração.
- Secrets: as chaves de criptografia e os certificados criados antes de você criar o snapshot precisam ser recriados.
- Variáveis de ambiente: é possível alterar as variáveis de ambiente entre um
snapshot e uma restauração. No entanto, como as variáveis de ambiente são armazenadas na
memória do aplicativo, o GKE Sandbox não pode encontrá-las e substituí-las de maneira confiável. Se
a carga de trabalho depender de novas variáveis de ambiente após uma restauração, o
pod precisará atualizá-las manualmente. As novas variáveis de ambiente estão disponíveis
no arquivo
/proc/gvisor/spec_environ. O formato do arquivo é o mesmo de/proc/<pid>/environ.
Multilocação e identidade
Os snapshots de pod exigem vinculações manuais do Identity and Access Management (IAM) para que o objeto ServiceAccount do Kubernetes de cada pod use o Cloud Storage. As vinculações manuais do IAM podem levar tempo para serem propagadas, o que pode ser um problema se você precisar criar snapshots imediatamente após a criação de um pod.
Para lidar com atrasos e simplificar o gerenciamento de multilocatários, em vez de
vincular manualmente o IAM a objetos ServiceAccount, use
uma conta de serviço de nó do GKE para criar tokens de curta duração
sob demanda. Para configurar snapshots de pods com essa abordagem, use o campo tokenSource
no recurso personalizado PodSnapshotStorageConfig com um dos
seguintes valores:
podKSA(padrão): usa vinculações manuais do IAM entre o objeto ServiceAccount do pod e o bucket do Cloud Storage.federatedP4SA: usa um token específico do caminho gerado pela conta de serviço do nó.
Requisitos
Para usar os snapshots de pod do GKE, verifique se você atende aos seguintes requisitos:
- Os pods precisam ser executados no GKE Sandbox porque os snapshots de pods dependem do ambiente isolado que o GKE Sandbox oferece.
- Para o escopo de snapshot padrão
whole-pod, o nó em que o pod é restaurado precisa ter a mesma série de máquinas, o mesmo fornecedor de CPU e os mesmos recursos de CPU do nó em que o snapshot foi criado. As cargas de trabalho somente de CPU podem usar qualquer série de máquinas que não seja E2 compatível com o GKE Sandbox e que atenda a esses requisitos de compatibilidade de hardware. Saiba mais em Limitações. - Para usar GPUs com snapshots de pod, você também precisa atender aos seguintes
requisitos:
- Os pods de GPU única são compatíveis com nós de GPU única e de várias GPUs.
- Os pods com várias GPUs são compatíveis apenas com GPUs L4 (tipos de máquina
g2-standard-*). - Nas versões 1.35.0-gke.1738000 e anteriores do GKE, um pod executado em um nó com várias GPUs precisa usar todas as GPUs disponíveis nesse nó. Nas versões 1.35.0-gke.1738000 e posteriores, os pods podem usar um subconjunto das GPUs em um nó.
- Para cargas de trabalho de GPU, use um dos seguintes tipos de máquina de GPU compatíveis:
g2-standard-4(1 x L4)g2-standard-8(1 x L4)g2-standard-12(1 x L4)g2-standard-16(1 x L4)g2-standard-32(1 x L4)g2-standard-48(4 x L4)g2-standard-96(8 x L4)a2-highgpu-1g(1 x A100-40GB)a2-ultragpu-1g(1 x A100-80GB)a3-highgpu-1g(1 x H100-80GB)
Limitações
Os snapshots de pod do GKE têm as seguintes limitações:
- Quando você usa o escopo de snapshot padrão
whole-pod, um snapshot não pode ser restaurado em uma VM do Compute Engine com recursos de CPU (flagsCPUID) diferentes da VM em que o snapshot foi criado:- Os snapshots de pod com o escopo
whole-podnão são compatíveis com a série de máquinas E2 ou outras séries de máquinas que misturam dinamicamente processadores Intel e AMD ou gerações de CPU. Os snapshots do sistema de arquivos (escoporootfs-only) são compatíveis com a série de máquinas E2. - Mesmo dentro da mesma série de máquinas não E2 e do mesmo fornecedor de CPU, o Compute Engine pode provisionar VMs com diferentes plataformas de CPU ou conjuntos de atributos de CPU por VM. Se um pod for programado em um nó com
recursos de CPU incompatíveis, a restauração de um snapshot com o escopo
whole-podvai falhar.
- Os snapshots de pod com o escopo
- Não é possível compartilhar GPUs com GPUs de várias instâncias (MIG).
- O contêiner secundário do driver CSI do Cloud Storage FUSE não é compatível com snapshots de pod.
- Os snapshots de pod não são compatíveis com TPUs.
A seguir
- Saiba como se preparar para snapshots de pods.