Gli snapshot dei pod di Google Kubernetes Engine (GKE) ti consentono di salvare e ripristinare gli stati dei pod in esecuzione per migliorare la latenza di avvio del workload. Prima di poter acquisire snapshot dei tuoi workload, devi preparare il cluster e l'ambiente di archiviazione.
Utilizza questo documento per scoprire come attivare e configurare gli snapshot dei pod sul tuo cluster e configurare Cloud Storage per archiviare gli snapshot. Per saperne di più su come funzionano gli snapshot dei pod, consulta Informazioni sugli snapshot dei pod GKE.
Gli amministratori e gli operatori della piattaforma e gli sviluppatori di applicazioni possono utilizzare questo documento per configurare i cluster, creare bucket di archiviazione e impostare le autorizzazioni di accesso per gli snapshot dei pod. Per saperne di più sui ruoli comuni e sulle attività di esempio a cui si fa riferimento nei contenuti di Google Cloud , consulta Ruoli e attività comuni degli utenti GKE.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti attività:
- Abilita l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Per utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializza
gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima
versione eseguendo il comando
gcloud components update. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
Abilita snapshot dei pod
Puoi abilitare gli snapshot dei pod su un cluster nuovo o esistente. Gli snapshot dei pod richiedono GKE Sandbox e Workload Identity Federation for GKE. I cluster Autopilot abilitano entrambe le funzionalità per impostazione predefinita. Per i cluster Standard, devi abilitare Workload Identity Federation for GKE sul cluster e configurare un pool di nodi per l'esecuzione in GKE Sandbox.
Per abilitare gli snapshot dei pod su un cluster, segui i passaggi per la modalità operativa di GKE che vuoi utilizzare:
Autopilot
Per abilitare gli snapshot dei pod su un nuovo cluster, esegui questo comando:
gcloud container clusters create-auto CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATION \ --cluster-version=CLUSTER_VERSIONSostituisci quanto segue:
CLUSTER_NAME: il nome del tuo cluster.CONTROL_PLANE_LOCATION: la località del control plane del tuo cluster.CLUSTER_VERSION: la versione del nuovo cluster, che deve essere 1.35.3-gke.1234000 o successiva.
Per abilitare gli snapshot dei pod su un cluster esistente, segui questi passaggi:
Esegui l'upgrade del cluster alla versione 1.35.3-gke.1234000 o successiva:
gcloud container clusters upgrade CLUSTER_NAME \ --cluster-version=CLUSTER_VERSION \ --location=CONTROL_PLANE_LOCATIONSostituisci quanto segue:
CLUSTER_NAME: il nome del tuo cluster.CLUSTER_VERSION: la versione a cui eseguire l'upgrade del cluster, che deve essere 1.35.3-gke.1234000 o successiva.CONTROL_PLANE_LOCATION: la località del control plane del tuo cluster.
Abilita gli snapshot dei pod sul tuo cluster:
gcloud container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATIONSostituisci quanto segue:
CLUSTER_NAME: il nome del tuo cluster.CONTROL_PLANE_LOCATION: la località del control plane del tuo cluster.
Gli snapshot dei pod con l'ambito predefinito whole-pod non supportano i tipi di macchina E2, mentre gli snapshot del file system (rootfs-only) sì. Nei cluster Autopilot, GKE potrebbe pianificare i pod sui nodi E2 per impostazione predefinita. Se utilizzi l'ambito whole-pod, utilizza una
risorsa personalizzata ComputeClass per assicurarti che i workload vengano eseguiti su
hardware compatibile.
Per creare e utilizzare una risorsa personalizzata ComputeClass, segui questi passaggi:
Salva il seguente manifest come
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: DoNotScaleUpApplica il manifest:
kubectl apply -f non-e2-class.yamlNella specifica del pod, fai riferimento alla risorsa personalizzata ComputeClass utilizzando il selettore di nodi
cloud.google.com/compute-class:spec: nodeSelector: cloud.google.com/compute-class: non-e2-class # Multiple lines are omitted here
Standard
Per abilitare gli snapshot dei pod su un nuovo cluster, esegui questo 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_LOCATIONSostituisci quanto segue:
CLUSTER_NAME: il nome del tuo cluster.CLUSTER_VERSION: la versione del nuovo cluster, che deve essere 1.35.3-gke.1234000 o successiva.PROJECT_ID: il tuo ID progetto.CONTROL_PLANE_LOCATION: la località del control plane del tuo cluster.
Per abilitare gli snapshot dei pod su un cluster esistente, segui questi passaggi:
Esegui l'upgrade del cluster alla versione 1.35.3-gke.1234000 o successiva:
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=NODE_POOL_NAME \ --cluster-version=CLUSTER_VERSION \ --location=CONTROL_PLANE_LOCATIONSostituisci quanto segue:
CLUSTER_NAME: il nome del tuo cluster.NODE_POOL_NAME: il nome del tuo pool di nodi.CLUSTER_VERSION: la versione a cui eseguire l'upgrade del cluster, che deve essere 1.35.3-gke.1234000 o successiva.CONTROL_PLANE_LOCATION: la località del control plane del tuo cluster.
Abilita gli snapshot dei pod sul tuo cluster:
gcloud beta container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATIONSostituisci quanto segue:
CLUSTER_NAME: il nome del tuo cluster.CONTROL_PLANE_LOCATION: la località del control plane del tuo cluster.
Per eseguire i pod in GKE Sandbox su un cluster Standard, devi creare o aggiornare un pool di nodi con GKE Sandbox abilitato. Per aggiornare un node pool, utilizza il flag --sandbox type=gvisor. Per creare un pool di nodi con GKE Sandbox abilitato, esegui questo 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
Sostituisci quanto segue:
NODE_POOL_NAME: il nome del nuovo node pool.CLUSTER_NAME: il nome del tuo cluster.NODE_VERSION: la versione da utilizzare per il pool di nodi.MACHINE_TYPE: il tipo di macchina da utilizzare per i nodi.CONTROL_PLANE_LOCATION: la località del control plane del tuo cluster.
Per saperne di più su GKE Sandbox, consulta Rafforza l'isolamento dei workload con GKE Sandbox.
Archivia gli snapshot
GKE archivia gli snapshot dei pod in un bucket Cloud Storage. Ogni snapshot contiene la memoria dell'applicazione e, facoltativamente, lo stato della GPU del pod. Per l'autenticazione in Cloud Storage, gli snapshot dei pod utilizzano l'oggetto ServiceAccount del pod, che richiede Workload Identity Federation for GKE.
Gli snapshot dei pod richiedono le seguenti configurazioni dei bucket:
- Spazi dei nomi gerarchici: devi abilitare gli spazi dei nomi gerarchici per supportare un numero maggiore di query di lettura e scrittura al secondo. Gli spazi dei nomi gerarchici richiedono inoltre l'abilitazione dell'accesso uniforme a livello di bucket.
- Eliminazione temporanea: poiché gli snapshot dei pod utilizzano i caricamenti compositi paralleli, disattiva le funzionalità di protezione dei dati come l'eliminazione temporanea. Se lasci abilitate queste funzionalità, le eliminazioni temporanee degli oggetti temporanei possono aumentare in modo significativo la fattura per lo spazio di archiviazione.
- Località: la località del bucket Cloud Storage deve trovarsi nella stessa località del cluster GKE, perché il trasferimento degli snapshot tra regioni diverse potrebbe influire sulle prestazioni.
Per creare un bucket con le configurazioni richieste, esegui questo comando:
gcloud storage buckets create gs://BUCKET_NAME \
--uniform-bucket-level-access \
--enable-hierarchical-namespace \
--soft-delete-duration=0d \
--location=LOCATION
Sostituisci quanto segue:
BUCKET_NAME: il nome del bucket.LOCATION: la località del bucket.
Per un elenco completo delle opzioni per la creazione dei bucket, consulta Flag nella documentazione del comando buckets create.
Concedi ai workload l'accesso al bucket Cloud Storage
Per impostazione predefinita, GKE non ha accesso a Cloud Storage. Per leggere e scrivere snapshot dei pod, devi concedere un ruolo IAM che contenga le autorizzazioni corrispondenti all'oggetto ServiceAccount Kubernetes utilizzato dai pod del workload o abilitare la multi-tenancy utilizzando token di breve durata.
Concedi ruoli a oggetti ServiceAccount Kubernetes specifici
Per concedere ruoli a oggetti ServiceAccount Kubernetes specifici, segui questi passaggi:
Per comunicare con il tuo cluster utilizzando i comandi
kubectl, ottieni le credenziali per il tuo cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATIONSostituisci quanto segue:
CLUSTER_NAME: il nome del tuo cluster.CONTROL_PLANE_LOCATION: la località del control plane del tuo cluster.
Per ogni pod, segui questi passaggi:
Crea un oggetto ServiceAccount:
kubectl create serviceaccount SERVICEACCOUNT_NAME \ --namespace=NAMESPACESostituisci quanto segue:
SERVICEACCOUNT_NAME: il nome dell'oggetto ServiceAccount.NAMESPACE: lo spazio dei nomi dei pod.
Concedi all'oggetto ServiceAccount l'autorizzazione per accedere al bucket. Scegli una delle seguenti opzioni in base ai tuoi requisiti di sicurezza:
- Autorizzazioni standard: concede l'accesso completo in lettura, scrittura ed eliminazione.
- Autorizzazioni di scrittura singola: impediscono la sovrascrittura o l'eliminazione dei file di snapshot finalizzati, ma concedono l'autorizzazione per eliminare gli oggetti temporanei per i caricamenti compositi paralleli.
Per concedere l'autorizzazione, esegui i comandi per l'opzione selezionata:
Autorizzazioni standard
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/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.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT_NAME" \ --role="roles/storage.objectUser"Autorizzazioni di scrittura singola
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/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.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.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.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'Sostituisci quanto segue:
BUCKET_NAME: il nome del bucket.PROJECT_NUMBER: il numero del progetto.PROJECT_ID: il tuo ID progetto.NAMESPACE: lo spazio dei nomi dei pod.SERVICEACCOUNT_NAME: il nome dell'oggetto ServiceAccount.
Abilita la multitenancy utilizzando token di breve durata
In alternativa alla concessione delle autorizzazioni a singoli oggetti ServiceAccount, puoi attivare la multitenancy con token di breve durata e con ambito limitato. Questo approccio consente di evitare il ritardo di propagazione associato alle associazioni IAM manuali. Anziché concedere le autorizzazioni a ogni oggetto ServiceAccount, concedi una sola volta il ruolo Storage Admin (roles/storage.admin) nel bucket di archiviazione degli snapshot al account di servizio del nodo GKE. Il account di servizio del nodo crea quindi token di breve durata on demand per percorsi specifici.
L'attivazione dei token con gli snapshot dei pod richiede GKE versione 1.35.3-gke.1737000 o successive.
Per attivare la multitenancy, segui questi passaggi:
Per concedere al account di servizio del nodo l'autorizzazione per utilizzare il bucket, esegui questo 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"Sostituisci quanto segue:
BUCKET_NAME: il nome del bucket.PROJECT_NUMBER: il numero del progetto.
Quando configuri lo spazio di archiviazione per gli snapshot, imposta il valore del campo
tokenSourcesufederatedP4SA.
Concedi al controller di snapshot dei pod l'accesso al bucket Cloud Storage
Per consentire al controller di snapshot dei pod di eliminare gli snapshot all'interno del bucket Cloud Storage, devi concedere il ruolo Storage Object User (roles/storage.objectUser) all'agente di servizio GKE nel progetto. Per concedere il ruolo, esegui questo 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"
Sostituisci quanto segue:
PROJECT_ID: il tuo ID progetto.PROJECT_NUMBER: il numero del progetto.BUCKET_NAME: il nome del bucket.
(Facoltativo) Crea cartelle gestite per il bucket Cloud Storage
Per isolare le autorizzazioni per gli snapshot da pod non attendibili tra loro, il che è utile nei casi d'uso multi-tenant, crea cartelle gestite. Per configurare le cartelle gestite, segui questi passaggi:
Crea un ruolo IAM personalizzato che contenga solo le autorizzazioni necessarie per gli snapshot dei pod. Esegui il comando per l'opzione selezionata:
Autorizzazioni standard
gcloud iam roles create podSnapshotGcsReadWriter \ --project=PROJECT_ID \ --permissions="storage.objects.get,storage.objects.list,storage.objects.create,storage.objects.delete,storage.folders.create"Autorizzazioni di scrittura singola
gcloud iam roles create podSnapshotGcsReadWriter \ --project=PROJECT_ID \ --permissions="storage.objects.get,storage.objects.list,storage.objects.create,storage.folders.create"Sostituisci
PROJECT_IDcon l'ID progetto.Concedi il ruolo Storage Bucket Viewer (
roles/storage.bucketViewer) a tutti gli oggetti ServiceAccount nello spazio dei nomi di destinazione. Questo ruolo consente agli oggetti ServiceAccount di leggere i metadati del bucket, ma non concede loro le autorizzazioni per leggere o scrivere gli oggetti nel 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"Sostituisci quanto segue:
BUCKET_NAME: il nome del bucket.PROJECT_NUMBER: il numero del progetto.PROJECT_ID: il tuo ID progetto.NAMESPACE: lo spazio dei nomi dei pod.
Per ogni oggetto ServiceAccount che deve archiviare snapshot dei pod, segui questi passaggi:
Crea una cartella gestita per l'oggetto ServiceAccount:
gcloud storage managed-folders create gs://BUCKET_NAME/FOLDER_PATH/Sostituisci quanto segue:
BUCKET_NAME: il nome del bucket.FOLDER_PATH: il percorso della cartella gestita (ad esempiomy-app-snapshots).
Concedi all'oggetto ServiceAccount il ruolo personalizzato
podSnapshotGcsReadWriternella cartella gestita. Per concedere l'autorizzazione, esegui i comandi per l'opzione selezionata:Autorizzazioni standard
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/SERVICEACCOUNT_NAME" \ --role="projects/PROJECT_ID/roles/podSnapshotGcsReadWriter"Autorizzazioni di scrittura singola
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/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.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'Sostituisci quanto segue:
BUCKET_NAME: il nome del bucket.FOLDER_PATH: il percorso della cartella gestita (ad esempiomy-app-snapshots).PROJECT_NUMBER: il numero del progetto.PROJECT_ID: il tuo ID progetto.NAMESPACE: lo spazio dei nomi dei pod.SERVICEACCOUNT_NAME: il nome dell'oggetto ServiceAccount.
Configura lo spazio di archiviazione per gli snapshot
Per specificare dove archiviare gli snapshot dei pod, crea una risorsa personalizzata PodSnapshotStorageConfig:
Salva il seguente manifest come
example-pod-snapshot-storage-config.yaml. Questo esempio configura GKE per archiviare gli snapshot dei pod nel percorsoFOLDER_PATH/all'interno del bucket 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"Sostituisci quanto segue:
BUCKET_NAME: il nome del tuo bucket Cloud Storage.FOLDER_PATH: il percorso della cartella gestita di Cloud Storage.TOKEN_SOURCE: il provider di identità per l'accesso. UtilizzapodKSA(predefinito) ofederatedP4SAper la multitenancy.
Applica il manifest:
kubectl apply -f example-pod-snapshot-storage-config.yaml
Passaggi successivi
Scopri come attivare uno snapshot del pod.