Estoy usando un archivo docker-compose versión 3 con su clave de implementación para ejecutar un enjambre (docker versión 1.13) y me gustaría replicar un servicio para que sea resistente nuevamente a la falla de un solo nodo.
Sin embargo, cuando agrego una sección de implementación como esta:
deploy: replicas: 2en mi clúster de cuatro nodos, a veces termino con ambas réplicas programadas en el mismo nodo. Lo que me falta es una restricción que programe las dos instancias en nodos diferentes.
Sé que hay un modo global que podría usar pero que ejecutaría una instancia en cada nodo, es decir, cuatro instancias en mi caso en lugar de solo dos.
¿Existe una forma sencilla de especificar esta restricción de forma genérica sin tener que recurrir a una combinación de global y etiquetas para mantener alejadas las instancias adicionales?
Editar: después de intentarlo de nuevo, encuentro contenedores que se programarán en diferentes nodos esta vez. Estoy empezando a preguntarme si es posible que haya tenido una 'node.hostname == X' .
Edición 2: después de otra actualización del servicio, y sin restricciones de ubicación, el servicio se programa nuevamente en el mismo nodo (como lo muestra ManoMarks Visualizer ):
Extendiendo la respuesta de VonC , y como en su ejemplo está usando un archivo de redacción, no el cli, podría agregar max_replicas_per_node: 1 , como en
version: '3.8' ... yourservice: deploy: replicas: 2 placement: max_replicas_per_node: 1 La versión 3.8 del esquema de redacción es clave aquí, ya que no hay soporte para max_replicas_per_node por debajo de 3.8 .
Esto se agregó en https://github.com/docker/cli/pull/1410
docker/cli PR 1612 parece resolver el problema 26259 y se ha lanzado en docker 19.03 .
Se agregó un nuevo conmutador
--replicas-max-per-nodeal servicio dockercomo verificarlo
Cree dos servicios y especifique
--replicas-max-per-nodeuno de ellos:docker service create --detach=true --name web1 --replicas 2 nginx docker service create --detach=true --name web2 --replicas 2 --replicas-max-per-node 1 nginxVea la diferencia en las salidas de comando:
$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS 0inbv7q148nn web1 replicated 2/2 nginx:latest 9kry59rk4ecr web2 replicated 1/2 (max 1 per node) nginx:latest $ docker service ps --no-trunc web2 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS bf90bhy72o2ry2pj50xh24cfp web2.1 nginx:latest@sha256:b543f6d0983fbc25b9874e22f4fe257a567111da96fd1d8f1b44315f1236398c limint Running Running 34 seconds ago xedop9dwtilok0r56w4g7h5jm web2.2 nginx:latest@sha256:b543f6d0983fbc25b9874e22f4fe257a567111da96fd1d8f1b44315f1236398c Running Pending 35 seconds ago "no suitable node (max replicas per node limit exceed)"
El mensaje de error sería:
no suitable node (max replicas per node limit exceed)Ejemplos de Sebastiaan van Stijn :
Cree un servicio con un máximo de 2 réplicas:
docker service create --replicas=2 --replicas-max-per-node=2 --name test nginx:alpine docker service inspect --format '{{.Spec.TaskTemplate.Placement.MaxReplicas}}' test 2Actualice el servicio (las réplicas máximas deben mantener su valor)
docker service update --replicas=1 test docker service inspect --format '{{.Spec.TaskTemplate.Placement.MaxReplicas}}' test 2Actualice las réplicas máximas a 1:
docker service update --replicas-max-per-node=1 test docker service inspect --format '{{.Spec.TaskTemplate.Placement.MaxReplicas}}' test 1Y restablecer a 0:
docker service update --replicas-max-per-node=0 test docker service inspect --format '{{.Spec.TaskTemplate.Placement.MaxReplicas}}' test 0
¿Qué versión de docker estás usando? De acuerdo con esta publicación en 1.13, este tipo de problema se ha corregido, eche un vistazo: https://github.com/docker/docker/issues/26259#issuecomment-260899732
Espero que eso responda a tu pregunta.