Cette page explique comment améliorer la latence de démarrage des charges de travail en utilisant des disques de démarrage secondaires dans Google Kubernetes Engine (GKE) pour précharger des données ou des images de conteneur sur de nouveaux nœuds. Cela permet aux charges de travail d'accélérer le démarrage à froid et d'améliorer l'utilisation globale des ressources provisionnées.
Avant de lire cette page, assurez-vous de connaître Google Cloud, Kubernetes, les conteneurs, YAML, l'environnement d'exécution conteneurisé et la Google Cloud CLI.
Présentation
À partir de la version 1.28.3-gke.1067000 de GKE dans les clusters Standard et de la version 1.30.1-gke.1329000 de GKE dans les clusters Autopilot, vous pouvez configurer le pool de nœuds avec des disques de démarrage secondaires. Vous pouvez indiquer à GKE de provisionner les nœuds et de les précharger avec des données, telles qu'un modèle de machine learning (ML) ou une image de conteneur. L'utilisation de données ou d'images de conteneur préchargées sur un disque secondaire présente les avantages suivants pour vos charges de travail:
- Latence réduite lors de l'extraction d'images de conteneur volumineuses ou du téléchargement de données
- Autoscaling plus rapide
- Récupération plus rapide après des perturbations telles que des événements de maintenance et des erreurs système
Les sections suivantes expliquent comment configurer le disque de démarrage secondaire dans les clusters GKE Autopilot et standards.
Fonctionnement des disques de démarrage secondaires
Votre charge de travail peut démarrer plus rapidement en utilisant l'image ou les données de conteneur préchargées sur des disques de démarrage secondaires. Les disques de démarrage secondaires présentent les caractéristiques suivantes:
- Les disques de démarrage secondaires sont des disques persistants qui sont sauvegardés par un stockage de blocs distribué.
- Le disque persistant est instancié à partir d'images de disque que vous créez à l'avance.
- Pour des raisons d'évolutivité, chaque nœud dispose de sa propre instance de disque persistant créée à partir de l'image de disque. Ces instances de disques persistants sont supprimées lorsque le nœud l'est.
- Si l'image de disque est déjà utilisée dans la zone, le temps de création de tous les disques ultérieurs créés à partir de la même image de disque sera inférieur.
- Le type de disque de démarrage secondaire est identique à celui du disque de démarrage du nœud.
- La taille du disque de démarrage secondaire est déterminée par la taille de l'image du disque.
L'ajout de disques de démarrage secondaires à vos pools de nœuds n'augmente généralement pas le temps de provisionnement des nœuds. GKE provisionne les disques de démarrage secondaires à partir de l'image de disque en parallèle du processus de provisionnement de nœuds.
Pour prendre en charge les images de conteneur préchargées, GKE étend l'environnement d'exécution containerd avec des plug-ins qui lisent les images de conteneur à partir de disques de démarrage secondaires. Les images de conteneur sont réutilisées par les couches de base.
Préchargez les grandes couches de base sur le disque de démarrage secondaire, tandis que les petites couches supérieures peuvent être extraites du registre de conteneurs.
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 gcloud CLI. Si vous avez déjà installé gcloud CLI, assurez-vous de disposer de la dernière version en exécutant la commande
gcloud components update
.
Activez l'API Container File System.
Conditions requises
Les exigences suivantes s'appliquent à l'utilisation d'un disque de démarrage secondaire :
- Vos clusters exécutent la version 1.28.3-gke.1067000 de GKE dans GKE Standard ou la version 1.30.1-gke.1329000 de GKE Autopilot.
- Lorsque vous modifiez l'image disque, vous devez créer un pool de nœuds. La mise à jour de l'image disque sur les nœuds existants n'est pas possible.
- Configurez le streaming d'images pour utiliser la fonctionnalité de disque de démarrage secondaire.
- Utilisez Container-Optimized OS avec une image de nœud containerd. Les nœuds Autopilot utilisent cette image de nœud par défaut.
Préparez l'image disque avec des données prêtes au moment de la compilation ou avec des images de conteneur préchargées. Assurez-vous que votre cluster a accès à l'image disque à charger sur les nœuds.
Bonne pratique: Automatisez l'image de disque dans un pipeline CI/CD.
Limites
Les disques de démarrage secondaires présentent les limites suivantes:
- Vous ne pouvez pas mettre à jour les disques de démarrage secondaires pour les nœuds existants. Pour associer une nouvelle image disque, créez un pool de nœuds.
- Vous ne pouvez pas utiliser de disques de démarrage secondaires pour précharger des données dans les clusters GKE Autopilot.
Tarifs
Lorsque vous créez des pools de nœuds avec des disques de démarrage secondaires, GKE associe un disque Persistent Disk à chaque nœud du pool de nœuds. Les disques persistants sont facturés conformément aux tarifs des disques Compute Engine.
Préparer l'image du disque de démarrage secondaire
Pour préparer l'image du disque de démarrage secondaire, sélectionnez l'onglet Images pour précharger des images de conteneur ou l'onglet Données pour précharger des données, puis suivez les instructions suivantes:
Images
GKE fournit un outil appelé gke-disk-image-builder
pour créer une machine virtuelle (VM), extraire les images de conteneur sur un disque, puis créer une image disque à partir de ce disque.
Pour créer une image disque avec plusieurs images de conteneur préchargées, procédez comme suit:
- Créez un bucket Cloud Storage pour stocker les journaux d'exécution de
gke-disk-image-builder
. - Créez une image disque avec
gke-disk-image-builder
.
go run ./cli \
--project-name=PROJECT_ID \
--image-name=DISK_IMAGE_NAME \
--zone=LOCATION \
--gcs-path=gs://LOG_BUCKET_NAME \
--disk-size-gb=10 \
--container-image=docker.io/library/python:latest \
--container-image=docker.io/library/nginx:latest
Remplacez les éléments suivants :
- PROJECT_ID: nom de votre Google Cloud projet.
- DISK_IMAGE_NAME: nom de l'image du disque. Exemple :
nginx-python-image
. - LOCATION: l'emplacement du cluster.
- LOG_BUCKET_NAME: nom du bucket Cloud Storage où stocker les journaux d'exécution. Exemple :
gke-secondary-disk-image-logs/
.
Lorsque vous créez une image disque avec gke-disk-image-builder
,Google Cloud crée plusieurs ressources pour terminer le processus (par exemple, une instance de VM, un disque temporaire et un disque persistant). Après son exécution, le compilateur d'images nettoie toutes les ressources, à l'exception de l'image disque que vous avez créée.
Données
Créez une image disque personnalisée en tant que source de données en procédant comme suit:
Configurer le disque de démarrage secondaire
Vous pouvez configurer le disque de démarrage secondaire dans un cluster GKE Autopilot ou Standard.
Utilisez un cluster Autopilot pour une expérience Kubernetes entièrement gérée. Pour choisir le mode de fonctionnement GKE le mieux adapté à vos charges de travail, consultez la section Choisir un mode de fonctionnement GKE.
Utilisez GKE Autopilot
Dans cette section, vous allez créer une liste d'autorisation d'images disque pour autoriser l'image disque dans un cluster Autopilot GKE existant. Vous modifiez ensuite le sélecteur de nœuds de pod pour utiliser un disque de démarrage secondaire.
Autoriser les images de disque dans votre projet
Dans cette section, vous allez créer un GCPResourceAllowlist
pour permettre à GKE de créer des nœuds avec des disques de démarrage secondaires à partir des images de disque de votre projetGoogle Cloud .
Enregistrez le manifeste suivant sous le nom
allowlist-disk.yaml
:apiVersion: "node.gke.io/v1" kind: GCPResourceAllowlist metadata: name: gke-secondary-boot-disk-allowlist spec: allowedResourcePatterns: - "projects/PROJECT_ID/global/images/.*"
Remplacez PROJECT_ID par l'ID de votre projet pour héberger l'image disque.
Appliquez le fichier manifeste :
kubectl apply -f allowlist-disk.yaml
GKE crée des nœuds avec des disques de démarrage secondaires à partir de toutes les images de disque du projet.
Mettre à jour le sélecteur de nœuds de pod pour utiliser un disque de démarrage secondaire
Dans cette section, vous allez modifier la spécification du pod afin que GKE crée les nœuds avec le disque de démarrage secondaire.
Ajoutez un fichier
nodeSelector
à votre modèle de pod :nodeSelector: cloud.google.com.node-restriction.kubernetes.io/gke-secondary-boot-disk-DISK_IMAGE_NAME: CONTAINER_IMAGE_CACHE.PROJECT_ID
Remplacez les éléments suivants :
- DISK_IMAGE_NAME : nom de votre image disque.
- PROJECT_ID: ID de votre projet pour héberger l'image disque.
Utilisez la commande
kubectl apply
pour appliquer la spécification Kubernetes avec le modèle de pod.Vérifiez que le cache du disque de démarrage secondaire est utilisé :
kubectl get events --all-namespaces
Le résultat ressemble à ce qui suit :
75s Normal SecondaryDiskCachin node/gke-pd-cache-demo-default-pool-75e78709-zjfm Image gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary disk cache
Méthode la plus fiable pour vérifier que le cache du disque de démarrage secondaire est utilisé:
Interrogez le journal du nœud qui vous intéresse à l'aide de ce nom de journal:
logName="projects/PROJECT_ID/logs/gcfs-snapshotter"
Remplacez
PROJECT_ID
par l'ID de votre Google Cloud projet.Le journal semblable à:
Image gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary boot disk caching by 100.0%...
indique que le cache du disque de démarrage secondaire a été utilisé.Vérifiez la latence d'extraction de l'image:
kubectl describe pod POD_NAME
Remplacez POD_NAME par le nom du pod.
Le résultat est semblable à celui-ci :
… Normal Pulled 15m kubelet Successfully pulled image "docker.io/library/nginx:latest" in 0.879149587s …
La latence attendue pour l'extraction de l'image de conteneur mise en cache doit être considérablement réduite, quelle que soit la taille de l'image.
Utiliser GKE Standard
Pour créer un cluster GKE Standard et un pool de nœuds, suivez les instructions suivantes, en choisissant l'onglet "Images" ou "Données" selon que vous souhaitez précharger des images de conteneur ou des données sur le disque de démarrage secondaire:
Images
Pour configurer un disque de démarrage secondaire, utilisez Google Cloud CLI ou Terraform:
gcloud
Créez un cluster GKE Standard avec le streaming d'images activé:
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --cluster-version=VERSION \ --enable-image-streaming
Remplacez les éléments suivants :
- CLUSTER_NAME : nom du cluster
- LOCATION: emplacement du cluster.
- VERSION: version de GKE à utiliser. La version de GKE doit être
1.28.3-gke.1067000
ou ultérieure.
Créez un pool de nœuds avec un disque de démarrage secondaire dans le même projet:
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location LOCATION \ --enable-image-streaming \ --secondary-boot-disk=disk-image=global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE
Remplacez les éléments suivants :
- NODE_POOL_NAME : nom du pool de nœuds.
- CLUSTER_NAME : nom du cluster existant.
- LOCATION: zone ou zones de calcul du cluster, séparées par une virgule.
- DISK_IMAGE_NAME : nom de votre image disque.
Pour créer un pool de nœuds avec un disque de démarrage secondaire à partir de l'image de disque d'un autre projet, suivez la procédure décrite dans Utiliser un disque de démarrage secondaire dans un autre projet.
Ajoutez un fichier
nodeSelector
à votre modèle de pod :nodeSelector: cloud.google.com/gke-nodepool: NODE_POOL_NAME
Vérifiez que le cache du disque de démarrage secondaire est utilisé :
kubectl get events --all-namespaces
Le résultat ressemble à ce qui suit :
75s Normal SecondaryDiskCachin node/gke-pd-cache-demo-default-pool-75e78709-zjfm Image gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary disk cache
Méthode la plus fiable pour vérifier que le cache du disque de démarrage secondaire est utilisé:
Interrogez le journal du nœud qui vous intéresse à l'aide de ce nom de journal:
logName="projects/PROJECT_ID/logs/gcfs-snapshotter"
Remplacez
PROJECT_ID
par l'ID de votre Google Cloud projet.Le journal semblable à:
Image gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary boot disk caching by 100.0%...
indique que le cache du disque de démarrage secondaire a été utilisé.Vérifiez la latence d'extraction de l'image en exécutant la commande suivante:
kubectl describe pod POD_NAME
Remplacez
POD_NAME
par le nom du pod.Le résultat est semblable à celui-ci :
… Normal Pulled 15m kubelet Successfully pulled image "docker.io/library/nginx:latest" in 0.879149587s …
La latence attendue pour l'extraction de l'image de conteneur mise en cache ne doit pas dépasser quelques secondes, quelle que soit la taille de l'image.
Terraform
Pour créer un cluster avec le pool de nœuds par défaut à l'aide de Terraform, reportez-vous à l'exemple suivant:
Créez un pool de nœuds avec un disque de démarrage secondaire dans le même projet:
Pour en savoir plus sur l'utilisation de Terraform, consultez la page Compatibilité de Terraform avec GKE.
Ajoutez un fichier
nodeSelector
à votre modèle de pod :nodeSelector: cloud.google.com/gke-nodepool: NODE_POOL_NAME
Vérifiez que le cache du disque de démarrage secondaire est utilisé :
kubectl get events --all-namespaces
Le résultat ressemble à ce qui suit :
75s Normal SecondaryDiskCachin node/gke-pd-cache-demo-default-pool-75e78709-zjfm Image gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary disk cache
Vérifiez la latence d'extraction de l'image en exécutant la commande suivante:
kubectl describe pod POD_NAME
Remplacez POD_NAME par le nom du pod.
Le résultat est semblable à celui-ci :
… Normal Pulled 15m kubelet Successfully pulled image "docker.io/library/nginx:latest" in 0.879149587s …
La latence attendue pour l'extraction de l'image de conteneur mise en cache ne doit pas dépasser quelques secondes, quelle que soit la taille de l'image.
Pour en savoir plus sur l'utilisation de Terraform, consultez la page Compatibilité de Terraform avec GKE.
Données
Vous pouvez configurer un disque de démarrage secondaire et précharger des données à l'aide de Google Cloud CLI ou de Terraform:
gcloud
Créez un cluster GKE Standard avec le streaming d'images activé:
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --cluster-version=VERSION \ --enable-image-streaming
Remplacez les éléments suivants :
- CLUSTER_NAME : nom du cluster
- LOCATION: emplacement du cluster.
- VERSION: version de GKE à utiliser. La version de GKE doit être 1.28.3-gke.1067000 ou ultérieure.
Créez un pool de nœuds avec un disque de démarrage secondaire à l'aide de l'option
--secondary-boot-disk
:gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location LOCATION \ --enable-image-streaming \ --secondary-boot-disk=disk-image=global/images/DISK_IMAGE_NAME
Remplacez les éléments suivants :
- NODE_POOL_NAME : nom du pool de nœuds.
- CLUSTER_NAME : nom du cluster existant.
- LOCATION: zone ou zones de calcul du cluster, séparées par une virgule.
- DISK_IMAGE_NAME : nom de votre image disque.
Pour créer un pool de nœuds avec un disque de démarrage secondaire à partir de l'image de disque d'un autre projet, suivez la procédure décrite dans Utiliser un disque de démarrage secondaire dans un autre projet.
GKE crée un pool de nœuds dans lequel chaque nœud dispose d'un disque secondaire avec des données préchargées. GKE associe et installe le disque de démarrage secondaire sur le nœud.
Pour accéder aux données, installez l'image de disque de démarrage secondaire dans les conteneurs de pod à l'aide d'une installation de volume hostPath. Définissez
/usr/local/data_path_sbd
sur le chemin d'accès dans votre conteneur où vous souhaitez que les données résident:apiVersion: v1 kind: Pod metadata: name: pod-name spec: containers: ... volumeMounts: - mountPath: /usr/local/data_path_sbd name: data-path-sbd ... volumes: - name: data-path-sbd hostPath: path: /mnt/disks/gke-secondary-disks/gke-DISK_IMAGE_NAME-disk
Remplacez DISK_IMAGE_NAME par le nom de votre image de disque.
Terraform
Pour créer un cluster avec le pool de nœuds par défaut à l'aide de Terraform, reportez-vous à l'exemple suivant:
Créez un pool de nœuds avec un disque de démarrage secondaire dans le même projet:
Pour en savoir plus sur l'utilisation de Terraform, consultez la page Compatibilité de Terraform avec GKE.
Pour accéder aux données, installez l'image de disque de démarrage secondaire dans les conteneurs de pod à l'aide d'une installation de volume hostPath. Définissez
/usr/local/data_path_sbd
sur le chemin d'accès dans votre conteneur où vous souhaitez que les données résident:apiVersion: v1 kind: Pod metadata: name: pod-name spec: containers: ... volumeMounts: - mountPath: /usr/local/data_path_sbd name: data-path-sbd ... volumes: - name: data-path-sbd hostPath: path: /mnt/disks/gke-secondary-disks/gke-DISK_IMAGE_NAME-disk
Remplacez DISK_IMAGE_NAME par le nom de votre image de disque.
Autoscaling des clusters avec des disques de démarrage secondaires
Pour créer un pool de nœuds et configurer l'autoscaling de cluster sur un disque de démarrage secondaire, utilisez Google Cloud CLI:
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--location LOCATION \
--enable-image-streaming \
--secondary-boot-disk=disk-image=global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE \
--enable-autoscaling \
--num-nodes NUM_NODES \
--min-nodes MIN_NODES \
--max-nodes MAX_NODES
Remplacez les éléments suivants :
- NODE_POOL_NAME : nom du pool de nœuds.
- CLUSTER_NAME : nom du cluster existant.
- LOCATION: zone ou zones de calcul du cluster, séparées par une virgule.
- DISK_IMAGE_NAME : nom de votre image disque.
- MIN_NODES : nombre minimal de nœuds en cas de scaling automatique pour le pool de nœuds spécifié par zone. Pour spécifier le nombre minimal de nœuds pour l'ensemble du pool de nœuds dans GKE version 1.24 ou ultérieure, utilisez
--total-min-nodes
. Les options--total-min-nodes
et--total-max-nodes
sont mutuellement exclusives avec les options--min-nodes
et--max-nodes
. - MAX_NODES : nombre maximal de nœuds en cas de scaling automatique pour le pool de nœuds spécifié par zone. Pour spécifier le nombre maximal de nœuds pour l'ensemble du pool de nœuds dans GKE version 1.24 ou ultérieure, utilisez
--total-max-nodes
. Les options--total-min-nodes
et--total-max-nodes
sont mutuellement exclusives avec les options--min-nodes
et--max-nodes
.
Provisionnement automatique des nœuds avec des disques de démarrage secondaires
Dans GKE 1.30.1-gke.1329000 et versions ultérieures, vous pouvez configurer le provisionnement automatique des nœuds pour créer et supprimer automatiquement des pools de nœuds afin de répondre aux exigences de ressources de vos charges de travail.
Créez une ressource personnalisée de liste d'autorisation d'images disque pour le disque de démarrage secondaire pour le provisionnement automatique des nœuds GKE, semblable à celle-ci:
apiVersion: "node.gke.io/v1" kind: GCPResourceAllowlist metadata: name: gke-secondary-boot-disk-allowlist spec: allowedResourcePatterns: - "projects/<PROJECT_ID>/global/images/.*"
Remplacez PROJECT_ID par l'ID de votre projet pour héberger l'image disque.
Pour déployer la ressource personnalisée de liste d'autorisation dans le cluster, exécutez la commande suivante:
kubectl apply -f ALLOWLIST_FILE
Remplacez ALLOWLIST_FILE par le nom de fichier du fichier manifeste.
Mettez à jour le sélecteur de nœud du pod pour utiliser le disque de démarrage secondaire:
nodeSelector: cloud.google.com.node-restriction.kubernetes.io/gke-secondary-boot-disk-DISK_IMAGE_NAME:CONTAINER_IMAGE_CACHE.PROJECT_ID
Remplacez les éléments suivants :
- DISK_IMAGE_NAME : nom de votre image disque.
- PROJECT_ID: ID de votre projet pour héberger l'image disque.
Utiliser un disque de démarrage secondaire dans un autre projet
Lorsque vous créez un pool de nœuds avec un disque de démarrage secondaire, vous pouvez demander à GKE d'utiliser l'image de disque dans un autre projet à l'aide de l'option --secondary-boot-disk
.
Créez un pool de nœuds avec un disque de démarrage secondaire à partir de l'image de disque d'un autre projet à l'aide de l'indicateur
--secondary-boot-disk
. Exemple :gcloud beta container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location LOCATION \ --enable-image-streaming \ --secondary-boot-disk=disk-image=projects/IMAGE_PROJECT_ID/global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE
Remplacez les éléments suivants :
- DISK_IMAGE_NAME : nom de votre image disque.
- IMAGE_PROJECT_ID: nom du projet auquel appartient l'image disque.
GKE crée un pool de nœuds dans lequel chaque nœud dispose d'un disque secondaire avec des données préchargées. GKE associe et installe le disque de démarrage secondaire sur le nœud.
Accordez l'accès aux images disque appartenant à un autre projet en ajoutant des rôles "Utilisateur d'images Compute" aux comptes de service du cluster:
- Compte de service Compute par défaut: CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com
- Compte de service GKE: service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
gcloud projects add-iam-policy-binding IMAGE_PROJECT_ID \ --member serviceAccount:CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com \ --role roles/compute.imageUser gcloud projects add-iam-policy-binding IMAGE_PROJECT_ID \ --member serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \ --role roles/compute.imageUser
Étapes suivantes
- Utilisez le streaming d'images pour extraire des images de conteneur afin d'extraire des images de conteneur en diffusant les données d'image selon les besoins de vos charges de travail.
- Consultez la page Améliorer l'efficacité de charge de travail à l'aide de Fast Socket NCCL pour savoir comment utiliser le plug-in Fast Socket NVIDIA Collective Communication Library (NCCL).