Les instantanés de pods Google Kubernetes Engine (GKE) vous permettent d'enregistrer et de restaurer les états des pods en cours d'exécution afin d'améliorer la latence de démarrage des charges de travail. Avant de pouvoir capturer des instantanés de vos charges de travail, vous devez préparer votre cluster et votre environnement de stockage.
Ce document vous explique comment activer et configurer les instantanés de pods sur votre cluster, et comment configurer Cloud Storage pour stocker les instantanés. Pour en savoir plus sur le fonctionnement des instantanés de pods, consultez À propos des instantanés de pods GKE.
Les administrateurs et opérateurs de plate-forme, ainsi que les développeurs d'applications, peuvent utiliser ce document pour configurer des clusters, créer des buckets de stockage et configurer des autorisations d'accès pour les instantanés de pods. Pour en savoir plus sur les rôles courants et les exemples de tâches que nous citons dans le contenu Google Cloud , consultez Rôles utilisateur et tâches courantes de GKE.
Avant de commencer
Avant de commencer, effectuez les tâches suivantes :
- Activez l'API Google Kubernetes Engine. Activer l'API Google Kubernetes Engine
- Pour utiliser la Google Cloud CLI pour cette tâche, installez puis initialisez la gcloud CLI. Si vous avez déjà installé la gcloud CLI, obtenez la dernière version en exécutant la commande
gcloud components update. Il est possible que les versions antérieures de la gcloud CLI ne permettent pas d'exécuter les commandes de ce document.
Activer les instantanés de pods
Vous pouvez activer les instantanés de pods sur un cluster nouveau ou existant. Les instantanés de pods nécessitent GKE Sandbox et la fédération d'identité de charge de travail pour GKE. Les clusters Autopilot activent les deux fonctionnalités par défaut. Pour les clusters standards, vous devez activer Workload Identity Federation for GKE sur le cluster et configurer un pool de nœuds pour qu'il s'exécute dans GKE Sandbox.
Pour activer les instantanés de pods sur un cluster, suivez les étapes correspondant au mode de fonctionnement GKE que vous souhaitez utiliser :
Autopilot
Pour activer les instantanés de pods sur un nouveau cluster, exécutez la commande suivante :
gcloud container clusters create-auto CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATION \ --cluster-version=CLUSTER_VERSIONRemplacez les éléments suivants :
CLUSTER_NAME: nom de votre cluster.CONTROL_PLANE_LOCATION: emplacement du plan de contrôle de votre cluster.CLUSTER_VERSION: version de votre nouveau cluster, qui doit être 1.35.3-gke.1234000 ou ultérieure.
Pour activer les instantanés de pods sur un cluster existant, procédez comme suit :
Mettez à niveau le cluster vers la version 1.35.3-gke.1234000 ou une version ultérieure :
gcloud container clusters upgrade CLUSTER_NAME \ --cluster-version=CLUSTER_VERSION \ --location=CONTROL_PLANE_LOCATIONRemplacez les éléments suivants :
CLUSTER_NAME: nom de votre cluster.CLUSTER_VERSION: version vers laquelle mettre à niveau votre cluster, qui doit être 1.35.3-gke.1234000 ou ultérieure.CONTROL_PLANE_LOCATION: emplacement du plan de contrôle de votre cluster.
Activez les instantanés de pods sur votre cluster :
gcloud container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATIONRemplacez les éléments suivants :
CLUSTER_NAME: nom de votre cluster.CONTROL_PLANE_LOCATION: emplacement du plan de contrôle de votre cluster.
Les instantanés de pods avec le champ d'application whole-pod par défaut ne sont pas compatibles avec les types de machines E2, contrairement aux instantanés de système de fichiers (rootfs-only). Dans les clusters Autopilot, GKE peut planifier des pods sur des nœuds E2 par défaut. Si vous utilisez le champ d'application whole-pod, utilisez une ressource personnalisée ComputeClass pour vous assurer que vos charges de travail s'exécutent sur du matériel compatible.
Pour créer et utiliser une ressource personnalisée ComputeClass, procédez comme suit :
Enregistrez le manifeste suivant sous le nom
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: DoNotScaleUpAppliquez le fichier manifeste :
kubectl apply -f non-e2-class.yamlDans la spécification de votre pod, référencez la ressource personnalisée ComputeClass à l'aide du sélecteur de nœud
cloud.google.com/compute-class:spec: nodeSelector: cloud.google.com/compute-class: non-e2-class # Multiple lines are omitted here
Standard
Pour activer les instantanés de pods sur un nouveau cluster, exécutez la commande suivante :
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_LOCATIONRemplacez les éléments suivants :
CLUSTER_NAME: nom de votre cluster.CLUSTER_VERSION: version de votre nouveau cluster, qui doit être 1.35.3-gke.1234000 ou ultérieure.PROJECT_ID: ID de votre projet.CONTROL_PLANE_LOCATION: emplacement du plan de contrôle de votre cluster.
Pour activer les instantanés de pods sur un cluster existant, procédez comme suit :
Mettez à niveau le cluster vers la version 1.35.3-gke.1234000 ou une version ultérieure :
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=NODE_POOL_NAME \ --cluster-version=CLUSTER_VERSION \ --location=CONTROL_PLANE_LOCATIONRemplacez les éléments suivants :
CLUSTER_NAME: nom de votre cluster.NODE_POOL_NAME: nom de votre pool de nœuds.CLUSTER_VERSION: version vers laquelle mettre à niveau votre cluster, qui doit être 1.35.3-gke.1234000 ou ultérieure.CONTROL_PLANE_LOCATION: emplacement du plan de contrôle de votre cluster.
Activez les instantanés de pods sur votre cluster :
gcloud beta container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATIONRemplacez les éléments suivants :
CLUSTER_NAME: nom de votre cluster.CONTROL_PLANE_LOCATION: emplacement du plan de contrôle de votre cluster.
Pour exécuter des pods dans GKE Sandbox sur un cluster Standard, vous devez créer ou mettre à jour un pool de nœuds avec GKE Sandbox activé. Pour mettre à jour un pool de nœuds, utilisez l'option --sandbox type=gvisor. Pour créer un pool de nœuds avec GKE Sandbox activé, exécutez la commande suivante :
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
Remplacez les éléments suivants :
NODE_POOL_NAME: nom de votre nouveau pool de nœuds.CLUSTER_NAME: nom du clusterNODE_VERSION: version à utiliser pour le pool de nœuds.MACHINE_TYPE: type de machine à utiliser pour les nœuds.CONTROL_PLANE_LOCATION: emplacement du plan de contrôle de votre cluster.
Pour en savoir plus sur GKE Sandbox, consultez Renforcer l'isolation d'une charge de travail avec GKE Sandbox.
Stocker des instantanés
GKE stocke les instantanés de pods dans un bucket Cloud Storage. Chaque instantané contient la mémoire de l'application et, éventuellement, l'état du GPU du pod. Pour s'authentifier auprès de Cloud Storage, les instantanés de pod utilisent l'objet ServiceAccount du pod, qui nécessite la fédération d'identité de charge de travail pour GKE.
Les instantanés de pods nécessitent les configurations de bucket suivantes :
- Espaces de noms hiérarchiques : vous devez activer les espaces de noms hiérarchiques pour accepter un plus grand nombre de requêtes de lecture et d'écriture par seconde. Les espaces de noms hiérarchiques nécessitent également d'activer l'accès uniforme au niveau du bucket.
- Suppression réversible : étant donné que les instantanés de pods utilisent des importations composites parallèles, désactivez les fonctionnalités de protection des données telles que la suppression réversible. Si vous laissez ces fonctionnalités activées, les suppressions réversibles des objets temporaires peuvent augmenter considérablement votre facture de stockage.
- Emplacement : l'emplacement du bucket Cloud Storage doit être le même que celui du cluster GKE, car le transfert d'instantanés entre différentes régions peut affecter les performances.
Pour créer un bucket avec les configurations requises, exécutez la commande suivante :
gcloud storage buckets create gs://BUCKET_NAME \
--uniform-bucket-level-access \
--enable-hierarchical-namespace \
--soft-delete-duration=0d \
--location=LOCATION
Remplacez les éléments suivants :
BUCKET_NAME: nom de votre bucket.LOCATION: emplacement de votre bucket.
Pour obtenir la liste complète des options de création de buckets, consultez la section Options de la documentation de la commande buckets create.
Accorder aux charges de travail l'accès au bucket Cloud Storage
Par défaut, GKE n'a pas accès à Cloud Storage. Pour lire et écrire des instantanés de pods, vous devez accorder un rôle IAM contenant les autorisations correspondantes à l'objet ServiceAccount Kubernetes utilisé par vos pods de charge de travail, ou activer l'architecture mutualisée à l'aide de jetons de courte durée.
Attribuer des rôles à des objets ServiceAccount Kubernetes spécifiques
Pour attribuer des rôles à des objets Kubernetes ServiceAccount spécifiques, procédez comme suit :
Pour communiquer avec votre cluster à l'aide des commandes
kubectl, obtenez les identifiants de votre cluster :gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATIONRemplacez les éléments suivants :
CLUSTER_NAME: nom du clusterCONTROL_PLANE_LOCATION: emplacement du plan de contrôle de votre cluster.
Pour chaque pod, procédez comme suit :
Créez un objet ServiceAccount :
kubectl create serviceaccount SERVICEACCOUNT_NAME \ --namespace=NAMESPACERemplacez les éléments suivants :
SERVICEACCOUNT_NAME: nom de votre objet ServiceAccount.NAMESPACE: espace de noms de vos pods.
Accordez à l'objet ServiceAccount l'autorisation d'accéder au bucket. Choisissez l'une des options suivantes en fonction de vos exigences de sécurité :
- Autorisations standards : accordent un accès complet en lecture, en écriture et en suppression.
- Autorisations d'écriture unique : empêchent l'écrasement ou la suppression des fichiers d'instantanés finalisés, mais accordent l'autorisation de supprimer les objets temporaires pour les importations composites parallèles.
Pour accorder l'autorisation, exécutez les commandes correspondant à l'option que vous avez choisie :
Autorisations standards
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"Autorisations d'écriture unique
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'Remplacez les éléments suivants :
BUCKET_NAME: nom de votre bucket.PROJECT_NUMBER: votre numéro de projet.PROJECT_ID: ID de votre projet.NAMESPACE: espace de noms de vos pods.SERVICEACCOUNT_NAME: nom de votre objet ServiceAccount.
Activer l'architecture mutualisée à l'aide de jetons éphémères
Au lieu d'accorder des autorisations à des objets ServiceAccount individuels, vous pouvez activer l'architecture mutualisée avec des jetons éphémères à champ d'application limité. Cette approche permet d'éviter le délai de propagation associé aux liaisons IAM manuelles. Au lieu d'accorder des autorisations à chaque objet ServiceAccount, vous accordez une seule fois le rôle d'administrateur de l'espace de stockage (roles/storage.admin) sur le bucket de stockage d'instantanés au compte de service du nœud GKE. Le compte de service du nœud crée ensuite des jetons éphémères à la demande pour des chemins d'accès spécifiques.
L'activation des jetons avec des instantanés de pods nécessite GKE version 1.35.3-gke.1737000 ou ultérieure.
Pour activer l'architecture mutualisée, procédez comme suit :
Pour autoriser le compte de service du nœud à utiliser le bucket, exécutez la commande suivante :
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"Remplacez les éléments suivants :
BUCKET_NAME: nom de votre bucket.PROJECT_NUMBER: votre numéro de projet.
Lorsque vous configurez le stockage pour les instantanés, définissez la valeur du champ
tokenSourcesurfederatedP4SA.
Accorder au contrôleur d'instantanés de pod l'accès au bucket Cloud Storage
Pour permettre au contrôleur d'instantanés de pod de supprimer des instantanés dans le bucket Cloud Storage, vous devez attribuer le rôle Utilisateur d'objets Storage (roles/storage.objectUser) à l'agent de service GKE sur le projet. Pour attribuer le rôle, exécutez la commande suivante :
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"
Remplacez les éléments suivants :
PROJECT_ID: ID de votre projet.PROJECT_NUMBER: votre numéro de projet.BUCKET_NAME: nom de votre bucket.
Facultatif : Créer des dossiers gérés pour le bucket Cloud Storage
Pour isoler les autorisations des instantanés de pods qui ne se font pas mutuellement confiance, ce qui est utile dans les cas d'utilisation mutualisés, créez des dossiers gérés. Pour configurer des dossiers gérés, procédez comme suit :
Créez un rôle IAM personnalisé qui ne contient que les autorisations nécessaires pour les instantanés de pods. Exécutez la commande correspondant à l'option que vous avez sélectionnée :
Autorisations standards
gcloud iam roles create podSnapshotGcsReadWriter \ --project=PROJECT_ID \ --permissions="storage.objects.get,storage.objects.list,storage.objects.create,storage.objects.delete,storage.folders.create"Autorisations d'écriture unique
gcloud iam roles create podSnapshotGcsReadWriter \ --project=PROJECT_ID \ --permissions="storage.objects.get,storage.objects.list,storage.objects.create,storage.folders.create"Remplacez
PROJECT_IDpar l'ID du projet.Attribuez le rôle Lecteur de buckets Storage (
roles/storage.bucketViewer) à tous les objets ServiceAccount de l'espace de noms cible. Ce rôle permet aux objets ServiceAccount de lire les métadonnées du bucket, mais ne leur accorde pas les autorisations de lire ou d'écrire les objets du 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"Remplacez les éléments suivants :
BUCKET_NAME: nom de votre bucket.PROJECT_NUMBER: votre numéro de projet.PROJECT_ID: ID de votre projet.NAMESPACE: espace de noms de vos pods.
Pour chaque objet ServiceAccount devant stocker des instantanés de pod, procédez comme suit :
Créez un dossier géré pour l'objet ServiceAccount :
gcloud storage managed-folders create gs://BUCKET_NAME/FOLDER_PATH/Remplacez les éléments suivants :
BUCKET_NAME: nom de votre bucket.FOLDER_PATH: chemin d'accès au dossier géré (par exemple,my-app-snapshots).
Attribuez à l'objet ServiceAccount le rôle personnalisé
podSnapshotGcsReadWritersur le dossier géré. Pour accorder l'autorisation, exécutez les commandes correspondant à l'option que vous avez choisie :Autorisations standards
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"Autorisations d'écriture unique
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'Remplacez les éléments suivants :
BUCKET_NAME: nom de votre bucket.FOLDER_PATH: chemin d'accès au dossier géré (par exemple,my-app-snapshots).PROJECT_NUMBER: votre numéro de projet.PROJECT_ID: ID de votre projet.NAMESPACE: espace de noms de vos pods.SERVICEACCOUNT_NAME: nom de votre objet ServiceAccount.
Configurer le stockage pour les instantanés
Pour spécifier l'emplacement de stockage des instantanés de pods, créez une ressource personnalisée PodSnapshotStorageConfig :
Enregistrez le fichier manifeste suivant sous le nom
example-pod-snapshot-storage-config.yaml. Cet exemple configure GKE pour stocker les instantanés de pods dans le chemin d'accèsFOLDER_PATH/du 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"Remplacez les éléments suivants :
BUCKET_NAME: nom du bucket Cloud Storage.FOLDER_PATH: chemin d'accès au dossier géré Cloud Storage.TOKEN_SOURCE: fournisseur d'identité pour l'accès. UtilisezpodKSA(par défaut) oufederatedP4SApour l'architecture mutualisée.
Appliquez le fichier manifeste :
kubectl apply -f example-pod-snapshot-storage-config.yaml
Étapes suivantes
Découvrez comment déclencher un instantané de pod.