Crear un servicio con restricciones y preferencias de ubicación
En este paso, aprenderá cómo utilizar restricciones y preferencias de ubicación para controlar dónde se despliegan las tareas de su servicio dentro de Docker Swarm. Las restricciones de ubicación son requisitos estrictos que un nodo debe cumplir para que se programe una tarea en él. Las preferencias de ubicación son requisitos flexibles que influyen en la programación, pero no impiden que se programe una tarea si ningún nodo cumple con la preferencia.
Primero, inspeccionemos el nodo actual para ver sus etiquetas (labels). Las etiquetas son pares clave-valor que se pueden adjuntar a los nodos para proporcionar metadatos.
docker node inspect self --format '{{ .Spec.Labels }}'
Este comando inspecciona el nodo actual (identificado por self
) y formatea la salida para mostrar sus etiquetas. Por defecto, es posible que no haya ninguna etiqueta personalizada.
Agreguemos una etiqueta al nodo actual. Agregaremos la etiqueta node_type=app
.
docker node update --label-add node_type=app self
Este comando actualiza el nodo actual y agrega la etiqueta node_type=app
.
Ahora, verifiquemos que se haya agregado la etiqueta.
docker node inspect self --format '{{ .Spec.Labels }}'
Debería ver map[node_type:app]
en la salida, lo que indica que la etiqueta se ha agregado correctamente.
Ahora, creemos un servicio replicado llamado my-constrained-service
con una restricción de ubicación que requiere que el nodo tenga la etiqueta node_type=app
. Utilizaremos la imagen nginx
.
docker service create \
--name my-constrained-service \
--replicas 1 \
--constraint 'node.labels.node_type == app' \
nginx:latest
Este comando crea un servicio con una restricción. --constraint 'node.labels.node_type == app'
especifica que las tareas de este servicio solo se pueden programar en nodos donde la etiqueta node_type
sea igual a app
. Dado que agregamos esta etiqueta al nodo actual, la tarea debería programarse aquí.
Verifique el estado del servicio y las tareas:
docker service ls
docker service ps my-constrained-service
Debería ver my-constrained-service
en la lista y su tarea en ejecución en el nodo actual.
Ahora, creemos otro servicio con una preferencia de ubicación. Las preferencias de ubicación se utilizan para guiar al programador, pero no se aplican estrictamente. Utilizaremos la imagen busybox
y preferiremos nodos con la etiqueta node_type=database
. Dado que nuestro nodo actual no tiene esta etiqueta, la tarea todavía se programará en el nodo actual, pero si hubiera otros nodos con esa etiqueta, el programador los preferiría.
Primero, descarguemos la imagen busybox
.
docker pull busybox:latest
Ahora, creemos el servicio con una preferencia de ubicación.
docker service create \
--name my-preferred-service \
--replicas 1 \
--placement-pref 'spread=node.labels.node_type' \
busybox:latest sleep infinity
La opción --placement-pref 'spread=node.labels.node_type'
le dice al programador que distribuya las tareas entre los nodos en función del valor de la etiqueta node_type
. En un clúster (swarm) de múltiples nodos con diferentes etiquetas node_type
, esto distribuiría las tareas de manera más uniforme. En este entorno de un solo nodo, la tarea simplemente se programará en el nodo disponible.
Verifique el estado del servicio y las tareas:
docker service ls
docker service ps my-preferred-service
Debería ver my-preferred-service
en la lista y su tarea en ejecución en el nodo actual.