Les instantanés de pods Google Kubernetes Engine (GKE) vous permettent d'enregistrer et de restaurer les états d'exécution des pods 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 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 cités dans le Cloud de Confiance by S3NS contenu, 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
- Si vous souhaitez utiliser 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
gcloud components updatecommande. 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 Workload Identity Federation for GKE. Les clusters Autopilot activent les deux fonctionnalités par défaut. Pour les clusters Standard, 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 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 du 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
cloud.google.com/compute-classsélecteur de nœud :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.s3ns.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 du 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 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: le type de machine à utiliser pour les nœuds.CONTROL_PLANE_LOCATION: l'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 les 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 pods utilisent l'objet ServiceAccount du pod, qui nécessite Workload Identity Federation for 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 prendre en charge un plus grand nombre de requêtes de lecture et d'écriture par seconde. Les espaces de noms hiérarchiques nécessitent également que vous activiez 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 les
options de la commande buckets create dans la documentation.
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 Kubernetes ServiceAccount utilisé par les pods de votre charge de travail, ou activer l'architecture mutualisée à l'aide de jetons éphémères.
Accorder des rôles à des objets Kubernetes ServiceAccount spécifiques
Pour accorder des rôles à des objets Kubernetes ServiceAccount spécifiques, procédez comme suit :
Pour communiquer avec votre cluster à l'aide de 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 de votre cluster.CONTROL_PLANE_LOCATION: l'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.
Pour permettre à l'objet ServiceAccount de lire les métadonnées du bucket, accordez-lui le rôle Lecteur de buckets 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"Remplacez les éléments suivants :
BUCKET_NAME: nom de votre bucket.PROJECT_NUMBER: numéro de votre projet.PROJECT_ID: ID du projet.NAMESPACE: espace de noms de vos pods.SERVICEACCOUNT_NAME: nom de votre objet ServiceAccount.
Pour permettre à l'objet ServiceAccount de lire et d'écrire des objets d'instantané dans le bucket, accordez-lui le rôle Utilisateur d'objets 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"
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 Administrateur de l'espace de stockage (roles/storage.admin) sur le bucket de stockage d'instantanés
au compte de service de nœud GKE. Le compte de service de 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 les 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 accorder au compte de service de nœud l'autorisation d'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.s3ns-system.iam.gserviceaccount.com" \ --role="roles/storage.admin"Remplacez les éléments suivants :
BUCKET_NAME: nom de votre bucket.PROJECT_NUMBER: numéro de votre 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 pods l'accès au bucket Cloud Storage
Pour permettre au contrôleur d'instantanés de pods de supprimer des instantanés dans le
bucket Cloud Storage, vous devez accorder le
rôle Utilisateur des objets Storage (roles/storage.objectUser) à l'
agent de service GKE sur le projet. Pour accorder le rôle, exécutez la commande suivante :
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"
Remplacez les éléments suivants :
PROJECT_ID: ID du projet.PROJECT_NUMBER: numéro de votre 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 des pods mutuellement non fiables, 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 :
gcloud iam roles create podSnapshotGcsReadWriter \ --project=PROJECT_ID \ --permissions="storage.objects.get,storage.objects.create,storage.objects.delete,storage.folders.create"Remplacez
PROJECT_IDpar l'ID de votre projet.Accordez 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 l'autorisation de lire ou d'écrire les objets dans le 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"Remplacez les éléments suivants :
BUCKET_NAME: nom de votre bucket.PROJECT_NUMBER: numéro de votre projet.PROJECT_ID: ID du projet.NAMESPACE: espace de noms de vos pods.
Pour chaque objet ServiceAccount qui doit stocker des instantanés de pods, 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).
Accordez à l'objet ServiceAccount le rôle personnalisé
podSnapshotGcsReadWritersur le dossier géré :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"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: numéro de votre projet.PROJECT_ID: ID du 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 où stocker les instantanés de pods, créez une ressource personnalisée PodSnapshotStorageConfig :
Enregistrez le 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 de votre 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
Étape suivante
Découvrez comment déclencher un instantané de pod.