Saiba como ativar e configurar snapshots de pods do Google Kubernetes Engine (GKE) no cluster e configurar o Cloud Storage para armazenar os snapshots.
Para mais informações sobre como os snapshots de pods funcionam, consulte Sobre snapshots de pods.
Antes de começar
Antes de começar, verifique se você realizou as tarefas a seguir:
- Ativar a API Google Kubernetes Engine. Ativar a API Google Kubernetes Engine
- Se você quiser usar a Google Cloud CLI para essa tarefa,
instale e, em seguida,
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
Para ativar snapshots de pods, crie ou atualize um cluster com o recurso de snapshot de pods ativado. Para clusters Standard, também é necessário criar ou atualizar um pool de nós para execução no GKE Sandbox. O GKE Sandbox é compatível por padrão com clusters do Autopilot.
Para ativar snapshots de pods em um cluster, conclua um dos procedimentos a seguir, dependendo 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_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 snapshots de pods em um cluster atual, 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.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.
Ative snapshots de pods no cluster:
gcloud container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATION
Os snapshots de pods de escopo
whole-podpadrão não são compatíveis com tipos de máquina E2. No Autopilot, o GKE pode usar tipos de máquina que não oferecem suporte a snapshots de pods. Se você usarwhole-podsnapshots de escopo, para garantir que suas cargas de trabalho sejam executadas em hardware compatível, use uma ComputeClass personalizada para priorizar famílias de máquinas compatíveis. Os snapshots do sistema de arquivos (rootfs-only) oferecem suporte a tipos de máquina E2.
Para criar e usar uma ComputeClass personalizada, 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 à ComputeClass usando o
cloud.google.com/compute-classseletor de nós:spec: nodeSelector: cloud.google.com/compute-class: non-e2-class ...
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_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 snapshots de pods em um cluster atual, 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=NODEPOOL_NAME \ --cluster-version=CLUSTER_VERSION \ --location=CONTROL_PLANE_LOCATIONSubstitua:
CLUSTER_NAME: o nome do cluster.NODEPOOL_NAME: o nome do pool de nós.CLUSTER_VERSION: a versão para atualizar o novo cluster, que precisa ser 1.35.3-gke.1234000 ou mais recente.CONTROL_PLANE_LOCATION: o local do plano de controle do cluster.
Ative snapshots de pods 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, crie ou atualize um pool de nós com o gVisor ativado. Para atualizar um pool de nós, use a flag --sandbox type=gvisor. Para criar um pool de nós com o gVisor 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 as seguintes variáveis:
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 no pool de nós.MACHINE_TYPE: o tipo de máquina a ser usado nos nós.CONTROL_PLANE_LOCATION: o local do plano de controle do cluster.
Para mais informações sobre como usar o gVisor, consulte Isolar cargas de trabalho usando o GKE Sandbox.
Armazenar snapshots
Os snapshots de pods são armazenados em um bucket do Cloud Storage, que contém a memória e (opcionalmente) o estado da GPU. Os snapshots de pods exigem a federação de identidade da carga de trabalho para GKE para ativar e usar a conta de serviço do pod para autenticação no Cloud Storage.
Os snapshots de pods exigem a seguinte configuração para o bucket:
- Namespaces hierárquicos: precisam ser ativados para permitir mais consultas por segundo de leitura e gravação. Os namespaces hierárquicos também exigem que o acesso uniforme no nível do bucket esteja ativado.
- Exclusão reversível: como os snapshots de pods usam uploads compostos paralelos, você deve desativar os recursos de proteção de dados, como a exclusão reversível. Se esses recursos forem deixados 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 o desempenho pode ser afetado se os snapshots forem transferidos entre regiões diferentes.
Para criar o bucket e as permissões necessárias, siga estas etapas:
Criar um bucket do Cloud Storage. O comando a seguir cria um bucket com a configuração necessária:
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
buckets createopções.
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 arquivos de snapshot, conceda um papel do IAM que contenha as permissões correspondentes à Kubernetes ServiceAccount (KSA) usada pelos pods de carga de trabalho ou conceda tokens de curta duração.
Conceder papéis a Kubernetes ServiceAccounts específicas
Receba credenciais para se comunicar com o cluster usando comandos
kubectl:gcloud container clusters get-credentials "CLUSTER_NAME"Para cada pod, siga estas etapas:
Crie uma KSA para cada pod:
kubectl create serviceaccount "KSA_NAME" \ --namespace "NAMESPACE"Substitua:
KSA_NAME: o nome da KSA.NAMESPACE: o namespace dos pods.
Conceda à KSA permissão para acessar o bucket:
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/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.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \ --role="roles/storage.objectUser"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.KSA_NAME: o nome da KSA.
Ativar multilocação usando tokens de curta duração
Como alternativa à concessão de permissões a KSAs 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 KSA, você realiza uma concessão única do papel 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:
Para conceder à conta de serviço do nó permissão para acessar 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"Ao configurar o armazenamento de snapshots, defina o valor do campo
tokenSourcecomofederatedP4SA.
Conceder ao controlador de snapshot de pods acesso ao bucket do Cloud Storage
Para permitir que o controlador de snapshot de pods exclua snapshots dentro do bucket do Cloud Storage, o agente de serviço do GKE precisa receber o papel de usuário de objetos do Storage (roles/storage.objectUser) no projeto. Conceda o papel roles/storage.objectUser executando 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_NUMBER: o número do projeto.PROJECT_ID: o ID do projeto.BUCKET_NAME: o nome do bucket.
(Opcional) Criar pastas gerenciadas para o bucket do Cloud Storage
A criação de pastas permite isolar permissões para snapshots de pods mutuamente não confiáveis, o que é útil em casos de uso multilocatário. 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:
gcloud iam roles create podSnapshotGcsReadWriter \ --project="PROJECT_ID" \ --permissions="storage.objects.get,storage.objects.create,storage.objects.delete,storage.folders.create"Conceda o papel
roles/storage.bucketViewera todas as KSAs no namespace de destino. Esse papel permite que as KSAs leiam metadados de bucket, mas não concede permissões de leitura ou gravação a 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 KSA que precisa armazenar snapshots de pods, siga estas etapas:
Crie uma pasta gerenciada para a KSA:
gcloud storage managed-folders create "gs://BUCKET_NAME/FOLDER_PATH/"Substitua:
BUCKET_NAME: o nome do bucket.FOLDER_PATH: o caminho da pasta gerenciada, por exemplo,my-app-snapshots.
Conceda à KSA o papel personalizado
podSnapshotGcsReadWriterna 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/KSA_NAME" \ --role="projects/PROJECT_ID/roles/podSnapshotGcsReadWriter"Substitua:
BUCKET_NAME: o nome do bucket.FOLDER_PATH: o caminho da 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.KSA_NAME: o nome da KSA.
Configurar o armazenamento de snapshots
Para especificar onde armazenar arquivos de snapshot, crie um recurso PodSnapshotStorageConfig.
O exemplo a seguir configura o GKE para armazenar snapshots de pods no caminho
FOLDER_PATH/dentro do bucket do Cloud Storage BUCKET_NAME. Salve o seguinte manifesto comoexample-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"Substitua:
BUCKET_NAME: o nome do bucket do Cloud Storage.FOLDER_PATH: o caminho da 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.