Cómo activar una instantánea de Pod

Aprende a crear políticas de instantáneas y a activar una instantánea de Pod de tus cargas de trabajo en ejecución en Google Kubernetes Engine (GKE).

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa the gcloud CLI. Si ya instalaste gcloud CLI, ejecuta el comando gcloud components update para obtener la versión más reciente. Es posible que las versiones anteriores de gcloud CLI no admitan la ejecución de los comandos de este documento.

Crea una política de instantáneas

Para habilitar las instantáneas de un Pod, crea un recurso PodSnapshotPolicy con un selector que coincida con las etiquetas del Pod.

  1. En el siguiente ejemplo, se crea una política que se aplica a los Pods con la etiqueta app: my-app y usa la configuración de almacenamiento example-pod-snapshot-storage-config. Guarda el siguiente manifiesto como example-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: resume
    

    Reemplaza lo siguiente:

    • TRIGGER_TYPE: el tipo de activador. Los valores admitidos son workload para los activadores basados en cargas de trabajo o manual para las instantáneas a pedido.
    • NAMESPACE: el espacio de nombres de tus Pods.

    Para obtener una lista completa de todos los campos que puedes configurar, consulta la documentación de CustomResourceDefinition (CRD) de PodSnapshotPolicy.

  2. Aplica el manifiesto

    kubectl apply -f example-pod-snapshot-policy.yaml
    

Configura políticas adicionales de instantáneas de Pods

Puedes configurar políticas adicionales en tu PodSnapshotPolicy, como las siguientes:

  • Alcance de la instantánea: Para especificar qué partes del estado del Pod se capturarán en la instantánea, configura el campo spec.snapshotScope. Los valores admitidos son whole-pod (predeterminado) para crear un punto de control de todo el Pod, incluido el estado de la aplicación, la memoria y los sistemas de archivos, o rootfs-only para crear un punto de control solo del sistema de archivos raíz del contenedor. El alcance rootfs-only requiere la versión 1.35.3-gke.1031000 de GKE o una posterior.

  • Limpieza automática: Para limpiar automáticamente los recursos de instantáneas de Pods antiguos, configura una política de retención con el campo spec.retentionConfig. Puedes especificar una duración con el campo lastAccessTimeout (por ejemplo, 7d), después de la cual se borra la instantánea.

  • Organizar instantáneas: puedes agrupar las instantáneas de forma lógica para diferenciarlas entre las que se tomaron en entornos similares, pero en contextos diferentes. Por ejemplo, en una situación de múltiples usuarios en la que el Pod base es el mismo para todos los usuarios, puedes aislar las instantáneas por usuario o grupo. Para aislar las instantáneas, especifica las etiquetas de agrupación en la política con el campo snapshotGroupingRules. Cuando se restablece un Pod, solo coincide con las instantáneas dentro del mismo grupo de etiquetas. Para obtener más información sobre cómo esta agrupación afecta la coincidencia de compatibilidad durante el restablecimiento, consulta Coincidencia de reglas de agrupación.

En el siguiente ejemplo, se muestra cómo configurar la retención y la agrupación en tu PodSnapshotPolicy. Estos parámetros se pueden configurar de forma independiente:

# ... other fields omitted
spec:
  snapshotScope: rootfs-only
  retentionConfig:
    lastAccessTimeout: 7d
  snapshotGroupingRules:
    groupByLabelValue:
      labels: ["tenant", "environment"]
      groupRetentionPolicy:
        maxSnapshotCountPerGroup: 5

Para obtener una lista completa de todos los campos que puedes configurar, consulta la documentación de referencia de PodSnapshotPolicy.

Optimiza el tamaño de las instantáneas

Cuando se activa una instantánea de Pod, gVisor captura el estado completo de todos los contenedores, incluidos los siguientes:

  • Estado de la aplicación, como la memoria y los registros
  • Cambios en el sistema de archivos raíz y tmpfs (incluidos los volúmenes emptyDir)
  • Estado del kernel, como descriptores de archivos abiertos, subprocesos y sockets

El tamaño de la instantánea está determinado por estos factores. Las instantáneas más grandes tardan más en guardarse y restablecerse. Para optimizar el rendimiento, antes de activar una instantánea, debes limpiar cualquier estado o archivo de la aplicación que no sea necesario después de que se restablezca el Pod a partir de la instantánea.

Optimizar el tamaño de las instantáneas es especialmente importante para cargas de trabajo como los modelos de lenguaje grandes (LLM). Los servidores LLM suelen descargar los pesos del modelo en el almacenamiento local (rootfs o tmpfs) antes de cargarlos en la GPU. Cuando se toma una instantánea, se guardan el estado de la GPU y los archivos de peso del modelo. En este caso, si el modelo es de 100 GB, la instantánea resultante es de aproximadamente 200 GB (100 GB de archivos de modelo más 100 GB que representan el estado de la GPU). Después de que los pesos del modelo se cargan en la GPU, los archivos del sistema de archivos a menudo no son necesarios para que se ejecute la aplicación. Si borras estos archivos de modelo antes de activar la instantánea, puedes reducir el tamaño de la instantánea a la mitad y restablecer la aplicación con una latencia significativamente menor.

Activa una instantánea

Puedes activar una instantánea desde una carga de trabajo cuando la aplicación esté lista o puedes activar manualmente una instantánea a pedido para un Pod específico.

Activa una instantánea desde una carga de trabajo

Para activar una instantánea desde el código de tu aplicación, configura la aplicación para que envíe una señal cuando esté lista para una instantánea. Para indicar que está lista, escribe 1 en el archivo /proc/gvisor/checkpoint, por ejemplo echo 1 > /proc/gvisor/checkpoint. La operación de escritura inicia el proceso de instantánea de forma asíncrona y muestra los resultados de inmediato. La lectura del mismo descriptor de archivo bloqueará el proceso de lectura hasta que se completen la instantánea y el restablecimiento, y la carga de trabajo esté lista para reanudarse.

El uso exacto variará según tu aplicación, pero en el siguiente ejemplo, se muestra un activador de instantáneas para una aplicación de Python. Para activar una instantánea de esta carga de trabajo de ejemplo, completa los siguientes pasos:

  1. Guarda el siguiente manifiesto 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"
    

    Reemplaza lo siguiente:

    • NAMESPACE: el espacio de nombres de tus Pods.
    • KSA_NAME: el nombre de tu KSA.
  2. Implementa la aplicación:

    kubectl apply -f my-app.yaml
    

Activa una instantánea de forma manual

Para activar manualmente una instantánea a pedido para un Pod específico, crea un recurso PodSnapshotManualTrigger.

  1. En el siguiente ejemplo, se activa una instantánea para un Pod llamado my-pod. Guarda el siguiente manifiesto como example-manual-trigger.yaml:

    apiVersion: podsnapshot.gke.io/v1
    kind: PodSnapshotManualTrigger
    metadata:
      name: example-manual-trigger
      namespace: NAMESPACE
    spec:
      targetPod: my-pod
    

    Reemplaza NAMESPACE por el espacio de nombres de tu Pod.

  2. Aplica el manifiesto

    kubectl apply -f example-manual-trigger.yaml
    

Para confirmar si la instantánea se activó correctamente, verifica el campo status del recurso PodSnapshotManualTrigger:

kubectl get podsnapshotmanualtriggers.podsnapshot.gke.io example-manual-trigger -n NAMESPACE -o yaml

El campo status indica si la activación de la instantánea se realizó correctamente o no.

Verifica las instantáneas

Para confirmar que se tomó una instantánea, verifica el historial de eventos de los 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

Reemplaza lo siguiente:

  • POD_NAME: el nombre de tu Pod, por ejemplo, my-app o my-pod.
  • NAMESPACE: el espacio de nombres de tus Pods.

El resultado se ve de la manera siguiente:

NAME                                    CREATIONTIME           REASON               MESSAGE
default/5b449f9c7c-bd7pc                2025-11-05T16:25:11Z   GKEPodSnapshotting   Successfully checkpointed the pod to PodSnapshot

¿Qué sigue?

Aprende a restablecer una carga de trabajo a partir de una instantánea de Pod.