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). Avec les disques de démarrage secondaires, vous pouvez précharger les données ou les images de conteneurs 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.
Présentation
À partir de la version 1.28.3-gke.1067000, 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 leur ajouter des données, telles qu'un modèle de machine learning ou une image de conteneur. L'utilisation de données préchargées ou d'une image de conteneur sur un disque secondaire présente les avantages suivants pour vos charges de travail :
- Autoscaling plus rapide
- Latence réduite lors de l'extraction d'images volumineuses
- Récupération plus rapide après des perturbations telles que des événements de maintenance et des erreurs système
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.
Assurez-vous que votre cluster a accès à l'image disque pour charger les nœuds.
Conditions requises
Les exigences suivantes s'appliquent à l'utilisation d'un disque de démarrage secondaire :
- Cette fonctionnalité est disponible dans GKE version 1.28.3-gke.106700 et ultérieure.
Lorsque vous modifiez l'image disque, vous devez créer un pool de nœuds. Vous ne pouvez pas mettre à jour l'image disque sur des nœuds existants.
Vous devez configurer le streaming d'images pour utiliser la fonctionnalité de disque de démarrage secondaire.
Configurer le disque de démarrage secondaire
Les sections suivantes expliquent comment configurer le disque de démarrage secondaire :
Précharger les données
Avant de créer le cluster GKE et le pool de nœuds avec un disque de démarrage secondaire, nous vous recommandons de préparer l'image disque lorsque les données sont prêtes pendant la compilation, idéalement de manière automatisée dans un pipeline CI/CD.
Préparer l'image disque contenant les données
Créez une image disque personnalisée en tant que source de données en procédant comme suit :
- Créez une VM avec un disque vide.
- Connectez-vous en SSH à la VM.
- Créez une image personnalisée à partir du disque.
Créer le cluster GKE
Créez un cluster GKE Standard avec le streaming d'images activé à l'aide de l'option
--enable-image-streaming
:gcloud container clusters create CLUSTER_NAME \ --location LOCATION \ --cluster-version=CLUSTER_VERSION \ --enable-image-streaming
Remplacez les éléments suivants :
- CLUSTER_NAME : le nom du cluster
- LOCATION : l'emplacement du cluster
- CLUSTER-VERSION : version de GKE à utiliser. Doit être
1.28.3-gke.106700
ou une version ultérieure.
Créez un pool de nœuds avec un disque de démarrage secondaire
Vous pouvez attribuer un disque de démarrage secondaire au pool de nœuds. L'image secondaire peut appartenir à l'un des éléments suivants :
Créez un pool de nœuds avec un disque de démarrage secondaire dans le même projet à l'aide de l'option
--secondary-boot-disk=disk-image
. Exemple :gcloud beta container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location LOCATION \ --enable-image-streaming \ --secondary-boot-disk=disk-image=global/images/DATA_DISK IMAGE
Remplacez DISK_IMAGE_NAME par le nom de votre image disque.
GKE crée un pool de nœuds dans lequel chaque nœud dispose d'un disque secondaire avec des images de conteneurs préchargées. Cette opération permet d'associer et d'installer le disque de démarrage secondaire sur le nœud.
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
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. Cette opération permet d'associer et d'installer le disque de démarrage secondaire sur le nœud.
Pour accorder l'accès aux images disque appartenant à un autre projet, vous devez ajouter des rôles "Utilisateur d'images Compute" pour les comptes de service de 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
Vous pouvez éventuellement installer l'image de disque secondaire dans les conteneurs de pod à l'aide d'une installation de volume hostPath. Utilisez le fichier manifeste suivant pour définir des ressources de pod et utiliser une installation de volume hostPath afin de précharger le disque de données dans ses conteneurs :
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 disque.
Précharger l'image de conteneur
Dans ce guide, vous allez utiliser gke-disk-image-builder
pour créer une instance de VM et extraire les images de conteneur sur un disque. gke-disk-image-builder
crée une image de disque à partir de ce disque. Nous vous recommandons de préparer l'image disque juste après l'étape de compilation de l'image de conteneur, idéalement automatisée dans un pipeline CI/CD.
- Créez un bucket Cloud Storage pour stocker les journaux d'exécution de
gke-disk-image-builder
. Créez une image disque avec des images de conteneurs préchargées.
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 : le nom de votre projet Google Cloud
- DISK_IMAGE_NAME : le nom de l'image du disque. Par 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/
Créer le cluster GKE
Créez un cluster GKE Standard avec le streaming d'images activé :
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --cluster-version=CLUSTER_VERSION \ --enable-image-streaming
Créez un pool de nœuds avec un disque de démarrage secondaire
Créez un pool de nœuds avec un disque de démarrage secondaire dans le même 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=global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE
Remplacez DISK_IMAGE_NAME par le nom de votre image disque.
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. Cette opération permet d'associer et d'installer le disque de démarrage secondaire sur le nœud.
Pour accorder l'accès aux images disque appartenant à un autre projet, vous devez ajouter des rôles "Utilisateur d'images Compute" pour les comptes de service de 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
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
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. Vous pouvez vérifier 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 …
É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).