Saiba como criar políticas de snapshot e acionar um snapshot de pod das cargas de trabalho em execução no Google Kubernetes Engine (GKE).
Antes de começar
Antes de começar, verifique se você realizou as tarefas a seguir:
- Ativar a API Google Kubernetes Engine. Ativar a API Google Kubernetes Engine
- Se você quiser usar a Google Cloud CLI para essa tarefa,
instale e, em seguida,
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 você concluiu os pré-requisitos e ativou os snapshots de pod no cluster. Para mais informações, consulte Preparar para snapshots de pod.
Criar uma política de snapshot
Para ativar snapshots de um pod, crie um recurso PodSnapshotPolicy com um seletor que corresponda aos rótulos do pod.
O exemplo a seguir cria uma política que se aplica a pods com o rótulo
app: my-appe usa a configuração de armazenamentoexample-pod-snapshot-storage-config. Salve o seguinte manifesto comoexample-pod-snapshot-policy.yaml:apiVersion: podsnapshot.gke.io/v1 kind: PodSnapshotPolicy metadata: name: example-pod-snapshot-policy namespace: NAMESPACE spec: storageConfigName: example-pod-snapshot-storage-config selector: matchLabels: app: my-app triggerConfig: type: TRIGGER_TYPE postCheckpoint: resumeSubstitua:
TRIGGER_TYPE: o tipo de acionador. Os valores aceitos sãoworkloadpara acionadores baseados em carga de trabalho oumanualpara snapshots sob demanda.NAMESPACE: o namespace dos seus pods.
Para uma lista completa de todos os campos que podem ser configurados, consulte a documentação da definição de recurso personalizado (CRD, na sigla em inglês) do PodSnapshotPolicy.
Aplique o manifesto:
kubectl apply -f example-pod-snapshot-policy.yaml
Configurar outras políticas de snapshot de pod
É possível configurar outras políticas no PodSnapshotPolicy, como as seguintes:
Escopo do snapshot: para especificar quais partes do estado do pod serão capturadas no snapshot, configure o campo
spec.snapshotScope. Os valores aceitos sãowhole-pod(padrão) para fazer o checkpoint de todo o pod, incluindo o estado do aplicativo, a memória e os sistemas de arquivos, ourootfs-onlypara fazer o checkpoint apenas do sistema de arquivos raiz do contêiner. O escoporootfs-onlyrequer a versão 1.35.3-gke.1031000 ou mais recente do GKE.Limpeza automática: para limpar automaticamente os recursos de snapshot de pod antigos, configure uma política de retenção usando o campo
spec.retentionConfig. É possível especificar uma duração usando o campolastAccessTimeout(por exemplo,7d), após o qual o snapshot será excluído.Organizar snapshots: é possível agrupar snapshots logicamente para diferenciar entre snapshots que foram feitos em ambientes semelhantes, mas em contextos diferentes. Por exemplo, em um cenário multitenant em que o pod base é o mesmo para todos os usuários, é possível isolar os snapshots por usuário ou grupo. Para isolar snapshots, especifique rótulos de agrupamento na política usando o campo
snapshotGroupingRules. Quando um pod é restaurado, ele só corresponde a snapshots no mesmo grupo de rótulos. Para mais informações sobre como esse agrupamento afeta a correspondência de compatibilidade durante a restauração, consulte Correspondência de regras de agrupamento.
O exemplo a seguir mostra como configurar as configurações de retenção e agrupamento no PodSnapshotPolicy. Essas configurações podem ser definidas de forma independente:
# ... other fields omitted
spec:
snapshotScope: rootfs-only
retentionConfig:
lastAccessTimeout: 7d
snapshotGroupingRules:
groupByLabelValue:
labels: ["tenant", "environment"]
groupRetentionPolicy:
maxSnapshotCountPerGroup: 5
Para uma lista completa de todos os campos que podem ser configurados, consulte a documentação de referência do PodSnapshotPolicy.
Otimizar o tamanho do snapshot
Quando um snapshot de pod é acionado, o gVisor captura todo o estado de todos os contêineres, incluindo:
- Estado do aplicativo, como memória e registros
- Mudanças no sistema de arquivos raiz e
tmpfs(incluindo volumesemptyDir) - Estado do kernel, como descritores de arquivos abertos, linhas de execução e soquetes
O tamanho do snapshot é determinado por esses fatores. Snapshots maiores levam mais tempo para serem salvos e restaurados. Para otimizar o desempenho, antes de acionar um snapshot, limpe qualquer estado ou arquivo do aplicativo que não seja necessário depois que o pod for restaurado do snapshot.
A otimização do tamanho do snapshot é particularmente importante para cargas de trabalho como modelos de linguagem grandes (LLMs). Os servidores de LLM geralmente fazem o download dos pesos do modelo para o armazenamento local (rootfs ou tmpfs) antes de carregá-los na GPU. Quando um snapshot é feito, o estado da GPU e os arquivos de peso do modelo são salvos. Nesse cenário, se o modelo for de 100 GB, o snapshot resultante será de aproximadamente 200 GB (100 GB de arquivos de modelo, mais 100 GB representando o estado da GPU). Depois que os pesos do modelo são carregados na GPU, os arquivos no sistema de arquivos geralmente não são necessários para que o aplicativo seja executado. Ao excluir esses arquivos de modelo antes de acionar o snapshot, é possível reduzir o tamanho do snapshot pela metade e restaurar o aplicativo com uma latência significativamente menor.
Acionar um snapshot
É possível acionar um snapshot de dentro de uma carga de trabalho quando o aplicativo estiver pronto ou acionar manualmente um snapshot sob demanda para um pod específico.
Acionar um snapshot de uma carga de trabalho
Para acionar um snapshot no código do aplicativo, configure o aplicativo para enviar um sinal quando ele estiver pronto para um snapshot. Para sinalizar
prontidão, grave 1 no arquivo /proc/gvisor/checkpoint, por exemplo
echo 1 > /proc/gvisor/checkpoint. A operação de gravação inicia o processo de snapshot de forma assíncrona e retorna imediatamente. A leitura do mesmo descritor do arquivo vai bloquear o processo de leitura até que o snapshot e a restauração sejam concluídos e a carga de trabalho esteja pronta para ser retomada.
O uso exato vai variar dependendo do aplicativo, mas o exemplo a seguir mostra um acionador de snapshot para um aplicativo Python. Para acionar um snapshot dessa carga de trabalho de exemplo, conclua as etapas a seguir:
Salve o seguinte manifesto como
my-app.yaml:apiVersion: v1 kind: Pod metadata: name: my-app namespace: NAMESPACE labels: app: my-app spec: serviceAccountName: KSA_NAME runtimeClassName: gvisor containers: - name: my-container image: python:3.10-slim command: ["python3", "-c"] args: - | import time def trigger_snapshot(): try: with open("/proc/gvisor/checkpoint", "r+") as f: f.write("1") res = f.read().rstrip() print(f"GKE Pod Snapshot: {res}") except FileNotFoundError: print("GKE Pod Snapshot file does not exist -- Pod Snapshots is disabled") return i = 0 while True: print(f"Count: {i}", flush=True) if (i == 20): #simulate the application being ready to snapshot at 20th count trigger_snapshot() i += 1 time.sleep(1) resources: limits: cpu: "500m" memory: "512Mi" requests: cpu: "250m" memory: "256Mi"Substitua:
NAMESPACE: o namespace dos seus pods.KSA_NAME: o nome da sua KSA.
Implante o aplicativo:
kubectl apply -f my-app.yaml
Acionar um snapshot manualmente
Para acionar manualmente um snapshot sob demanda para um pod específico, crie um recurso PodSnapshotManualTrigger.
O exemplo a seguir aciona um snapshot para um pod chamado
my-pod. Salve o seguinte manifesto comoexample-manual-trigger.yaml:apiVersion: podsnapshot.gke.io/v1 kind: PodSnapshotManualTrigger metadata: name: example-manual-trigger namespace: NAMESPACE spec: targetPod: my-podSubstitua
NAMESPACEpelo namespace do pod.Aplique o manifesto:
kubectl apply -f example-manual-trigger.yaml
Para confirmar se o snapshot foi acionado, verifique o campo status do recurso PodSnapshotManualTrigger:
kubectl get podsnapshotmanualtriggers.podsnapshot.gke.io example-manual-trigger -n NAMESPACE -o yaml
O campo status indica se o acionamento do snapshot foi bem-sucedido ou falhou.
Verificar snapshots
Para confirmar se um snapshot foi feito, verifique o histórico de eventos de eventos GKEPodSnapshotting:
kubectl get events -o \
custom-columns=NAME:involvedObject.name,CREATIONTIME:.metadata.creationTimestamp,REASON:.reason,MESSAGE:.message \
--namespace NAMESPACE \
--field-selector involvedObject.name=POD_NAME,reason=GKEPodSnapshotting
Substitua:
POD_NAME: o nome do pod, por exemplo,my-appoumy-pod.NAMESPACE: o namespace dos seus pods.
A saída será assim:
NAME CREATIONTIME REASON MESSAGE
default/5b449f9c7c-bd7pc 2025-11-05T16:25:11Z GKEPodSnapshotting Successfully checkpointed the pod to PodSnapshot
A seguir
Saiba como restaurar uma carga de trabalho de um snapshot de pod.