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, é preciso 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 pod funcionam, consulte Sobre os snapshots de pod do GKE.
Os administradores e operadores de 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 as tarefas de exemplo mencionados no conteúdo do Cloud de Confiance by S3NS , consulte Tarefas e papéis de usuário comuns do GKE.
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
- Para usar a Google Cloud CLI nesta tarefa,
instale e 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 pod 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 Standard, é 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 os snapshots de pod em um cluster, siga as etapas do modo de operação do GKE que você quer usar:
Piloto automático
Para ativar os snapshots de pod 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_VERSIONSubstitua:
CLUSTER_NAME: o nome do cluster.CONTROL_PLANE_LOCATION: o local do plano de controle do cluster.CLUSTER_VERSION: a versão do novo cluster, que precisa ser 1.35.3-gke.1234000 ou mais recente.
Para ativar os snapshots de pods em um cluster, siga estas etapas:
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_LOCATIONSubstitua:
CLUSTER_NAME: o nome do cluster.CLUSTER_VERSION: a versão para a qual 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.
Ative os snapshots de pod no cluster:
gcloud container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATIONSubstitua:
CLUSTER_NAME: o nome do cluster.CONTROL_PLANE_LOCATION: o local do plano de controle do cluster.
Os snapshots de pods com o escopo padrão whole-pod não são compatíveis com tipos de máquina E2, mas 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 escopo whole-pod, 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:
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: DoNotScaleUpAplique o manifesto:
kubectl apply -f non-e2-class.yamlNa especificação do pod, faça referência ao recurso personalizado ComputeClass usando o seletor de nós
cloud.google.com/compute-class:spec: nodeSelector: cloud.google.com/compute-class: non-e2-class # Multiple lines are omitted here
Padrão
Para ativar os snapshots de pod 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_LOCATIONSubstitua:
CLUSTER_NAME: o nome do cluster.CLUSTER_VERSION: a versão do 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 os snapshots de pods em um cluster, siga estas etapas:
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_LOCATIONSubstitua:
CLUSTER_NAME: o nome do cluster.NODE_POOL_NAME: o nome do pool de nós.CLUSTER_VERSION: a versão para a qual fazer upgrade do cluster, que precisa ser 1.35.3-gke.1234000 ou posterior.CONTROL_PLANE_LOCATION: o local do plano de controle do cluster.
Ative os snapshots de pod no cluster:
gcloud beta container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATIONSubstitua:
CLUSTER_NAME: o nome do cluster.CONTROL_PLANE_LOCATION: o local do plano de controle do cluster.
Para executar pods no GKE Sandbox em um cluster Standard, é necessário
criar ou atualizar um pool de nós com o GKE Sandbox ativado. Para atualizar um pool de nós, use a sinalização --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 pod usam o objeto ServiceAccount do pod, que requer 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: é preciso ativar os namespaces hierárquicos para oferecer suporte a mais consultas por segundo de leitura e gravação. 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 pod 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 sua fatura de armazenamento.
- Local: o local do bucket do Cloud Storage precisa ser o mesmo do cluster do GKE, porque a transferência de snapshots entre regiões diferentes pode afetar o desempenho.
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 ver uma lista completa de opções de criação de buckets, consulte
Sinalizações na documentação do comando buckets create.
Conceder às cargas de trabalho acesso ao bucket do Cloud Storage
Por padrão, o GKE não tem acesso ao Cloud Storage. Para ler e gravar snapshots de pods, é preciso conceder um papel do IAM que contenha as permissões correspondentes ao objeto ServiceAccount do Kubernetes usado pelos pods de carga de trabalho ou ativar a multilocação usando tokens de curta duração.
Conceder papéis a objetos específicos da conta de serviço do Kubernetes
Para conceder papéis a objetos ServiceAccount específicos do Kubernetes, siga estas etapas:
Para se comunicar com o cluster usando comandos
kubectl, receba as credenciais do cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATIONSubstitua:
CLUSTER_NAME: o nome do cluster.CONTROL_PLANE_LOCATION: o local do plano de controle do cluster.
Para cada pod, siga estas etapas:
Crie um objeto ServiceAccount:
kubectl create serviceaccount SERVICEACCOUNT_NAME \ --namespace=NAMESPACESubstitua:
SERVICEACCOUNT_NAME: o nome do objeto ServiceAccount.NAMESPACE: o namespace dos pods.
Conceda ao objeto ServiceAccount permissão para acessar o bucket. Escolha uma das seguintes opções com base nos seus requisitos de segurança:
- Permissões padrão: concede acesso total de leitura, gravação e exclusão.
- Permissões de gravação única: impede a substituição ou exclusão de arquivos de snapshot finalizados, mas concede permissão para excluir objetos temporários para uploads compostos paralelos.
Para conceder permissão, execute os comandos da opção selecionada:
Permissões padrão
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"Permissões de gravação ú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'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.
Ativar a 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 escopo restrito. Essa
abordagem ajuda a evitar o atraso de propagação associado às vinculações manuais
do IAM. Em vez de conceder permissões a cada
objeto ServiceAccount, você concede uma única vez o
papel de administrador do Storage (roles/storage.admin) no bucket de armazenamento de snapshots
à 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 pod requer o GKE versão 1.35.3-gke.1737000 ou posterior.
Para ativar a multilocação, siga estas etapas:
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.
Ao configurar o armazenamento para snapshots, defina o valor do campo
tokenSourcecomofederatedP4SA.
Conceder ao controlador de snapshot do pod acesso ao bucket do Cloud Storage
Para permitir que o controlador de snapshot de pod exclua snapshots dentro do
bucket do Cloud Storage, conceda 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 as permissões de snapshots de pods que não confiam uns nos outros, o que é útil em casos de uso multilocatário, crie pastas gerenciadas. Para configurar pastas gerenciadas, siga estas etapas:
Crie um papel personalizado do IAM que contenha apenas as permissões necessárias para snapshots de pods. Execute o comando da opção selecionada:
Permissões padrão
gcloud iam roles create podSnapshotGcsReadWriter \ --project=PROJECT_ID \ --permissions="storage.objects.get,storage.objects.list,storage.objects.create,storage.objects.delete,storage.folders.create"Permissões de gravação única
gcloud iam roles create podSnapshotGcsReadWriter \ --project=PROJECT_ID \ --permissions="storage.objects.get,storage.objects.list,storage.objects.create,storage.folders.create"Substitua
PROJECT_IDpelo ID do projeto.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 bucket, mas não concede a eles 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.
Para cada objeto ServiceAccount que precisa armazenar snapshots de pod, siga estas etapas:
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).
Conceda ao objeto ServiceAccount o papel
podSnapshotGcsReadWriterpersonalizado na pasta gerenciada. Para conceder permissão, execute os comandos da opção selecionada:Permissões padrão
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"Permissões de gravação ú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'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 PodSnapshotStorageConfig:
Salve o seguinte manifesto como
example-pod-snapshot-storage-config.yaml. Este exemplo configura o GKE para armazenar snapshots de pods no caminhoFOLDER_PATH/dentro do bucket do 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"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. UsepodKSA(padrão) oufederatedP4SApara multilocação.
Aplique o manifesto:
kubectl apply -f example-pod-snapshot-storage-config.yaml
A seguir
Saiba como acionar um snapshot de pod.