Docker Swarm: Publicar servicios clúster
Hoy os voy a mostrar como publicar un servicio en un clúster Docker Swarm. De nada hacemos trabajando con servicios en un clúster Docker Swarm si no nos damos acceso al exterior a la aplicación en cuestión.
Para el ejemplo usaremos NGINX, que es un container rápido y fácil de implementar, pero podéis usarlo con cualquier APP.
La red tiene esta segmentación, ya que es el mismo proyecto de Docker Swarm sobre Raspberry Pi que os mostré hace pocas entradas:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Host p1 (RaspBerry Pi Zero 2W) Hostname 172.19.181.1 Host p2 (RaspBerry Pi Zero 2W) Hostname 172.19.181.2 Host p3 (RaspBerry Pi Zero 2W) Hostname 172.19.181.3 Host p4 (RaspBerry Pi Zero 2W) Hostname 172.19.181.4 Host p0 (RaspBerry Pi 4) Hostname 172.19.181.254 Hostname 192.168.2.197 Red containers 10.0.0.x |
Como podéis apreciar, la raspberry pi 4, dispone del role de Master y tiene una IP en mi red local y otra para gestión del cluster de RaspBerry Pi Zero 2W. La RPi4 puede contener contenedores, en el esquema obvio esta parte:
DOCUMENTACION OFICIAL: https://docs.docker.com/engine/swarm/ingress/
Crear servicio web en Docker Swarm
Creamos el servicio web con dos containers en réplica:
1 2 3 4 5 6 |
root@p0:~# docker service create --name pruebaweb --publish published=8081,target=80 --replicas=2 nginx 0wz9mvvwey223uz97nsr58kny overall progress: 2 out of 2 tasks 1/2: running [==================================================>] 2/2: running [==================================================>] verify: Service converged |
Visualizar containers en cluster Docker Swarm
Para ver los containers generados vía comando, podemos hacerlo con:
1 |
docker node ps $(docker node ls -q) |
Visualizar containers running en cluster Docker Swarm
Como el resultado es bastante grande, podemos hacer un filtro para ver los que están running y en qué nodos:
1 2 3 4 5 |
docker node ps $(docker node ls -q) --filter desired-state=Running | uniq ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS pgv2m2zdukwl \_ pruebaweb.1 nginx:latest p3 Running Running 3 minutes ago sx3ybup0owyq \_ pruebaweb.2 nginx:latest p1 Running Running 3 minutes ago fem68dkl49ds \_ viz.1 alexellis2/visualizer-arm:latest p0 Running Running 2 days ago |
Crear publicación servicio nginx Docker Swarm
Ahora hacemos la publicación:
1 2 3 4 5 6 |
root@p0:~# docker service update --publish-add published=8081,target=80 pruebaweb pruebaweb overall progress: 2 out of 2 tasks 1/2: running [==================================================>] 2/2: running [==================================================>] verify: Service converged |
Verificamos vía comando el estado:
1 2 |
root@p0:~# docker service inspect --format="{{json .Endpoint.Spec.Ports}}" pruebaweb [{"Protocol":"tcp","TargetPort":80,"PublishedPort":8081,"PublishMode":"ingress"}] |
Ahora mismo, tal y como está, lo tendríamos preparado, pero no sería accesible desde la red externa 192.168.2.x/24 del resto de mis ordenadores de casa.
Usar HAProxy para cluster Docker Swarm
Para poder abrir los servicios al “mundo”, usaré HAProxy.
Instalo HAProxy en RPi4, el master:
1 |
root@p0:~# apt install haproxy -y |
Revisamos el servicio y lo habilitamos para el arranque:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
root@p0:~# systemctl status haproxy ● haproxy.service - HAProxy Load Balancer Loaded: loaded (/lib/systemd/system/haproxy.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2021-12-04 13:38:07 CET; 34s ago Docs: man:haproxy(1) file:/usr/share/doc/haproxy/configuration.txt.gz Main PID: 3232 (haproxy) Tasks: 2 (limit: 4915) Memory: 1.7M CGroup: /system.slice/haproxy.service ├─3232 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid └─3233 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid dic 04 13:38:07 p0 systemd[1]: Starting HAProxy Load Balancer... dic 04 13:38:07 p0 systemd[1]: Started HAProxy Load Balancer. root@p0:~# systemctl enable haproxy Synchronizing state of haproxy.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable haproxy |
Y agregamos al fichero /etc/haproxy/haproxy.cfg
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Configure HAProxy to listen on port 80 frontend http_front bind *:80 stats uri /haproxy?stats default_backend http_back # Configure HAProxy to route requests to swarm nodes on port 8081 backend http_back balance roundrobin server node1 172.19.181.1:8081 check server node2 172.19.181.2:8081 check server node3 172.19.181.3:8081 check server node4 172.19.181.254:8081 check |
Reiniciamos servicio y comprobamos:
1 |
systemctl restart haproxy |
La URL desde nuestra red será http://192.168.2.197:8081
Si escalamos los containers, veremos que da igual en qué nodo corran:
1 2 3 4 5 6 7 8 |
root@p0:~# docker service scale pruebaweb=4 pruebaweb scaled to 4 overall progress: 4 out of 4 tasks 1/4: running [==================================================>] 2/4: running [==================================================>] 3/4: running [==================================================>] 4/4: running [==================================================>] verify: Service converged |
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?