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 updatepara 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.
- Asegúrate de haber completado los requisitos previos y de haber habilitado las instantáneas de Pods en tu clúster. Para obtener más información, 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 PodSnapshotPolicy con un selector que coincida con las etiquetas del Pod.
En el siguiente ejemplo, se crea una política que se aplica a los Pods con la etiqueta
app: my-appy usa la configuración de almacenamientoexample-pod-snapshot-storage-config. Guarda el siguiente manifiesto 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: resumeReemplaza lo siguiente:
TRIGGER_TYPE: el tipo de activador. Los valores admitidos sonworkloadpara los activadores basados en cargas de trabajo omanualpara 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.
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 sonwhole-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, orootfs-onlypara crear un punto de control solo del sistema de archivos raíz del contenedor. El alcancerootfs-onlyrequiere 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 campolastAccessTimeout(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úmenesemptyDir) - 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:
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.
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.
En el siguiente ejemplo, se activa una instantánea para un Pod llamado
my-pod. Guarda el siguiente manifiesto comoexample-manual-trigger.yaml:apiVersion: podsnapshot.gke.io/v1 kind: PodSnapshotManualTrigger metadata: name: example-manual-trigger namespace: NAMESPACE spec: targetPod: my-podReemplaza
NAMESPACEpor el espacio de nombres de tu Pod.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-appomy-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.