Prepárate para las instantáneas de Pods

Aprende a habilitar y configurar las instantáneas de Pods de Google Kubernetes Engine (GKE) en tu clúster y configura 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.

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

Para habilitar las instantáneas de Pods, crea o actualiza un clúster con la función de instantáneas de Pods habilitada. En el caso de los clústeres Estándar, también debes crear o actualizar un grupo de nodos para que se ejecute en GKE Sandbox. GKE Sandbox es compatible de forma predeterminada con los clústeres de Autopilot.

Para habilitar las instantáneas de Pods en un clúster, completa uno de los siguientes procedimientos, según el 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: El nombre de tu clúster.
    • CONTROL_PLANE_LOCATION: La ubicación del plano de control de tu clúster.
    • CLUSTER_VERSION: 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, completa los siguientes 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: El nombre de tu clúster.
      • CONTROL_PLANE_LOCATION: La ubicación del plano de control de tu clúster.
      • CLUSTER_VERSION: La versión de tu clúster nuevo, que debe ser 1.35.3-gke.1234000 o posterior.
    2. Habilita las instantáneas de Pods en tu clúster:

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

    Las instantáneas de Pods predeterminadas de alcance whole-pod no admiten tipos de máquinas E2. En Autopilot, es posible que GKE use de forma predeterminada tipos de máquinas que no admitan instantáneas de Pods. Si usas whole-pod instantáneas de alcance, para asegurarte de que tus cargas de trabajo se ejecuten en hardware compatible, debes usar una ComputeClass personalizada para priorizar familias de máquinas compatibles. Las instantáneas del sistema de archivos (rootfs-only) admiten tipos de máquinas E2.

Para crear y usar una ComputeClass personalizada, completa los siguientes 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 a ComputeClass con el cloud.google.com/compute-class selector de nodos:

      spec:
        nodeSelector:
          cloud.google.com/compute-class: non-e2-class
        ...
    

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.svc.id.goog \
          --workload-metadata=GKE_METADATA \
          --location=CONTROL_PLANE_LOCATION
    

    Reemplaza lo siguiente:

    • CLUSTER_NAME: El nombre de tu clúster.
    • CLUSTER_VERSION: La versión de tu clúster nuevo, que debe ser 1.35.3-gke.1234000 o posterior.
    • PROJECT_ID: ID del proyecto
    • CONTROL_PLANE_LOCATION: La ubicación del plano de control de tu clúster.
  • Para habilitar las instantáneas de Pods en un clúster existente, completa los siguientes 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=NODEPOOL_NAME \
            --cluster-version=CLUSTER_VERSION \
            --location=CONTROL_PLANE_LOCATION
      

      Reemplaza lo siguiente:

      • CLUSTER_NAME: El nombre de tu clúster.
      • NODEPOOL_NAME: Es el nombre de tu grupo de nodos.
      • CLUSTER_VERSION: La versión para actualizar tu clúster nuevo, que debe ser 1.35.3-gke.1234000 o posterior.
      • CONTROL_PLANE_LOCATION: 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: El nombre de tu clúster.
      • CONTROL_PLANE_LOCATION: La ubicación del plano de control de tu clúster.

Para ejecutar Pods en GKE Sandbox en un clúster Estándar, crea o actualiza un grupo de nodos con gVisor habilitado. Para actualizar un grupo de nodos, usa la marca --sandbox type=gvisor. Para crear un grupo de nodos con gVisor 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 las siguientes variables:

  • NODE_POOL_NAME: es el nombre de tu grupo de nodos nuevo.
  • CLUSTER_NAME: El nombre de tu clúster.
  • NODE_VERSION: Es la versión que se usará para el grupo de nodos.
  • MACHINE_TYPE: el tipo de máquina que se usará para los nodos.
  • CONTROL_PLANE_LOCATION: La ubicación del plano de control de tu clúster.

Para obtener más información sobre el uso de gVisor, consulta Aísla tus cargas de trabajo con GKE Sandbox.

Almacena instantáneas

Las instantáneas de Pods se almacenan en un bucket de Cloud Storage, que contiene la memoria y el estado de la GPU (opcional). Las instantáneas de Pods requieren Workload Identity Federation for GKE para habilitar y usar la cuenta de servicio del Pod para autenticarse en Cloud Storage.

Las instantáneas de Pods requieren la siguiente configuración para el bucket:

  • Espacios de nombres jerárquicos: Deben estar habilitados para permitir más consultas de lectura y escritura por segundo. Los espacios de nombres jerárquicos también requieren que se habilite el acceso uniforme a nivel de bucket.
  • Eliminación temporal: Debido a que las instantáneas de Pods usan cargas compuestas paralelas, debes inhabilitar las funciones de protección de datos, como la eliminación temporal. Si estas funciones permanecen habilitadas, las eliminaciones temporales de los objetos temporales pueden aumentar significativamente tu factura de almacenamiento.
  • Ubicación: La ubicación del bucket de Cloud Storage debe ser la misma que la del clúster de GKE, ya que el rendimiento puede verse afectado si las instantáneas se transfieren entre diferentes regiones.

Para crear el bucket y los permisos necesarios, completa los siguientes pasos:

  1. Crea un bucket de Cloud Storage. El siguiente comando crea un bucket con la configuración requerida:

    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 para la creación de bucket, consulta las buckets create opciones.

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 archivos de instantáneas, debes otorgar un rol de IAM que contenga los permisos correspondientes a la Kubernetes ServiceAccount (KSA) que usan tus Pods de carga de trabajo o otorgar tokens de corta duración.

Otorga roles a Kubernetes ServiceAccounts específicas

  1. Obtén credenciales para poder comunicarte con tu clúster con comandos kubectl:

    gcloud container clusters get-credentials "CLUSTER_NAME"
    
  2. Para cada Pod, completa los siguientes pasos:

    1. Crea una KSA para cada Pod:

      kubectl create serviceaccount "KSA_NAME" \
          --namespace "NAMESPACE"
      

      Reemplaza lo siguiente:

      • KSA_NAME: Es el nombre de tu KSA.
      • NAMESPACE: Es el espacio de nombres de tus Pods.
    2. Otorga permiso a la KSA para acceder al bucket:

      gcloud storage buckets add-iam-policy-binding "gs://BUCKET_NAME" \
          --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_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.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
          --role="roles/storage.objectUser"
      

      Reemplaza lo siguiente:

      • BUCKET_NAME: Es el nombre de tu bucket.
      • PROJECT_NUMBER: Es el número de tu proyecto.
      • PROJECT_ID: ID del proyecto
      • NAMESPACE: Es el espacio de nombres de tus Pods.
      • KSA_NAME: Es el nombre de tu KSA.

Habilita la función multiusuario con tokens de corta duración

Como alternativa a otorgar permisos a KSAs individuales, puedes habilitar la función multiusuario con tokens de corta duración y de alcance restringido. Este enfoque ayuda a evitar la demora de propagación asociada con las vinculaciones manuales de IAM. En lugar de otorgar permisos a cada KSA, realizas una concesión única del rol 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 del 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 de GKE o una posterior.

Para habilitar la función multiusuario, completa los siguientes pasos:

  1. Para otorgarle a la cuenta de servicio del nodo permiso para acceder al bucket, ejecuta el siguiente comando:

    gcloud storage buckets add-iam-policy-binding "gs://BUCKET_NAME" \
        --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-gkenode.iam.gserviceaccount.com" \
        --role="roles/storage.admin"
    
  2. Cuando configures el almacenamiento para instantáneas, establece el valor del campo tokenSource en federatedP4SA.

Otorga acceso al controlador de instantáneas de Pods al bucket de Cloud Storage

Para permitir que el controlador de instantáneas de Pods borre instantáneas dentro del bucket de Cloud Storage, se debe otorgar al agente de servicio de GKE el rol de usuario de objetos de almacenamiento (roles/storage.objectUser) en el proyecto. Para otorgar el rol roles/storage.objectUser, ejecuta el siguiente comando:

gcloud projects add-iam-policy-binding "PROJECT_ID" \
  --member="serviceAccount:service-PROJECT_NUMBER@container-engine-robot.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_NUMBER: Es el número de tu proyecto.
  • PROJECT_ID: ID del proyecto
  • BUCKET_NAME: Es el nombre de tu bucket.

(Opcional) Crea carpetas administradas para el bucket de Cloud Storage

La creación de carpetas te permite aislar los permisos para las instantáneas de Pods que no son de confianza mutua, lo que es útil en casos de uso multiusuario. Para configurar carpetas administradas, completa los siguientes pasos:

  1. Crea un rol personalizado de IAM que contenga solo los permisos necesarios para las instantáneas de Pods:

    gcloud iam roles create podSnapshotGcsReadWriter \
        --project="PROJECT_ID" \
        --permissions="storage.objects.get,storage.objects.create,storage.objects.delete,storage.folders.create"
    
  2. Otorga el rol roles/storage.bucketViewer a todas las KSAs en el espacio de nombres de destino. Este rol permite que las KSAs lean metadatos de buckets, pero no otorga permisos de lectura o escritura a los objetos del bucket.

    gcloud storage buckets add-iam-policy-binding "gs://BUCKET_NAME" \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.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: ID del proyecto
    • NAMESPACE: Es el espacio de nombres de tus Pods.
  3. Para cada KSA que necesite almacenar instantáneas de Pods, completa los siguientes pasos:

    1. Crea una carpeta administrada para la KSA:

      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 a la carpeta administrada, por ejemplo, my-app-snapshots.
    2. Otorga a la KSA el rol personalizado podSnapshotGcsReadWriter en la carpeta administrada:

      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.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
          --role="projects/PROJECT_ID/roles/podSnapshotGcsReadWriter"
      

      Reemplaza lo siguiente:

      • BUCKET_NAME: Es el nombre de tu bucket.
      • FOLDER_PATH: Es la ruta de acceso a la carpeta administrada, por ejemplo, my-app-snapshots.
      • PROJECT_NUMBER: Es el número de tu proyecto.
      • PROJECT_ID: ID del proyecto
      • NAMESPACE: Es el espacio de nombres de tus Pods.
      • KSA_NAME: Es el nombre de tu KSA.

Configura el almacenamiento para instantáneas

Para especificar dónde almacenar los archivos de instantáneas, crea un recurso PodSnapshotStorageConfig.

  1. En el siguiente 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. Guarda el siguiente manifiesto como example-pod-snapshot-storage-config:

    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 función multiusuario.
  2. Aplica el manifiesto

    kubectl apply -f example-pod-snapshot-storage-config.yaml
    

¿Qué sigue?