Cette page explique comment indiquer à Google Kubernetes Engine (GKE) de planifier vos pods ensemble, séparément ou à des emplacements spécifiques.
La séparation des charges de travail vous permet d'utiliser des rejets et tolérances pour indiquer à GKE de séparer les pods sur différents nœuds ou de placer des pods sur des nœuds répondant à des critères spécifiques, ou pour planifier des charges de travail spécifiques ensemble. La procédure à suivre pour configurer la séparation des charges de travail dépend de la configuration de votre cluster GKE. Le tableau suivant décrit les différences de procédure :
Configuration de la séparation des charges de travail | |
---|---|
Ajoutez une tolérance pour une paire clé/valeur spécifique à votre spécification de pod, puis sélectionnez cette paire clé-valeur à l'aide d'un sélecteur de nœuds. GKE crée des nœuds, applique le rejet de nœud correspondant et planifie le pod sur le nœud. Pour obtenir des instructions, reportez-vous à la section Séparer les charges de travail des clusters Autopilot. |
|
Standard sans provisionnement automatique des nœuds |
Pour obtenir des instructions, reportez-vous à la page Isoler des charges de travail dans des pools de nœuds dédiés. |
Ce guide utilise un exemple dans lequel vous avez deux charges de travail, un job par lot et un serveur Web, que vous souhaitez séparer.
Quand utiliser la séparation des charges de travail dans GKE ?
La séparation des charges de travail est utile lorsque des charges de travail effectuent des rôles différents et ne doivent pas s'exécuter sur les mêmes machines sous-jacentes. Voici quelques exemples de scénarios :
- Vous avez une charge de travail de coordinateur par lot qui crée des jobs que vous souhaitez séparer.
- Vous exécutez un serveur de jeu avec une charge de travail de mise en correspondance que vous souhaitez séparer des pods de session.
- Vous souhaitez séparer les différentes parties de la pile, par exemple pour séparer un serveur d'une base de données.
- Vous souhaitez séparer certaines charges de travail pour des raisons de conformité ou de stratégie.
Tarifs
Dans les clusters Autopilot, les ressources demandées par vos pods pendant l'exécution vous sont facturées. Pour en savoir plus, consultez la page Tarifs du mode Autopilot. Les pods qui utilisent la séparation des charges de travail ont un nombre minimal de requêtes de ressources plus élevé que les pods standards.
Dans les clusters standards, vous êtes facturé en fonction de la configuration matérielle et de la taille de chaque nœud, que des pods soient exécutés ou non sur les nœuds. Pour plus de détails, consultez la page Tarifs du mode Standard.
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
.
Assurez-vous de disposer d'un cluster GKE. Pour apprendre à créer un cluster, utilisez l'une des méthodes suivantes :
Séparer les charges de travail dans les clusters Autopilot
Pour séparer les charges de travail les unes des autres, ajoutez une tolérance et un sélecteur de nœud à chaque spécification de charge de travail qui définit le nœud sur lequel la charge de travail doit être exécutée. Cette méthode fonctionne également sur les clusters Standard pour lesquels le provisionnement automatique des nœuds est activé.
Enregistrez le manifeste suivant sous le nom
web-server.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: web-server spec: replicas: 6 selector: matchLabels: pod: nginx-pod template: metadata: labels: pod: nginx-pod spec: tolerations: - key: group operator: Equal value: "servers" effect: NoSchedule nodeSelector: group: "servers" containers: - name: web-server image: nginx
Ce fichier manifeste comprend les champs suivants :
spec.tolerations
: GKE peut placer les pods sur des nœuds avec le rejetgroup=servers:NoSchedule
. GKE ne peut pas planifier de pods qui ne présentent pas cette tolérance sur ces nœuds.spec.nodeSelector
: GKE doit placer les pods sur des nœuds portant le libellé de nœudgroup: servers
.
GKE ajoute les libellés et les rejets correspondants aux nœuds que GKE provisionne automatiquement pour exécuter ces pods.
Enregistrez le manifeste suivant sous le nom
batch-job.yaml
:apiVersion: batch/v1 kind: Job metadata: name: batch-job spec: completions: 5 backoffLimit: 3 ttlSecondsAfterFinished: 120 template: metadata: labels: pod: pi-pod spec: restartPolicy: Never tolerations: - key: group operator: Equal value: "jobs" effect: NoSchedule nodeSelector: group: "jobs" containers: - name: pi image: perl command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
Ce fichier manifeste comprend les champs suivants :
spec.tolerations
: GKE peut placer les pods sur des nœuds avec le rejetgroup=jobs:NoSchedule
. GKE ne peut pas planifier de pods qui ne présentent pas cette tolérance sur ces nœuds.spec.nodeSelector
: GKE doit placer les pods sur des nœuds portant le libellé de nœudgroup: jobs
.
GKE ajoute les libellés et les rejets correspondants aux nœuds que GKE provisionne automatiquement pour exécuter ces pods.
Déployez les charges de travail :
kubectl apply -f batch-job.yaml web-server.yaml
Lorsque vous déployez les charges de travail, GKE effectue les opérations suivantes pour chaque charge de travail :
- GKE recherche les nœuds existants qui possèdent le rejet de nœud et le libellé de nœud correspondants spécifiés dans le fichier manifeste. Si des nœuds existent et disposent de ressources disponibles, GKE planifie la charge de travail sur le nœud.
- Si GKE ne trouve pas de nœud existant éligible pour planifier la charge de travail, il crée un nœud et applique le rejet et le libellé de nœud correspondants en fonction du fichier manifeste. GKE place le pod sur le nouveau nœud.
La présence de l'effet NoSchedule
dans le rejet de nœud garantit que les charges de travail sans tolérance ne sont pas placées sur le nœud.
Vérifier la séparation des charges de travail
Répertoriez vos pods pour rechercher les noms des nœuds :
kubectl get pods --output=wide
Le résultat ressemble à ce qui suit :
NAME READY ... NODE
batch-job-28j9h 0/1 ... gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-78rcn 0/1 ... gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-gg4x2 0/1 ... gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-qgsxh 0/1 ... gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-v4ksf 0/1 ... gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
web-server-6bb8cd79b5-dw4ds 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-f2f3c272-n6xm
web-server-6bb8cd79b5-g5ld6 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-9f447e18-275z
web-server-6bb8cd79b5-jcdx5 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-9f447e18-275z
web-server-6bb8cd79b5-pxdzw 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-ccd22fd9-qtfq
web-server-6bb8cd79b5-s66rw 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-ccd22fd9-qtfq
web-server-6bb8cd79b5-zq8hh 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-f2f3c272-n6xm
Cette sortie montre que les pods batch-job
et web-server
s'exécutent toujours sur des nœuds différents.
Limites de la séparation des charges de travail avec des rejets et des tolérances
Vous ne pouvez pas utiliser les préfixes de clé suivants pour la séparation des charges de travail :
- Clés spécifiques à GKE et Kubernetes
- *cloud.google.com/
- *kubelet.kubernetes.io/
- *node.kubernetes.io/
Vous devez utiliser vos propres clés uniques pour la séparation des charges de travail.
Séparer les charges de travail des clusters Standard sans provisionnement automatique des nœuds
La séparation des charges de travail dans des clusters Standard sans provisionnement automatique des nœuds nécessite de créer manuellement des pools de nœuds avec les rejets de nœuds et les libellés de nœuds appropriés pour répondre à vos charges de travail. Pour obtenir des instructions, reportez-vous à la page Isoler des charges de travail dans des pools de nœuds dédiés. N'utilisez cette approche que si vous avez des exigences spécifiques vous obligeant à gérer manuellement vos pools de nœuds.
Créer un cluster avec des rejets de nœuds
Lorsque vous créez un cluster dans GKE, vous pouvez lui attribuer des rejets de nœuds. Cela attribue les rejets à tous les nœuds créés avec le cluster.
Si vous créez un pool de nœuds, celui-ci n'hérite pas des rejets du cluster. Si vous souhaitez attribuer des rejets au pool, vous devez définir l'option --node-taints
lors de la création du pool de nœuds.
Si vous créez un cluster standard avec des rejets de nœuds ayant comme effet NoSchedule
ou NoExecute
, GKE ne peut pas planifier certains composants gérés par GKE, tels que kube-dns
ou metrics-server
sur le pool de nœuds par défaut créé par GKE lors de la création du cluster. GKE ne peut pas planifier ces composants, car ils ne présentent pas les tolérances correspondantes pour vos rejets de nœuds.
Vous devez ajouter un nouveau pool de nœuds répondant à l'une des conditions suivantes :
- Aucun rejet
- Un rejet ayant l'effet
PreferNoSchedule
- Le rejet
components.gke.io/gke-managed-components=true:NoSchedule
N'importe laquelle de ces conditions permet à GKE de planifier les composants gérés par GKE dans le nouveau pool de nœuds.
Pour obtenir des instructions, reportez-vous à la section Isoler des charges de travail sur des nœuds dédiés.
gcloud
Créer un cluster avec des rejets de nœuds
gcloud container clusters create CLUSTER_NAME \
--node-taints KEY=VALUE:EFFECT
Remplacez les éléments suivants :
CLUSTER_NAME
: nom du nouveau clusterEFFECT
: l'un des effets suivants :PreferNoSchedule
,NoSchedule
ouNoExecute
.KEY=VALUE
: paire clé-valeur associée àEFFECT
.
Console
Créer un cluster avec des rejets de nœuds
Accédez à la page Google Kubernetes Engine dans Google Cloud Console.
Cliquez sur add_box Créer.
Configurez le cluster selon vos besoins.
Dans le volet de navigation, sous Pools de nœuds, développez le pool de nœuds que vous souhaitez modifier, puis cliquez sur Métadonnées.
Dans la section Rejets de nœuds, cliquez sur add Ajouter un rejet.
Dans la liste déroulante Effet, sélectionnez l'effet souhaité.
Saisissez la paire clé-valeur souhaitée dans les champs Clé et Valeur.
Cliquez sur Créer.
API
Lorsque vous utilisez l'API pour créer un cluster, incluez le champ nodeTaints
sous "nodeConfig" :
POST https://container.googleapis.com/v1/projects/PROJECT_ID/zones/COMPUTE_ZONE/clusters
{
'cluster': {
'name': 'example-cluster',
'nodeConfig': {
'nodeTaints': [
{
'key': 'special',
'Value': 'gpu',
'effect': 'PreferNoSchedule'
}
]
...
}
...
}
}
Supprimer tous les rejets d'un pool de nœuds
Pour supprimer tous les rejets d'un pool de nœuds, exécutez la commande suivante :
gcloud beta container node-pools update POOL_NAME \
--node-taints="" \
--cluster=CLUSTER_NAME
Remplacez les éléments suivants :
POOL_NAME
: nom du pool de nœuds à modifier.CLUSTER_NAME
: nom du cluster du pool de nœuds.
Étape suivante
- Appliquez des règles de sécurité prédéfinies à l'aide du contrôleur d'admission PodSecurity.
- Exécutez une charge de travail full stack à grande échelle.