J'ai Docker Swarm Cluster avec 2 nœuds sur AWS. J'ai arrêté les deux instances et démarré initialement swarm manager puis worker. Avant d’arrêter les instances, j’avais un service en cours d’exécution avec 4 réplicas répartis entre le responsable et l’employé.
Lorsque j'ai démarré le nœud Swarm Manager, tous les conteneurs de répliques ont démarré sur le gestionnaire lui-même et ne se déplacent pas du tout.
S'il vous plaît dites-moi comment faire l'équilibre de la charge?
Le gestionnaire d’essaimes n’est-il pas responsable de le faire lorsque le travailleur a commencé?
Actuellement, Swarm (18.03) ne déplace ni ne remplace les conteneurs lorsque de nouveaux nœuds sont démarrés, si les services sont dans le "mode répliqué" par défaut. C'est par conception. Si je devais ajouter un nouveau nœud, je ne voudrais pas nécessairement qu'un groupe d'autres conteneurs soit arrêté et que de nouveaux conteneurs soient créés sur mon nouveau nœud. Swarm n'arrête les conteneurs que pour "déplacer" les répliques lorsqu'il le faut (en mode répliqué).
docker service update --force <servicename>
rééquilibrera un service sur tous les nœuds correspondant à ses exigences et à ses contraintes.
Conseil complémentaire: comme les autres orchestrateurs de conteneurs, vous devez attribuer une capacité à vos nœuds afin de gérer les charges de travail de tous les réplicas de service qui se déplacent pendant les pannes. Votre capacité disponible doit correspondre au niveau de redondance que vous prévoyez de prendre en charge. Si vous souhaitez gérer la capacité de 2 nœuds défaillants en même temps, par exemple, vous devez disposer d'un pourcentage minimum de ressources sur tous les nœuds pour que ces charges de travail puissent être déplacées vers d'autres nœuds.
Dans docker-compose.yml, vous pouvez définir:
version: "3"
services:
app:
image: repository/user/app:latest
networks:
- net
ports:
- 80
deploy:
restart_policy:
condition: any
mode: replicated
replicas: 5
placement:
constraints: [node.role == worker]
update_config:
delay: 2s
Remarque: la contrainte est node.role == worker
Utiliser le drapeau “- réplicas” implique que nous ne nous soucions pas du nœud sur lequel ils sont placés. Si nous voulons un service par nœud, nous pouvons utiliser “- mode = global” à la place.
Dans Docker 1.13 et versions ultérieures, vous pouvez utiliser l'indicateur --force ou -f avec la commande docker service update pour forcer le service à redistribuer ses tâches entre les nœuds de travail disponibles. </ B>
Swarm n'effectue pas d'équilibrage automatique une fois les conteneurs créés. Vous pouvez augmenter/réduire une fois que tous vos employés sont en place et il distribuera des conteneurs selon vos exigences/rôles de configuration/etc.
voir: https://github.com/moby/moby/issues/24103
Il y a des problèmes avec les nouveaux nœuds qui deviennent "agressés" à mesure qu'ils sont ajoutés . Nous évitons également la préemption de tâches saines. Le rééquilibrage est terminé temps, plutôt que de tuer les processus de travail. La préemption est en cours considéré pour l'avenir.
En guise de solution de contournement, la montée et la descente d’un service devrait rééquilibrer le les tâches. Vous pouvez également déclencher une mise à jour progressive, car cela replanifiera nouvelles tâches.