Créer un service avec des contraintes et des préférences de placement
Dans cette étape, vous apprendrez à utiliser les contraintes et les préférences de placement pour contrôler où les tâches de votre service sont déployées au sein du Docker Swarm. Les contraintes de placement sont des exigences strictes qu'un nœud doit respecter pour qu'une tâche puisse être planifiée sur lui. Les préférences de placement sont des exigences souples qui influencent la planification, mais qui n'empêchent pas une tâche d'être planifiée si aucun nœud ne répond à la préférence.
Tout d'abord, examinons le nœud actuel pour voir ses étiquettes (labels). Les étiquettes sont des paires clé-valeur que vous pouvez attacher aux nœuds pour fournir des métadonnées.
docker node inspect self --format '{{ .Spec.Labels }}'
Cette commande examine le nœud actuel (identifié par self
) et formate la sortie pour afficher ses étiquettes. Par défaut, il n'y a peut-être pas d'étiquettes personnalisées.
Ajoutons une étiquette au nœud actuel. Nous allons ajouter l'étiquette node_type=app
.
docker node update --label-add node_type=app self
Cette commande met à jour le nœud actuel et ajoute l'étiquette node_type=app
.
Vérifions maintenant que l'étiquette a été ajoutée.
docker node inspect self --format '{{ .Spec.Labels }}'
Vous devriez voir map[node_type:app]
dans la sortie, indiquant que l'étiquette a été ajoutée avec succès.
Maintenant, créons un service répliqué nommé my-constrained-service
avec une contrainte de placement qui exige que le nœud ait l'étiquette node_type=app
. Nous allons utiliser l'image nginx
.
docker service create \
--name my-constrained-service \
--replicas 1 \
--constraint 'node.labels.node_type == app' \
nginx:latest
Cette commande crée un service avec une contrainte. --constraint 'node.labels.node_type == app'
spécifie que les tâches de ce service ne peuvent être planifiées que sur les nœuds où l'étiquette node_type
est égale à app
. Étant donné que nous avons ajouté cette étiquette au nœud actuel, la tâche devrait être planifiée ici.
Vérifiez l'état du service et les tâches :
docker service ls
docker service ps my-constrained-service
Vous devriez voir my-constrained-service
répertorié et sa tâche en cours d'exécution sur le nœud actuel.
Maintenant, créons un autre service avec une préférence de placement. Les préférences de placement sont utilisées pour guider l'ordonnanceur, mais ne sont pas strictement appliquées. Nous allons utiliser l'image busybox
et préférer les nœuds avec l'étiquette node_type=database
. Étant donné que notre nœud actuel n'a pas cette étiquette, la tâche sera toujours planifiée sur le nœud actuel, mais s'il y avait d'autres nœuds avec cette étiquette, l'ordonnanceur les préférerait.
Tout d'abord, téléchargez l'image busybox
.
docker pull busybox:latest
Maintenant, créez le service avec une préférence de placement.
docker service create \
--name my-preferred-service \
--replicas 1 \
--placement-pref 'spread=node.labels.node_type' \
busybox:latest sleep infinity
L'option --placement-pref 'spread=node.labels.node_type'
indique à l'ordonnanceur de répartir les tâches entre les nœuds en fonction de la valeur de l'étiquette node_type
. Dans un swarm multi-nœud avec différentes étiquettes node_type
, cela distribuerait les tâches plus uniformément. Dans cet environnement mono-nœud, la tâche sera simplement planifiée sur le nœud disponible.
Vérifiez l'état du service et les tâches :
docker service ls
docker service ps my-preferred-service
Vous devriez voir my-preferred-service
répertorié et sa tâche en cours d'exécution sur le nœud actuel.