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 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.
- 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:
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 etiquetaapp: my-app. La política usa el recurso personalizadoexample-pod-snapshot-storage-configPodSnapshotStorageConfig, 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: resumeReemplaza 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 sonworkloadpara los activadores basados en la carga de trabajo omanualpara las instantáneas a pedido.
En este ejemplo, el parámetro de configuración
postCheckpoint: resumemantiene 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.
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 sonwhole-pod(predeterminado) yrootfs-only. El permisowhole-podcaptura todo el Pod, incluidos el estado de la aplicación, la memoria y los sistemas de archivos. El permisorootfs-onlysolo captura el sistema de archivos raíz del contenedor. El permisorootfs-onlyrequiere 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 campolastAccessTimeout, 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úmenesemptyDir) - 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:
Guarda el siguiente manifiesto como
my-app.yaml. En este ejemplo, la etiquetaapp: my-appcoincide con el selector en la política de instantáneas de ejemplo, y el parámetro de configuraciónruntimeClassName: gvisorejecuta 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:
NAMESPACE: Es el espacio de nombres de tus Pods.SERVICEACCOUNT_NAME: Es el nombre del objeto ServiceAccount al que le otorgaste acceso a Cloud Storage en Prepárate para las instantáneas de Pods.
Implementa la aplicación:
kubectl apply -f my-app.yamlDespué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:
Guarda el siguiente manifiesto como
example-manual-trigger.yaml. En este ejemplo, se activa una instantánea para un Pod llamadomy-pod:apiVersion: podsnapshot.gke.io/v1 kind: PodSnapshotManualTrigger metadata: name: example-manual-trigger namespace: NAMESPACE spec: targetPod: my-podReemplaza
NAMESPACEpor el espacio de nombres de tus Pods.Aplica el manifiesto
kubectl apply -f example-manual-trigger.yamlPara confirmar que la instantánea se activó correctamente, verifica la sección
statusdel recurso personalizado PodSnapshotManualTrigger:kubectl get podsnapshotmanualtriggers.podsnapshot.gke.io \ example-manual-trigger \ --namespace NAMESPACE -o yamlReemplaza
NAMESPACEpor el espacio de nombres de tus Pods.Si el activador se ejecutó correctamente, el campo
status.conditionsmuestra que el punto de control se completó y el campostatus.snapshotCreatedmuestra 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?
- Restablece una carga de trabajo a partir de una instantánea de Pod
- Soluciona problemas de instantáneas de Pods