Preparar para snapshots de pods

Os snapshots de pods do Google Kubernetes Engine (GKE) permitem salvar e restaurar estados de pods em execução para melhorar a latência de inicialização da carga de trabalho. Antes de capturar snapshots das cargas de trabalho, é necessário preparar o cluster e o ambiente de armazenamento.

Use este documento para saber como ativar e configurar snapshots de pods no cluster e configurar o Cloud Storage para armazenar os snapshots. Para mais informações sobre como os snapshots de pods funcionam, consulte Sobre os snapshots de pods do GKE.

Os administradores e operadores da plataforma e os desenvolvedores de aplicativos podem usar este documento para configurar clusters, criar buckets de armazenamento e configurar permissões de acesso para snapshots de pods. Para mais informações sobre os papéis comuns e tarefas de exemplo mencionados no Cloud de Confiance by S3NS conteúdo, consulte Papéis e tarefas de usuário comuns do GKE e tarefas.

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ative a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a Google Cloud CLI para essa tarefa, instale e depois inicialize a CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão mais recente executando o comando gcloud components update. Talvez as versões anteriores da CLI gcloud não sejam compatíveis com a execução dos comandos neste documento.

Ativar snapshots de pods

É possível ativar snapshots de pods em um cluster novo ou atual. Os snapshots de pods exigem o GKE Sandbox e a Federação de Identidade da Carga de Trabalho para GKE. Os clusters do Autopilot ativam os dois recursos por padrão. Para clusters padrão, é necessário ativar a Federação de Identidade da Carga de Trabalho para GKE no cluster e configurar um pool de nós para ser executado no GKE Sandbox.

Para ativar snapshots de pods em um cluster, siga as etapas do modo de operação do GKE que você quer usar:

Autopilot

  • Para ativar snapshots de pods em um novo cluster, execute o seguinte comando:

      gcloud container clusters create-auto CLUSTER_NAME \
          --enable-pod-snapshots \
          --location=CONTROL_PLANE_LOCATION \
          --cluster-version=CLUSTER_VERSION
    

    Substitua:

    • CLUSTER_NAME: o nome do seu cluster.
    • CONTROL_PLANE_LOCATION: o local do plano de controle do cluster.
    • CLUSTER_VERSION: a versão do seu novo cluster, que precisa ser 1.35.3-gke.1234000 ou mais recente.
  • Para ativar snapshots de pods em um cluster atual, siga estas etapas:

    1. Faça upgrade do cluster para a versão 1.35.3-gke.1234000 ou mais recente:

        gcloud container clusters upgrade CLUSTER_NAME \
            --cluster-version=CLUSTER_VERSION \
            --location=CONTROL_PLANE_LOCATION
      

      Substitua:

      • CLUSTER_NAME: o nome do seu cluster.
      • CLUSTER_VERSION: a versão para fazer upgrade do cluster, que precisa ser 1.35.3-gke.1234000 ou mais recente.
      • CONTROL_PLANE_LOCATION: o local do plano de controle do cluster.
    2. Ative snapshots de pods no cluster:

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

      Substitua:

      • CLUSTER_NAME: o nome do seu cluster.
      • CONTROL_PLANE_LOCATION: o local do plano de controle do cluster.

Os snapshots de pods com o escopo whole-pod padrão não são compatíveis com os tipos de máquina E2, enquanto os snapshots do sistema de arquivos (rootfs-only) são. Em clusters do Autopilot, o GKE pode programar pods em nós E2 por padrão. Se você usar o whole-pod escopo, use um recurso personalizado do ComputeClass para garantir que as cargas de trabalho sejam executadas em hardware compatível.

Para criar e usar um recurso personalizado do ComputeClass, siga estas etapas:

  1. Salve o seguinte manifesto 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. Aplique o manifesto:

      kubectl apply -f non-e2-class.yaml
    
  3. Na especificação do pod, referencie o recurso personalizado do ComputeClass usando o cloud.google.com/compute-class seletor de nós:

      spec:
        nodeSelector:
          cloud.google.com/compute-class: non-e2-class
        # Multiple lines are omitted here
    

Padrão

  • Para ativar snapshots de pods em um novo cluster, execute o seguinte 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
    

    Substitua:

    • CLUSTER_NAME: o nome do seu cluster.
    • CLUSTER_VERSION: a versão do seu novo cluster, que precisa ser 1.35.3-gke.1234000 ou mais recente.
    • PROJECT_ID: o ID do projeto.
    • CONTROL_PLANE_LOCATION: o local do plano de controle do cluster.
  • Para ativar snapshots de pods em um cluster atual, siga estas etapas:

    1. Faça upgrade do cluster para a versão 1.35.3-gke.1234000 ou mais recente:

        gcloud container clusters upgrade CLUSTER_NAME \
            --node-pool=NODE_POOL_NAME \
            --cluster-version=CLUSTER_VERSION \
            --location=CONTROL_PLANE_LOCATION
      

      Substitua:

      • CLUSTER_NAME: o nome do seu cluster.
      • NODE_POOL_NAME: o nome do seu pool de nós.
      • CLUSTER_VERSION: a versão para fazer upgrade do cluster, que precisa ser 1.35.3-gke.1234000 ou mais recente.
      • CONTROL_PLANE_LOCATION: o local do plano de controle do cluster.
    2. Ative snapshots de pods no cluster:

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

      Substitua:

      • CLUSTER_NAME: o nome do seu cluster.
      • CONTROL_PLANE_LOCATION: o local do plano de controle do cluster.

Para executar pods no GKE Sandbox em um cluster padrão, é necessário criar ou atualizar um pool de nós com o GKE Sandbox ativado. Para atualizar um pool de nós, use a flag --sandbox type=gvisor. Para criar um pool de nós com o GKE Sandbox ativado, execute o seguinte 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

Substitua:

  • NODE_POOL_NAME: o nome do novo pool de nós.
  • CLUSTER_NAME: o nome do cluster.
  • NODE_VERSION: a versão a ser usada para o pool de nós.
  • MACHINE_TYPE: o tipo de máquina a ser usado para os nós.
  • CONTROL_PLANE_LOCATION: o local do plano de controle do cluster.

Para mais informações sobre o GKE Sandbox, consulte Como aumentar a proteção do isolamento da carga de trabalho com o GKE Sandbox.

Armazenar snapshots

O GKE armazena snapshots de pods em um bucket do Cloud Storage. Cada snapshot contém a memória do aplicativo e, opcionalmente, o estado da GPU do pod. Para autenticar no Cloud Storage, os snapshots de pods usam o objeto ServiceAccount do pod, que exige a Federação de Identidade da Carga de Trabalho para GKE.

Os snapshots de pods exigem as seguintes configurações de bucket:

  • Namespaces hierárquicos: é necessário ativar namespaces hierárquicos para oferecer suporte a consultas por segundo de leitura e gravação mais altas. Os namespaces hierárquicos também exigem que você ative o acesso uniforme no nível do bucket.
  • Exclusão reversível: como os snapshots de pods usam uploads compostos paralelos, desative os recursos de proteção de dados, como a exclusão reversível. Se você deixar esses recursos ativados, as exclusões reversíveis dos objetos temporários poderão aumentar significativamente a fatura de armazenamento.
  • Local: o local do bucket do Cloud Storage precisa estar no mesmo local do cluster do GKE, porque a transferência de snapshots em regiões diferentes pode afetar a performance.

Para criar um bucket com as configurações necessárias, execute o seguinte comando:

gcloud storage buckets create gs://BUCKET_NAME \
    --uniform-bucket-level-access \
    --enable-hierarchical-namespace \
    --soft-delete-duration=0d \
    --location=LOCATION

Substitua:

  • BUCKET_NAME: o nome do bucket.
  • LOCATION: o local do bucket.

Para uma lista completa de opções de criação de buckets, consulte Flags na documentação do comando buckets create.

Conceder acesso de cargas de trabalho ao bucket do Cloud Storage

Por padrão, o GKE não tem acesso ao Cloud Storage. Para ler e gravar snapshots de pods, é necessário conceder um papel do IAM que contenha as permissões correspondentes ao objeto ServiceAccount do Kubernetes que os pods de carga de trabalho usam ou ativar a multilocação usando tokens de curta duração.

Conceder papéis a objetos ServiceAccount específicos do Kubernetes

Para conceder papéis a objetos ServiceAccount específicos do Kubernetes, siga estas etapas:

  1. Para se comunicar com o cluster usando comandos kubectl, receba as credenciais do cluster:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
    

    Substitua:

    • CLUSTER_NAME: o nome do cluster.
    • CONTROL_PLANE_LOCATION: o local do plano de controle do cluster.
  2. Para cada pod, siga estas etapas:

    1. Crie um objeto ServiceAccount:

      kubectl create serviceaccount SERVICEACCOUNT_NAME \
          --namespace=NAMESPACE
      

      Substitua:

      • SERVICEACCOUNT_NAME: o nome do objeto ServiceAccount.
      • NAMESPACE: o namespace dos pods.
    2. Para permitir que o objeto ServiceAccount leia os metadados do bucket, conceda a ele o papel de Leitor de buckets do Storage (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.bucketViewer"
      

      Substitua:

      • BUCKET_NAME: o nome do bucket.
      • PROJECT_NUMBER: o número do projeto.
      • PROJECT_ID: o ID do projeto.
      • NAMESPACE: o namespace dos pods.
      • SERVICEACCOUNT_NAME: o nome do objeto ServiceAccount.
    3. Para permitir que o objeto ServiceAccount leia e grave objetos de snapshot no bucket, conceda a ele o papel de Usuário de objetos do Storage (roles/storage.objectUser):

      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"
      

Ativar multilocação usando tokens de curta duração

Como alternativa à concessão de permissões a objetos ServiceAccount individuais, é possível ativar a multilocação com tokens de curta duração e com escopo restrito. Essa abordagem ajuda a evitar o atraso de propagação associado a vinculações manuais do IAM. Em vez de conceder permissões a cada objeto ServiceAccount, você realiza uma concessão única do papel de Administrador do Storage (roles/storage.admin) no bucket de armazenamento de snapshots para a conta de serviço do nó do GKE. A conta de serviço do nó cria tokens de curta duração sob demanda para caminhos específicos.

A ativação de tokens com snapshots de pods exige a versão 1.35.3-gke.1737000 ou mais recente do GKE.

Para ativar a multilocação, siga estas etapas:

  1. Para conceder à conta de serviço do nó permissão para usar o bucket, execute o seguinte 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"
    

    Substitua:

    • BUCKET_NAME: o nome do bucket.
    • PROJECT_NUMBER: o número do projeto.
  2. Ao configurar o armazenamento para snapshots, defina o valor do tokenSource campo como federatedP4SA.

Conceder ao controlador de snapshots de pods acesso ao bucket do Cloud Storage

Para permitir que o controlador de snapshots de pods exclua snapshots dentro do bucket do Cloud Storage, é necessário conceder o papel de Usuário de objetos do Storage (roles/storage.objectUser) ao agente de serviço do GKE no projeto. Para conceder o papel, execute o seguinte 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"

Substitua:

  • PROJECT_ID: o ID do projeto.
  • PROJECT_NUMBER: o número do projeto.
  • BUCKET_NAME: o nome do bucket.

Opcional: criar pastas gerenciadas para o bucket do Cloud Storage

Para isolar permissões de snapshots de pods não confiáveis mutuamente, o que é útil em casos de uso multilocatário, crie pastas gerenciadas. Para configurar pastas gerenciadas, siga estas etapas:

  1. Crie um papel personalizado do IAM que contenha apenas as permissões necessárias para snapshots de pods:

    gcloud iam roles create podSnapshotGcsReadWriter \
        --project=PROJECT_ID \
        --permissions="storage.objects.get,storage.objects.create,storage.objects.delete,storage.folders.create"
    

    Substitua PROJECT_ID pelo ID do projeto.

  2. Conceda o papel de Leitor de buckets do Storage (roles/storage.bucketViewer) a todos os objetos ServiceAccount no namespace de destino. Esse papel permite que os objetos ServiceAccount leiam metadados de buckets, mas não concedam permissões para ler ou gravar os objetos no 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"
    

    Substitua:

    • BUCKET_NAME: o nome do bucket.
    • PROJECT_NUMBER: o número do projeto.
    • PROJECT_ID: o ID do projeto.
    • NAMESPACE: o namespace dos pods.
  3. Para cada objeto ServiceAccount que precisa armazenar snapshots de pods, siga estas etapas:

    1. Crie uma pasta gerenciada para o objeto ServiceAccount:

      gcloud storage managed-folders create gs://BUCKET_NAME/FOLDER_PATH/
      

      Substitua:

      • BUCKET_NAME: o nome do bucket.
      • FOLDER_PATH: o caminho para a pasta gerenciada (por exemplo, my-app-snapshots).
    2. Conceda ao objeto ServiceAccount o papel personalizado podSnapshotGcsReadWriter na pasta gerenciada:

      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"
      

      Substitua:

      • BUCKET_NAME: o nome do bucket.
      • FOLDER_PATH: o caminho para a pasta gerenciada (por exemplo, my-app-snapshots).
      • PROJECT_NUMBER: o número do projeto.
      • PROJECT_ID: o ID do projeto.
      • NAMESPACE: o namespace dos pods.
      • SERVICEACCOUNT_NAME: o nome do objeto ServiceAccount.

Configurar o armazenamento para snapshots

Para especificar onde armazenar snapshots de pods, crie um recurso personalizado do PodSnapshotStorageConfig:

  1. Salve o seguinte manifesto como example-pod-snapshot-storage-config.yaml. Este exemplo configura o GKE para armazenar snapshots de pods no caminho FOLDER_PATH/ dentro do bucket do 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"
    

    Substitua:

    • BUCKET_NAME: o nome do bucket do Cloud Storage.
    • FOLDER_PATH: o caminho para a pasta gerenciada do Cloud Storage.
    • TOKEN_SOURCE: o provedor de identidade para acesso. Use podKSA (padrão) ou federatedP4SA para multilocação.
  2. Aplique o manifesto:

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

A seguir

Saiba como acionar um snapshot de pod.