Uvod
Preduvjeti
Tko sam ja
Postavljanje Traefika
Kako radi
Uvod
Docker Swarm pretvara vaše pojedinačne poslužitelje u klaster računala; olakšava skaliranje, visoku dostupnost i balansiranje opterećenja. Swarm balansator opterećenja implementira kružnu strategiju uravnoteženja opterećenja, a to bi moglo ometati ispravno funkcioniranje (naslijeđenih) aplikacija s stanjem koje zahtijevaju neki oblik ljepljivih sesija kako bi se omogućilo visokodostupno postavljanje s višestrukim instancama. Docker Enterprise Edition podržava ljepljivu sesiju Layer-7, ali u ovom vodiču ćemo se usredotočiti na besplatnu (CE) verziju Dockera. Za implementaciju ljepljivih sesija koristit ćemo Traefik.
Preduvjeti
- Najmanje dvije svježe implementirane i ažurirane instance Debiana 9 u istoj podmreži s omogućenim privatnim umrežavanjem
- Docker CE instaliran na ovim instancama
- Instance bi trebale biti dio istog roja i trebale bi moći međusobno komunicirati putem privatne mreže
- Prethodno poznavanje Dockera i Docker Swarma
- Nekorijenski korisnik s
sudopravima (izborno, ali se preporuča ne koristiti root korisnika)
U ovom vodiču koristit ćemo dvije Vultr instance s privatnim IP adresama 192.168.0.100i 192.168.0.101. Oba su Docker Swarm manager čvorovi (što nije idealno za proizvodnju, ali dovoljno za ovaj tutorial).
Tko sam ja
Ovaj vodič koristi jwilder/whoamidocker sliku kao demo aplikaciju. Ovaj jednostavan spremnik će odgovoriti na REST poziv s imenom spremnika koji odgovara, što ga čini vrlo lakim za testiranje rade li ljepljive sesije. Ova se slika očito koristi samo u demo svrhe i treba je zamijeniti slikom vaše aplikacije.
Whoami-usluga je konfigurirana na sljedeći način:
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
Ako naknadno pogledamo curlwhoami REST krajnju točku na http://192.168.0.100/, možemo vidjeti kako radi kružno balansiranje opterećenja Docker Swarma:
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
Nema svrhe testirati ovo s modernim preglednicima poput Chromea ili Firefoxa jer su dizajnirani da održavaju veze na životu, a Docker Swarm balansator opterećenja će se prebaciti na drugi spremnik samo nakon svake nove veze. Ako to želite testirati s preglednikom, morat ćete pričekati najmanje 30 sekundi da se veza zatvori prije ponovnog osvježavanja.
Postavljanje Traefika
Traefik izvorno podržava Docker Swarm, može otkriti i registrirati ili deregistrirati kontejnere u hodu i komunicira s vašom aplikacijom preko interne mreže za prekrivanje. Traefik-u su potrebne neke informacije o vašoj aplikaciji prije nego što počne obrađivati zahtjeve za nju. Ove informacije se Traefik-u pružaju dodavanjem oznaka vašoj Swarm usluzi:
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
Sljedeći popis opisuje što svaka oznaka znači:
traefik.docker.network : Docker overlay mreža, preko koje će Traefik komunicirati s vašom uslugom
traefik.port : priključak na kojem vaša usluga sluša (ovo je interno izloženi port, a ne objavljeni priključak)
traefik.frontend.rule: PathPrefix:/ veže korijen konteksta ' /' s ovom uslugom
traefik.backend.loadbalancer.stickiness : Omogućuje ljepljive sesije za ovu uslugu
Sada whoami-servicekada je konfiguriran s potrebnim oznakama, možemo dodati uslugu Traefik u roj:
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
Ova naredba radi dosta stvari odjednom, kao što je prikazano na sljedećem popisu:
--name traefik : Naziv naše nove Docker usluge je Traefik
-p8080:80: Objavljujemo Traefik's port 80to port 8080jer port 80već koristi naš whoami-servis
-p9090:8080 : Objavljujemo Traefikovo vlastito web sučelje za port 9090
--mount ... : Montiramo Docker Socket u spremnik tako da Traefik može pristupiti hostovom Docker runtime-u
--global : Želimo Traefik kontejnere na svakom čvoru upravitelja iz razloga visoke dostupnosti
--constraint 'node.role == manager': Želimo da se Traefik izvodi samo na čvorovima upravitelja jer radnički čvorovi ne mogu pružiti Traefik-u potrebne informacije. Na primjer, docker service lsna radnom čvoru ne radi, tako da Traefik ne bi mogao ni otkriti koje usluge se pokreću
--network whoaminet: Spojite Traefik na istu mrežu kao i naš whoami-service, inače se ne može spojiti na nju. Prethodno smo rekli Traefiku da se poveže s našom uslugom preko ove mreže s traefik.docker.networkoznakom
traefik : Recite docker-u da koristi najnoviju Traefik docker sliku za ovu uslugu
--docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG: Argumenti naredbenog retka proslijeđeni izravno Traefik-u kako bi mu se omogućilo izvođenje u načinu Docker roja. DEBUGovdje je neobavezno, ali zanimljivo tijekom postavljanja i za ovaj vodič
Sve što je preostalo je otvoriti potrebne portove u Debian firewall:
sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 9090 -j ACCEPT
Kako radi
Čim se Traefik pokrene, možete vidjeti u zapisnicima da Traefik otkriva dva whoamikontejnera. Također ispisuje naziv kolačića koji će koristiti za rukovanje ljepljivom sesijom:
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"
Ako se savijemo na, http://192.168.0.100:8080možemo vidjeti da je postavljen novi kolačić, _a49bc:
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
Ako u sljedećim pozivima ovaj kolačić pošaljemo Traefiku, uvijek ćemo biti proslijeđeni u isti spremnik:
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
Kolačić ne sadrži ništa osim interne IP adrese spremnika na koji Traefik treba poslati zahtjev. Ako promijenite vrijednost kolačića u http://10.0.0.4:8000, tada bi zahtjev zapravo bio proslijeđen drugom spremniku. Ako se kolačić nikada ne bi ponovno poslao Traefiku, tada ljepljiva sesija neće raditi i zahtjevi će biti uravnoteženi između spremnika aplikacije i Traefik spremnika.
To je sve što je potrebno za postavljanje Layer 7 Sticky Sessions u Docker CE na Debianu 9.