Prepárate para las instantáneas de Pods

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

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_VERSION
    

    Reemplaza 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:

    1. 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_LOCATION
      

      Reemplaza 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.
    2. Habilita las instantáneas de Pods en tu clúster:

        gcloud container clusters update CLUSTER_NAME \
            --enable-pod-snapshots \
            --location=CONTROL_PLANE_LOCATION
      

      Reemplaza 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:

  1. 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: DoNotScaleUp
    
  2. Aplica el manifiesto

      kubectl apply -f non-e2-class.yaml
    
  3. En 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_LOCATION
    

    Reemplaza 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:

    1. 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_LOCATION
      

      Reemplaza 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.
    2. Habilita las instantáneas de Pods en tu clúster:

        gcloud beta container clusters update CLUSTER_NAME \
            --enable-pod-snapshots \
            --location=CONTROL_PLANE_LOCATION
      

      Reemplaza 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:

  1. 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_LOCATION
    

    Reemplaza 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.
  2. Para cada Pod, sigue estos pasos:

    1. Crea un objeto ServiceAccount:

      kubectl create serviceaccount SERVICEACCOUNT_NAME \
          --namespace=NAMESPACE
      

      Reemplaza lo siguiente:

      • SERVICEACCOUNT_NAME: Es el nombre de tu objeto ServiceAccount.
      • NAMESPACE: Es el espacio de nombres de tus Pods.
    2. 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:

  1. 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.
  2. Cuando configures el almacenamiento para las instantáneas, establece el valor del campo tokenSource en federatedP4SA.

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:

  1. 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_ID con el ID del proyecto.

  2. 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.
  3. Para cada objeto ServiceAccount que necesite almacenar instantáneas de Pods, sigue estos pasos:

    1. 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).
    2. Otorga al objeto ServiceAccount el rol personalizado podSnapshotGcsReadWriter en 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:

  1. 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 acceso FOLDER_PATH/ dentro del bucket de Cloud Storage BUCKET_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. Usa podKSA (predeterminado) o federatedP4SA para la arquitectura multiusuario.

  2. 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.