Las instantáneas de Pods de Google Kubernetes Engine (GKE) te permiten guardar y restablecer los estados de los Pods en ejecución para mejorar la latencia de inicio de las cargas de trabajo. Antes de capturar instantáneas de tus cargas de trabajo, debes preparar el clúster y el entorno de almacenamiento.
Usa este documento para aprender a habilitar y configurar instantáneas de Pods en tu clúster y configurar Cloud Storage para almacenar las instantáneas. 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 clústeres, crear buckets de almacenamiento y configurar permisos de acceso para las instantáneas de Pods. Para obtener más información sobre los roles y las tareas de ejemplo comunes a los 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.
Habilita las instantáneas de Pods
Puedes habilitar las instantáneas de Pods en un clúster nuevo o existente. Las instantáneas de Pods requieren GKE Sandbox y la federación de identidades para cargas de trabajo para GKE. Los clústeres de Autopilot habilitan ambas funciones de forma predeterminada. En el caso de los clústeres de Standard, debes habilitar Workload Identity Federation for GKE en el clúster y configurar un grupo de nodos para que se ejecute en GKE Sandbox.
Para habilitar las instantáneas de Pods en un clúster, sigue los pasos del modo de operación de GKE que quieras usar:
Autopilot
Para habilitar las instantáneas de Pods en un clúster nuevo, ejecuta el siguiente comando:
gcloud container clusters create-auto CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATION \ --cluster-version=CLUSTER_VERSIONReemplaza lo siguiente:
CLUSTER_NAME: Es el nombre de tu clúster.CONTROL_PLANE_LOCATION: Es la ubicación del plano de control de tu clúster.CLUSTER_VERSION: Es la versión de tu clúster nuevo, que debe ser 1.35.3-gke.1234000 o posterior.
Para habilitar las instantáneas de Pods en un clúster existente, sigue estos pasos:
Actualiza el clúster a la versión 1.35.3-gke.1234000 o posterior:
gcloud container clusters upgrade CLUSTER_NAME \ --cluster-version=CLUSTER_VERSION \ --location=CONTROL_PLANE_LOCATIONReemplaza lo siguiente:
CLUSTER_NAME: Es el nombre de tu clúster.CLUSTER_VERSION: Es la versión a la que deseas actualizar el clúster, que debe ser 1.35.3-gke.1234000 o posterior.CONTROL_PLANE_LOCATION: Es la ubicación del plano de control de tu clúster.
Habilita las instantáneas de Pods en tu clúster:
gcloud container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATIONReemplaza lo siguiente:
CLUSTER_NAME: Es el nombre de tu clúster.CONTROL_PLANE_LOCATION: Es la ubicación del plano de control de tu clúster.
Las instantáneas de Pods con el permiso predeterminado whole-pod no admiten tipos de máquinas
E2, mientras que las instantáneas del sistema de archivos (rootfs-only) sí. En
los clústeres de Autopilot, GKE puede programar Pods en nodos E2
de forma predeterminada. Si usas el permiso whole-pod, usa un
recurso personalizado ComputeClass para garantizar que tus cargas de trabajo se ejecuten en
hardware compatible.
Para crear y usar un recurso personalizado de ComputeClass, sigue estos pasos:
Guarda el siguiente manifiesto como
non-e2-class.yaml:apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: non-e2-class spec: priorities: - machineFamily: n2 - machineFamily: c3 activeMigration: optimizeRulePriority: false whenUnsatisfiable: DoNotScaleUpAplica el manifiesto
kubectl apply -f non-e2-class.yamlEn la especificación del Pod, haz referencia al recurso personalizado ComputeClass con el selector de nodos
cloud.google.com/compute-class:spec: nodeSelector: cloud.google.com/compute-class: non-e2-class # Multiple lines are omitted here
Estándar
Para habilitar las instantáneas de Pods en un clúster nuevo, ejecuta el siguiente comando:
gcloud container clusters create CLUSTER_NAME \ --enable-pod-snapshots \ --cluster-version=CLUSTER_VERSION \ --workload-pool=PROJECT_ID.s3ns.svc.id.goog \ --workload-metadata=GKE_METADATA \ --location=CONTROL_PLANE_LOCATIONReemplaza lo siguiente:
CLUSTER_NAME: Es el nombre de tu clúster.CLUSTER_VERSION: Es la versión de tu clúster nuevo, que debe ser 1.35.3-gke.1234000 o posterior.PROJECT_ID: Es el ID del proyecto.CONTROL_PLANE_LOCATION: Es la ubicación del plano de control de tu clúster.
Para habilitar las instantáneas de Pods en un clúster existente, sigue estos pasos:
Actualiza el clúster a la versión 1.35.3-gke.1234000 o posterior:
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=NODE_POOL_NAME \ --cluster-version=CLUSTER_VERSION \ --location=CONTROL_PLANE_LOCATIONReemplaza lo siguiente:
CLUSTER_NAME: Es el nombre de tu clúster.NODE_POOL_NAME: Es el nombre de tu grupo de nodos.CLUSTER_VERSION: Es la versión a la que deseas actualizar el clúster, que debe ser 1.35.3-gke.1234000 o posterior.CONTROL_PLANE_LOCATION: Es la ubicación del plano de control de tu clúster.
Habilita las instantáneas de Pods en tu clúster:
gcloud beta container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATIONReemplaza lo siguiente:
CLUSTER_NAME: Es el nombre de tu clúster.CONTROL_PLANE_LOCATION: Es la ubicación del plano de control de tu clúster.
Para ejecutar Pods en GKE Sandbox en un clúster de Standard, debes
crear o actualizar un grupo de nodos con GKE Sandbox habilitado. Para actualizar un grupo de nodos, usa la marca --sandbox type=gvisor. Para crear un grupo de nodos con
GKE Sandbox habilitado, ejecuta el siguiente comando:
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--node-version=NODE_VERSION \
--machine-type=MACHINE_TYPE \
--location=CONTROL_PLANE_LOCATION \
--image-type=cos_containerd \
--sandbox type=gvisor
Reemplaza lo siguiente:
NODE_POOL_NAME: el nombre de tu grupo de nodos nuevo.CLUSTER_NAME: El nombre de tu clúster.NODE_VERSION: la versión que se usará para el grupo de nodos.MACHINE_TYPE: Es el tipo de máquina que se usará para los nodos.CONTROL_PLANE_LOCATION: Es la ubicación del plano de control de tu clúster.
Para obtener más información sobre GKE Sandbox, consulta Endurece el aislamiento de las cargas de trabajo con GKE Sandbox.
Instantáneas de la tienda
GKE almacena las instantáneas de Pods en un bucket de Cloud Storage. Cada instantánea contiene la memoria de la aplicación y, de forma opcional, el estado de la GPU del Pod. Para autenticarse en Cloud Storage, las instantáneas de Pods usan el objeto ServiceAccount del Pod, que requiere la Workload Identity Federation for GKE.
Las instantáneas de Pods requieren las siguientes configuraciones de bucket:
- Espacios de nombres jerárquicos: Debes habilitar los espacios de nombres jerárquicos para admitir más consultas por segundo de lectura y escritura. Los espacios de nombres jerárquicos también requieren que habilites el acceso uniforme a nivel de bucket.
- Borrado no definitivo: Debido a que las instantáneas de Pods usan cargas compuestas paralelas, inhabilita las funciones de protección de datos, como el borrado no definitivo. Si dejas estas funciones habilitadas, las eliminaciones no definitivas de los objetos temporales pueden aumentar significativamente tu factura de almacenamiento.
- Ubicación: La ubicación del bucket de Cloud Storage debe estar en la misma ubicación que el clúster de GKE, ya que la transferencia de instantáneas entre diferentes regiones puede afectar el rendimiento.
Para crear un bucket con los parámetros de configuración requeridos, ejecuta el siguiente comando:
gcloud storage buckets create gs://BUCKET_NAME \
--uniform-bucket-level-access \
--enable-hierarchical-namespace \
--soft-delete-duration=0d \
--location=LOCATION
Reemplaza lo siguiente:
BUCKET_NAME: Es el nombre de tu bucket.LOCATION: Es la ubicación de tu bucket.
Para obtener una lista completa de las opciones de creación de bucket, consulta
Marcas en la documentación del comando buckets create.
Otorga acceso a las cargas de trabajo al bucket de Cloud Storage
De forma predeterminada, GKE no tiene acceso a Cloud Storage. Para leer y escribir instantáneas de Pods, debes otorgar un rol de IAM que contenga los permisos correspondientes al objeto ServiceAccount de Kubernetes que usan tus Pods de carga de trabajo o habilitar laマルチテナンシー con tokens de corta duración.
Otorga roles a objetos ServiceAccount de Kubernetes específicos
Para otorgar roles a objetos ServiceAccount de Kubernetes específicos, sigue estos pasos:
Para comunicarte con tu clúster con los comandos de
kubectl, obtén credenciales para tu clúster:gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATIONReemplaza lo siguiente:
CLUSTER_NAME: El nombre de tu clúster.CONTROL_PLANE_LOCATION: Es la ubicación del plano de control de tu clúster.
Para cada Pod, sigue estos pasos:
Crea un objeto ServiceAccount:
kubectl create serviceaccount SERVICEACCOUNT_NAME \ --namespace=NAMESPACEReemplaza lo siguiente:
SERVICEACCOUNT_NAME: Es el nombre de tu objeto ServiceAccount.NAMESPACE: Es el espacio de nombres de tus Pods.
Otorga permiso al objeto ServiceAccount para acceder al bucket. Elige una de las siguientes opciones según tus requisitos de seguridad:
- Permisos estándar: otorga acceso completo de lectura, escritura y eliminación.
- Permisos de escritura única: Impide reemplazar o borrar archivos de instantáneas finalizados, pero otorga permiso para borrar objetos temporales para cargas compuestas paralelas.
Para otorgar el permiso, ejecuta los comandos de la opción que seleccionaste:
Permisos estándar
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT_NAME" \ --role="roles/storage.bucketViewer"gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT_NAME" \ --role="roles/storage.objectUser"Permisos de escritura única
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT_NAME" \ --role="roles/storage.bucketViewer"gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT_NAME" \ --role="roles/storage.objectCreator"gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT_NAME" \ --role="roles/storage.objectViewer"gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT_NAME" \ --role="roles/storage.objectUser" \ --condition='expression=resource.type == "storage.googleapis.com/Object" && (resource.name.extract("/pages.img_{part}") != "" || resource.name.extract("/fs_checkpoint_pages.img_{part}") != ""),title=allow_pcu_temp_part_cleanup,description=Allow deleting temporary parallel composite upload part objects only'Reemplaza lo siguiente:
BUCKET_NAME: Es el nombre de tu bucket.PROJECT_NUMBER: Es el número de tu proyecto.PROJECT_ID: Es el ID del proyecto.NAMESPACE: Es el espacio de nombres de tus Pods.SERVICEACCOUNT_NAME: Es el nombre de tu objeto ServiceAccount.
Habilita la función multiusuario con tokens de corta duración
Como alternativa a otorgar permisos a objetos ServiceAccount individuales,
puedes habilitar la multiusuario con tokens de corta duración y alcance restringido. Este enfoque ayuda a evitar la demora de propagación asociada con las vinculaciones de IAM manuales. En lugar de otorgar permisos a cada
objeto ServiceAccount, otorgas una sola vez el
rol de administrador de almacenamiento (roles/storage.admin) en el bucket de almacenamiento de instantáneas
a la cuenta de servicio del nodo de GKE. Luego, la cuenta de servicio de nodo
crea tokens de corta duración a pedido para rutas de acceso específicas.
Para habilitar tokens con instantáneas de Pods, se requiere la versión 1.35.3-gke.1737000 o posterior de GKE.
Para habilitar la función de multiusuario, sigue estos pasos:
Para otorgar a la cuenta de servicio del nodo el permiso de usar el bucket, ejecuta el siguiente comando:
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-gkenode.s3ns-system.iam.gserviceaccount.com" \ --role="roles/storage.admin"Reemplaza lo siguiente:
BUCKET_NAME: Es el nombre de tu bucket.PROJECT_NUMBER: Es el número de tu proyecto.
Cuando configures el almacenamiento para las instantáneas, establece el valor del campo
tokenSourceenfederatedP4SA.
Otorga al controlador de instantáneas del Pod acceso al bucket de Cloud Storage
Para permitir que el controlador de instantáneas de Pod borre instantáneas dentro del
bucket de Cloud Storage, debes otorgar el
rol de usuario de objetos de almacenamiento (roles/storage.objectUser) al
agente de servicio de GKE en el proyecto. Para otorgar el rol, ejecuta el
siguiente comando:
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:service-PROJECT_NUMBER@container-engine-robot.s3ns-system.iam.gserviceaccount.com" \
--role="roles/storage.objectUser" \
--condition="expression=resource.name.startsWith(\"projects/_/buckets/BUCKET_NAME\"),title=restrict_to_bucket,description=Restricts access to one bucket only"
Reemplaza lo siguiente:
PROJECT_ID: Es el ID del proyecto.PROJECT_NUMBER: Es el número de tu proyecto.BUCKET_NAME: Es el nombre de tu bucket.
Opcional: Crea carpetas administradas para el bucket de Cloud Storage
Para aislar los permisos de las instantáneas de Pods que no son de confianza mutua, lo que es útil en casos de uso de múltiples usuarios, crea carpetas administradas. Para configurar carpetas administradas, sigue estos pasos:
Crea un rol de IAM personalizado que contenga solo los permisos necesarios para las instantáneas de Pods. Ejecuta el comando para la opción que seleccionaste:
Permisos estándar
gcloud iam roles create podSnapshotGcsReadWriter \ --project=PROJECT_ID \ --permissions="storage.objects.get,storage.objects.list,storage.objects.create,storage.objects.delete,storage.folders.create"Permisos de escritura única
gcloud iam roles create podSnapshotGcsReadWriter \ --project=PROJECT_ID \ --permissions="storage.objects.get,storage.objects.list,storage.objects.create,storage.folders.create"Reemplaza
PROJECT_IDcon el ID del proyecto.Otorga el rol de visualizador de buckets de almacenamiento (
roles/storage.bucketViewer) a todos los objetos ServiceAccount en el espacio de nombres de destino. Este rol permite que los objetos ServiceAccount lean los metadatos del bucket, pero no les otorga permisos para leer o escribir los objetos en el bucket.gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/namespace/NAMESPACE" \ --role="roles/storage.bucketViewer"Reemplaza lo siguiente:
BUCKET_NAME: Es el nombre de tu bucket.PROJECT_NUMBER: Es el número de tu proyecto.PROJECT_ID: Es el ID del proyecto.NAMESPACE: Es el espacio de nombres de tus Pods.
Para cada objeto ServiceAccount que necesite almacenar instantáneas de Pods, sigue estos pasos:
Crea una carpeta administrada para el objeto ServiceAccount:
gcloud storage managed-folders create gs://BUCKET_NAME/FOLDER_PATH/Reemplaza lo siguiente:
BUCKET_NAME: Es el nombre de tu bucket.FOLDER_PATH: Es la ruta de acceso de la carpeta administrada (por ejemplo,my-app-snapshots).
Otorga al objeto ServiceAccount el rol personalizado
podSnapshotGcsReadWriteren la carpeta administrada. Para otorgar permiso, ejecuta los comandos de la opción que seleccionaste:Permisos estándar
gcloud storage managed-folders add-iam-policy-binding gs://BUCKET_NAME/FOLDER_PATH/ \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT_NAME" \ --role="projects/PROJECT_ID/roles/podSnapshotGcsReadWriter"Permisos de escritura única
gcloud storage managed-folders add-iam-policy-binding gs://BUCKET_NAME/FOLDER_PATH/ \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT_NAME" \ --role="projects/PROJECT_ID/roles/podSnapshotGcsReadWriter"gcloud storage managed-folders add-iam-policy-binding gs://BUCKET_NAME/FOLDER_PATH/ \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT_NAME" \ --role="roles/storage.objectUser" \ --condition='expression=resource.type == "storage.googleapis.com/Object" && (resource.name.extract("/pages.img_{part}") != "" || resource.name.extract("/fs_checkpoint_pages.img_{part}") != ""),title=allow_pcu_temp_part_cleanup,description=Allow deleting temporary parallel composite upload part objects only'Reemplaza lo siguiente:
BUCKET_NAME: Es el nombre de tu bucket.FOLDER_PATH: Es la ruta de acceso de la carpeta administrada (por ejemplo,my-app-snapshots).PROJECT_NUMBER: Es el número de tu proyecto.PROJECT_ID: Es el ID del proyecto.NAMESPACE: Es el espacio de nombres de tus Pods.SERVICEACCOUNT_NAME: Es el nombre de tu objeto ServiceAccount.
Configura el almacenamiento para las instantáneas
Para especificar dónde almacenar las instantáneas de Pods, crea un recurso personalizado PodSnapshotStorageConfig:
Guarda el siguiente manifiesto como
example-pod-snapshot-storage-config.yaml. En este ejemplo, se configura GKE para almacenar instantáneas de Pods en la ruta de accesoFOLDER_PATH/dentro del bucket de Cloud StorageBUCKET_NAME:apiVersion: podsnapshot.gke.io/v1 kind: PodSnapshotStorageConfig metadata: name: example-pod-snapshot-storage-config spec: snapshotStorageConfig: gcs: bucket: "BUCKET_NAME" path: "FOLDER_PATH" tokenSource: "TOKEN_SOURCE"Reemplaza lo siguiente:
BUCKET_NAME: Es el nombre de tu bucket de Cloud Storage.FOLDER_PATH: Es la ruta de acceso a la carpeta administrada de Cloud Storage.TOKEN_SOURCE: Es el proveedor de identidad para el acceso. UsapodKSA(predeterminado) ofederatedP4SApara la arquitectura multiusuario.
Aplica el manifiesto
kubectl apply -f example-pod-snapshot-storage-config.yaml
¿Qué sigue?
Obtén más información para activar una instantánea de Pod.