Cómo activar una instantánea de Pod

Para reducir la latencia de inicio de las cargas de trabajo de Google Kubernetes Engine (GKE), puedes tomar una instantánea de un Pod en ejecución y restablecer Pods nuevos a partir de ella. En este documento, se muestra cómo crear una política de instantáneas de Pods y activar una instantánea, ya sea desde tu carga de trabajo o de forma manual. Para obtener más información sobre cómo funcionan las instantáneas de Pods, consulta Acerca de las instantáneas de Pods de GKE.

Los administradores y operadores de la plataforma, y los desarrolladores de aplicaciones pueden usar este documento para configurar políticas de instantáneas y activar instantáneas. Para obtener más información sobre los roles comunes y las tareas de ejemplo a las que se hace referencia en el contenido de Cloud de Confiance by S3NS, consulta Roles y tareas comunes del usuario de 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
  • Para usar Google Cloud CLI en esta tarea, instala y, luego, inicializa la 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.
  • Completa los requisitos previos y habilita las instantáneas de Pods en tu clúster. Para obtener más información sobre cómo preparar el clúster y el almacenamiento, consulta Prepárate para las instantáneas de Pods.

Crea una política de instantáneas

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

  1. Guarda el siguiente manifiesto como example-pod-snapshot-policy.yaml. En este ejemplo, se crea una política que se aplica a los Pods con la etiqueta app: my-app. La política usa el recurso personalizado example-pod-snapshot-storage-config PodSnapshotStorageConfig, que creaste en Prepárate para las instantáneas de Pods, para definir la ubicación de almacenamiento de las instantáneas:

    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:

    • NAMESPACE: Es el espacio de nombres de tus Pods. Usa el mismo espacio de nombres al que le otorgaste acceso a Cloud Storage en Prepárate para las instantáneas de Pods.
    • TRIGGER_TYPE: el tipo de activador. Los valores admitidos son workload para los activadores basados en la carga de trabajo o manual para las instantáneas a pedido.

    En este ejemplo, el parámetro de configuración postCheckpoint: resume mantiene el Pod en ejecución después de que GKE toma la instantánea.

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

  2. Aplica el manifiesto

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

Establece parámetros de configuración adicionales para la política de instantáneas de Pods

El recurso personalizado PodSnapshotPolicy también admite parámetros de configuración opcionales más allá del selector, la configuración de almacenamiento y el activador requeridos. Estos parámetros de configuración adicionales controlan lo que captura cada instantánea, cuánto tiempo GKE conserva las instantáneas y cómo GKE agrupa las instantáneas para los restablecimientos:

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

  • Limpieza automática: Para limpiar automáticamente los recursos personalizados antiguos de PodSnapshot, configura una política de retención con el campo spec.retentionConfig. Puedes especificar una duración con el campo lastAccessTimeout, por ejemplo, 7d. Una vez que transcurre este período, GKE borra la instantánea.

  • Agrupación de instantáneas: Para aislar las instantáneas tomadas en entornos similares, pero en contextos diferentes, especifica etiquetas de agrupación en el campo spec.snapshotGroupingRules. Por ejemplo, en una situación de multiusuario en la que el Pod base es el mismo para todos los usuarios, puedes aislar las instantáneas por usuario o grupo. Durante un restablecimiento, GKE selecciona una instantánea solo 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.

Puedes configurar los parámetros de ubicación, retención y agrupación de las instantáneas de forma independiente. En el siguiente ejemplo, se muestran los tres parámetros de configuración en un recurso personalizado PodSnapshotPolicy:

# Multiple lines are omitted here
spec:
  snapshotScope: rootfs-only
  retentionConfig:
    lastAccessTimeout: 7d
  snapshotGroupingRules:
    groupByLabelValue:
      labels: ["tenant", "environment"]
      groupRetentionPolicy:
        maxSnapshotCountPerGroup: 5

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

Optimiza el tamaño de las instantáneas

Las instantáneas más grandes tardan más en guardarse y restablecerse. Antes de activar una instantánea, reduce su tamaño borrando los archivos temporales o el estado de la aplicación que esta no necesite después de que GKE restablezca el Pod a partir de la instantánea.

Con el alcance de instantánea predeterminado de whole-pod, GKE Sandbox captura todo el estado 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 las activaciones de tmpfs (incluidos los volúmenes emptyDir)
  • Estado del kernel, como descriptores de archivos abiertos, subprocesos y sockets

Optimizar el tamaño de las instantáneas es muy importante para las cargas de trabajo, como los modelos de lenguaje grandes (LLM). Los servidores de LLM suelen descargar los pesos del modelo en el almacenamiento local (rootfs o tmpfs) antes de cargarlos en la GPU. Cuando tomas una instantánea, GKE Sandbox guarda el estado de la GPU y los archivos de pesos del modelo. En esta situación, 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 la aplicación carga los pesos del modelo en la GPU, no suele necesitar los archivos del sistema de archivos para ejecutarse. Si borras estos archivos de modelo antes de activar la instantánea, puedes reducir su tamaño a la mitad y restablecer la aplicación con una latencia mucho menor.

Activa una instantánea

Elige uno de los siguientes métodos para activar una instantánea:

  • Activador de carga de trabajo: Usa este método cuando puedas modificar tu aplicación para indicar que está lista para una instantánea, por ejemplo, después de que se complete la inicialización. Este método es el más adecuado para mejorar la latencia de inicio de las cargas de trabajo con escalamiento horizontal. Un activador de carga de trabajo se ejecuta solo una vez en un ciclo de carga de trabajo.

  • Activador manual: Usa este método cuando no puedas modificar tu aplicación para indicar que está lista o cuando quieras instantáneas a pedido de un Pod específico. Puedes crear un activador manual todas las veces que lo necesites.

Activa una instantánea desde una carga de trabajo

Para activar una instantánea desde el código de la aplicación, configúrala para que envíe un indicador cuando esté lista para una instantánea. Para indicar la preparación, escribe el valor 1 en el archivo /proc/gvisor/checkpoint, por ejemplo, ejecutando el comando echo 1 > /proc/gvisor/checkpoint. La operación de escritura inicia el proceso de instantánea de forma asíncrona y se muestra de inmediato. La lectura desde el mismo descriptor de archivo bloquea el proceso de lectura hasta que se completa la operación de instantánea o restablecimiento, y la carga de trabajo está lista para reanudarse.

Antes de activar una instantánea desde una carga de trabajo, asegúrate de que una política de instantáneas seleccione el Pod. El valor del campo triggerConfig.type en esa política debe establecerse en workload.

El uso exacto varía según la 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 desde esta carga de trabajo de ejemplo, sigue estos pasos:

  1. Guarda el siguiente manifiesto como my-app.yaml. En este ejemplo, la etiqueta app: my-app coincide con el selector en la política de instantáneas de ejemplo, y el parámetro de configuración runtimeClassName: gvisor ejecuta el Pod en GKE Sandbox:

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-app
      namespace: NAMESPACE
      labels:
        app: my-app
    spec:
      serviceAccountName: SERVICEACCOUNT_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 readiness at the 20th count
                trigger_snapshot()
              i += 1
              time.sleep(1)
        resources:
          limits:
            cpu: "500m"
            memory: "512Mi"
          requests:
            cpu: "250m"
            memory: "256Mi"
    

    Reemplaza lo siguiente:

  2. Implementa la aplicación:

    kubectl apply -f my-app.yaml
    

    Después de que la aplicación se inicia y señala que está lista, GKE Sandbox toma la instantánea. Para confirmar que la instantánea se creó correctamente, consulta Verifica las instantáneas.

Activa una instantánea de forma manual

Antes de activar una instantánea de forma manual, asegúrate de que el Pod de destino se esté ejecutando y de que una política de instantáneas seleccione el Pod. El valor del campo triggerConfig.type en esa política debe establecerse en manual.

Para activar de forma manual una instantánea on demand para un Pod específico, crea un recurso personalizado PodSnapshotManualTrigger siguiendo estos pasos:

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

    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 tus Pods.

  2. Aplica el manifiesto

    kubectl apply -f example-manual-trigger.yaml
    
  3. Para confirmar que la instantánea se activó correctamente, verifica la sección status del recurso personalizado PodSnapshotManualTrigger:

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

    Reemplaza NAMESPACE por el espacio de nombres de tus Pods.

    Si el activador se ejecutó correctamente, el campo status.conditions muestra que el punto de control se completó y el campo status.snapshotCreated muestra el nombre del recurso personalizado PodSnapshot creado.

Verifica las instantáneas

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

  • NAMESPACE: Es el espacio de nombres de tus Pods.
  • POD_NAME: es el nombre del Pod.

El resultado es similar a lo siguiente:

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

La columna MESSAGE muestra Successfully checkpointed the pod to PodSnapshot, lo que confirma que GKE guardó el estado del Pod en un recurso personalizado PodSnapshot. Para ver y administrar tus recursos personalizados de PodSnapshot, consulta Administra instantáneas.

¿Qué sigue?