Gli snapshot dei pod di Google Kubernetes Engine (GKE) consentono di salvare e ripristinare gli stati dei pod in esecuzione per migliorare la latenza di avvio dei carichi di lavoro. Prima di poter acquisire snapshot dei carichi di lavoro, devi preparare il cluster e l'ambiente di archiviazione.
Utilizza questo documento per scoprire come abilitare e configurare gli snapshot dei pod sul cluster e configurare Cloud Storage per archiviare gli snapshot. Per saperne di più sul funzionamento degli 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 configurare 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 nel Cloud de Confiance by S3NS contenuto, consulta Ruoli e attività comuni degli utenti GKE tasks.
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
- Se vuoi 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
gcloud components updatecomando. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
Abilita gli 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 da eseguire in GKE Sandbox.
Per abilitare gli snapshot dei pod su un cluster, segui i passaggi per la modalità di funzionamento 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 cluster.CLUSTER_VERSION: la versione del nuovo cluster, che deve essere 1.35.3-gke.1234000 o successive.
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 successive:
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 successive.CONTROL_PLANE_LOCATION: la località del control plane del cluster.
Abilita gli snapshot dei pod sul 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 cluster.
Gli snapshot dei pod con l'ambito predefinito whole-pod non supportano i tipi di macchine 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 carichi di lavoro vengano eseguiti su
hardware compatibile.
Per creare e utilizzare una risorsa personalizzata ComputeClass:
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
cloud.google.com/compute-classselettore di nodi: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.s3ns.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 successive.PROJECT_ID: il tuo ID progetto.CONTROL_PLANE_LOCATION: la località del control plane del 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 successive:
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 successive.CONTROL_PLANE_LOCATION: la località del control plane del cluster.
Abilita gli snapshot dei pod sul 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 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 cluster.
Per saperne di più su GKE Sandbox, consulta Rafforzare l'isolamento dei carichi di lavoro 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 a 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 del 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 anche l'abilitazione dell'accesso uniforme a livello di bucket.
- Eliminazione temporanea: poiché gli snapshot dei pod utilizzano caricamenti compositi paralleli, disabilita le funzionalità di protezione dei dati come l'eliminazione temporanea. Se lasci queste funzionalità abilitate, le eliminazioni temporanee degli oggetti temporanei possono aumentare notevolmente la fattura di archiviazione.
- Località: la località del bucket Cloud Storage deve essere la stessa 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 di bucket, consulta
i flag nella documentazione del comando buckets create.
Concedi ai carichi di lavoro l'accesso al bucket Cloud Storage
Per impostazione predefinita, GKE non ha accesso a Cloud Storage. Per leggere e scrivere gli snapshot dei pod, devi concedere un ruolo IAM che contenga le autorizzazioni corrispondenti all'oggetto ServiceAccount Kubernetes utilizzato dai pod del carico di lavoro oppure abilitare la multitenancy utilizzando token di breve durata.
Concedi ruoli a oggetti ServiceAccount Kubernetes specifici
Per concedere ruoli a oggetti ServiceAccount Kubernetes specifici:
Per comunicare con il cluster utilizzando i comandi
kubectl, recupera le credenziali per il 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 cluster.
Per ogni pod:
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 per i pod.
Per consentire all'oggetto ServiceAccount di leggere i metadati del bucket, concedigli il ruolo Visualizzatore bucket 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"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 per i pod.SERVICEACCOUNT_NAME: il nome dell'oggetto ServiceAccount.
Per consentire all'oggetto ServiceAccount di leggere e scrivere oggetti snapshot nel bucket, concedigli il ruolo Utente oggetti 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"
Abilita la multitenancy utilizzando token di breve durata
In alternativa alla concessione delle autorizzazioni a singoli oggetti ServiceAccount, puoi abilitare la multitenancy con token di breve durata con ambito limitato. Questo approccio consente di evitare il ritardo di propagazione associato ai binding IAM manuali. Anziché concedere le autorizzazioni a ogni
oggetto ServiceAccount, esegui una concessione una tantum del
ruolo Amministratore Storage (roles/storage.admin) sul bucket di archiviazione degli snapshot
al account di servizio del nodo GKE. Il account di servizio del nodo crea quindi token di breve durata su richiesta per percorsi specifici.
L'abilitazione dei token con gli snapshot dei pod richiede GKE versione 1.35.3-gke.1737000 o successive.
Per abilitare la multitenancy:
Per concedere al account di servizio del nodo l'autorizzazione a utilizzare il bucket, esegui questo 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"Sostituisci quanto segue:
BUCKET_NAME: il nome del bucket.PROJECT_NUMBER: il numero del progetto.
Quando configuri l'archiviazione per gli snapshot, imposta il valore del
tokenSourcecampo sufederatedP4SA.
Concedi al controller degli snapshot dei pod l'accesso al bucket Cloud Storage
Per consentire al controller degli snapshot dei pod di eliminare gli snapshot all'interno del
bucket Cloud Storage, devi concedere il
ruolo Utente oggetti Storage (roles/storage.objectUser) al
service agent 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.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"
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 reciprocamente non attendibili, utili nei casi d'uso multi-tenant, crea cartelle gestite. Per configurare le cartelle gestite:
Crea un ruolo IAM personalizzato che contenga solo le autorizzazioni necessarie per gli snapshot dei pod:
gcloud iam roles create podSnapshotGcsReadWriter \ --project=PROJECT_ID \ --permissions="storage.objects.get,storage.objects.create,storage.objects.delete,storage.folders.create"Sostituisci
PROJECT_IDcon l'ID progetto.Concedi il ruolo Visualizzatore bucket Storage (
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.s3ns.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 per i pod.
Per ogni oggetto ServiceAccount che deve archiviare gli snapshot dei pod:
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 esempio,my-app-snapshots).
Concedi all'oggetto ServiceAccount il ruolo personalizzato
podSnapshotGcsReadWriternella cartella gestita: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"Sostituisci quanto segue:
BUCKET_NAME: il nome del bucket.FOLDER_PATH: il percorso della cartella gestita (ad esempio,my-app-snapshots).PROJECT_NUMBER: il numero del progetto.PROJECT_ID: il tuo ID progetto.NAMESPACE: lo spazio dei nomi per i pod.SERVICEACCOUNT_NAME: il nome dell'oggetto ServiceAccount.
Configura l'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 bucket Cloud Storage.FOLDER_PATH: il percorso della cartella gestita di Cloud Storage.TOKEN_SOURCE: il provider di identità per l'accesso. UtilizzapodKSA(impostazione predefinita) ofederatedP4SAper la multitenancy.
Applica il manifest:
kubectl apply -f example-pod-snapshot-storage-config.yaml
Passaggi successivi
Scopri come attivare uno snapshot dei pod.