Introducció
Requisits previs
Qui sóc
Configuració de Traefik
Com funciona
Introducció
Docker Swarm converteix els vostres servidors individuals en un clúster d'ordinadors; facilitant l'escalat, l'alta disponibilitat i l'equilibri de càrrega. L'equilibrador de càrrega Swarm implementa una estratègia d'equilibri de càrrega circular, i això pot interferir en el funcionament correcte de les aplicacions amb estat (heretats) que requereixen algun tipus de sessions enganxades per permetre una configuració d'alta disponibilitat amb múltiples instàncies. Docker Enterprise Edition admet la sessió adhesiva de capa 7, però en aquesta guia ens centrarem en la versió gratuïta (CE) de Docker. Per implementar sessions adhesives farem servir Traefik.
Requisits previs
- Almenys dues instàncies de Debian 9 recentment implementades i actualitzades a la mateixa subxarxa amb la xarxa privada activada
- Docker CE instal·lat en aquestes instàncies
- Les instàncies haurien de formar part del mateix Swarm i haurien de poder comunicar-se entre elles a través de la xarxa privada
- Coneixements previs de Docker i Docker Swarm
- Un usuari que no sigui root amb
sudo
drets (opcional, però és molt recomanable no utilitzar l'usuari root)
En aquest tutorial farem servir dues instàncies de Vultr amb adreces IP privades 192.168.0.100
i 192.168.0.101
. Tots dos són nodes gestors de Docker Swarm (que no és ideal per a la producció, però suficient per a aquest tutorial).
Qui sóc
Aquest tutorial utilitza la jwilder/whoami
imatge de Docker com a aplicació de demostració. Aquest senzill contenidor respondrà a una trucada REST amb el nom del contenidor que respon, de manera que és molt fàcil provar si les sessions enganxades funcionen. Evidentment, aquesta imatge només s'utilitza amb finalitats de demostració i s'ha de substituir per la imatge de la vostra aplicació.
El servei whoami està configurat de la següent manera:
sudo docker network create whoaminet -d overlay
sudo docker service create --name whoami-service --mode global --network whoaminet --publish "80:8000" jwilder/whoami
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
Si posteriorment fem curl
el punt final de REST whoami a http://192.168.0.100/
, podem veure l'equilibri de càrrega de Docker Swarm en funcionament:
curl http://192.168.0.100
I'm a6a8c9294fc3
curl http://192.168.0.100
I'm ae9d1763b4ad
curl http://192.168.0.100
I'm a6a8c9294fc3
curl http://192.168.0.100
I'm ae9d1763b4ad
curl http://192.168.0.100
I'm a6a8c9294fc3
No serveix de res provar-ho amb navegadors moderns com Chrome o Firefox perquè estan dissenyats per mantenir les connexions vives, i l'equilibrador de càrrega Docker Swarm només canviarà a l'altre contenidor amb cada connexió nova . Si voleu provar-ho amb un navegador, haureu d'esperar almenys 30 segons perquè la connexió es tanqui abans de tornar a actualitzar.
Configuració de Traefik
Traefik admet de manera nativa Docker Swarm, pot detectar i registrar o cancel·lar el registre de contenidors sobre la marxa i es comunica amb la vostra aplicació a través de la xarxa interna de superposició. Traefik necessita informació sobre la vostra aplicació abans que pugui començar a gestionar-ne les sol·licituds. Aquesta informació es proporciona a Traefik afegint etiquetes al vostre servei Swarm:
sudo docker service update --label-add "traefik.docker.network=whoaminet" --label-add "traefik.port=8000" --label-add "traefik.frontend.rule=PathPrefix:/" --label-add "traefik.backend.loadbalancer.stickiness=true" whoami-service
La llista següent descriu el significat de cada etiqueta:
traefik.docker.network
: La xarxa de superposició de Docker, a través de la qual Traefik es comunicarà amb el vostre servei
traefik.port
: el port on està escoltant el vostre servei (és el port exposat internament, no el port publicat)
traefik.frontend.rule
: PathPrefix:/
enllaça l'arrel de context ' /
' a aquest servei
traefik.backend.loadbalancer.stickiness
: activa sessions enganxades per a aquest servei
Ara que whoami-service
s'ha configurat amb les etiquetes necessàries, podem afegir el servei Traefik a l'eixam:
sudo docker service create --name traefik -p8080:80 -p9090:8080 --mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock --mode=global --constraint 'node.role == manager' --network whoaminet traefik --docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG
Aquesta ordre fa moltes coses alhora, com es mostra a la llista següent:
--name traefik
: El nom del nostre nou servei Docker és Traefik
-p8080:80
: publiquem el port 80
a port de Traefik 8080
perquè 80
el nostre servei whoami ja està en ús
-p9090:8080
: publiquem la interfície web pròpia de Traefik al port 9090
--mount ...
: Muntem el Socket Docker al contenidor perquè Traefik pugui accedir al temps d'execució de Docker de l'amfitrió
--global
: Volem contenidors Traefik a cada node gestor per motius d'alta disponibilitat
--constraint 'node.role == manager'
: només volem que Traefik s'executi en nodes de gestor perquè els nodes de treball no poden proporcionar a Traefik la informació que necessita. Per exemple, docker service ls
en un node de treball no funciona, de manera que Traefik ni tan sols podria descobrir quins serveis s'estan executant
--network whoaminet
: Connecteu Traefik a la mateixa xarxa que la nostra whoami-service
, en cas contrari no s'hi podrà connectar. Abans li vam dir a Traefik que es connectés al nostre servei a través d'aquesta xarxa amb l' traefik.docker.network
etiqueta
traefik
: Digueu a Docker que utilitzi la darrera imatge de Docker de Traefik per a aquest servei
--docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG
: els arguments de la línia d'ordres s'han passat directament a Traefik per permetre que s'executi en mode eixam Docker. DEBUG
és opcional aquí, però interessant durant la configuració i per a aquest tutorial
Tot el que queda per fer és obrir els ports necessaris al tallafoc de Debian:
sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 9090 -j ACCEPT
Com funciona
Tan bon punt en Traefik s'engega, podeu veure als registres que Traefik descobreix els dos whoami
contenidors. També mostra el nom de la galeta que utilitzarà per gestionar la sessió enganxosa:
time="2018-11-25T13:17:30Z" level=debug msg="Configuration received from provider docker: {\"backends\":{\"backend-whoami-service\":{\"servers\":{\"server-whoami-service-1-a179b2e38a607b1127e5537c2e614b05\":{\"url\":\"http://10.0.0.5:8000\",\"weight\":1},\"server-whoami-service-2-df8a622478a5a709fcb23c50e689b5b6\":{\"url\":\"http://10.0.0.4:8000\",\"weight\":1}},\"loadBalancer\":{\"method\":\"wrr\",\"stickiness\":{}}}},\"frontends\":{\"frontend-PathPrefix-0\":{\"entryPoints\":[\"http\"],\"backend\":\"backend-whoami-service\",\"routes\":{\"route-frontend-PathPrefix-0\":{\"rule\":\"PathPrefix:/\"}},\"passHostHeader\":true,\"priority\":0,\"basicAuth\":null}}}"
time="2018-11-25T13:17:30Z" level=debug msg="Wiring frontend frontend-PathPrefix-0 to entryPoint http"
time="2018-11-25T13:17:30Z" level=debug msg="Creating backend backend-whoami-service"
time="2018-11-25T13:17:30Z" level=debug msg="Adding TLSClientHeaders middleware for frontend frontend-PathPrefix-0"
time="2018-11-25T13:17:30Z" level=debug msg="Creating load-balancer wrr"
time="2018-11-25T13:17:30Z" level=debug msg="Sticky session with cookie _a49bc"
time="2018-11-25T13:17:30Z" level=debug msg="Creating server server-whoami-service-1-a179b2e38a607b1127e5537c2e614b05 at http://10.0.0.5:8000 with weight 1"
time="2018-11-25T13:17:30Z" level=debug msg="Creating server server-whoami-service-2-df8a622478a5a709fcb23c50e689b5b6 at http://10.0.0.4:8000 with weight 1"
time="2018-11-25T13:17:30Z" level=debug msg="Creating route route-frontend-PathPrefix-0 PathPrefix:/"
time="2018-11-25T13:17:30Z" level=info msg="Server configuration reloaded on :80"
time="2018-11-25T13:17:30Z" level=info msg="Server configuration reloaded on :8080"
Si ens enrosquem http://192.168.0.100:8080
podem veure que _a49bc
s'ha establert una nova galeta, ,:
curl -v http://192.168.0.100:8080
* About to connect() to 192.168.0.100 port 8080 (#0)
* Trying 192.168.0.100...
* Connected to 192.168.0.100 (192.168.0.100) port 8080 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 192.168.0.100:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 17
< Content-Type: text/plain; charset=utf-8
< Date: Sun, 25 Nov 2018 13:18:40 GMT
< Set-Cookie: _a49bc=http://10.0.0.5:8000; Path=/
<
I'm a6a8c9294fc3
* Connection #0 to host 192.168.0.100 left intact
Si, en trucades posteriors, enviem aquesta galeta a Traefik, sempre serem reenviats al mateix contenidor:
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
La galeta no conté més que l'adreça IP interna del contenidor al qual Traefik hauria d'enviar per sol·licitar. Si canvieu el valor de la galeta a http://10.0.0.4:8000
, la sol·licitud es reenviarà efectivament a l'altre contenidor. Si la galeta no s'hagués de tornar a enviar mai a Traefik, la sessió enganxosa no funcionarà i les sol·licituds s'equilibraran entre els contenidors de l'aplicació i els contenidors de Traefik.
Això és tot el que es necessita per configurar les sessions adhesives de la capa 7 a Docker CE a Debian 9.