Johdanto
Edellytykset
Kuka olen
Asetetaan Traefik
Kuinka se toimii
Johdanto
Docker Swarm muuttaa yksittäiset palvelimesi tietokoneklusteriksi; helpottaa skaalausta, korkeaa käytettävyyttä ja kuormituksen tasapainottamista. Swarm-kuormituksen tasapainottaja toteuttaa round-robin-kuormituksen tasapainotusstrategian, ja tämä saattaa häiritä (vanhojen) tilallisten sovellusten oikeaa toimintaa, jotka vaativat jonkinlaisia takertuvia istuntoja mahdollistaakseen korkean käytettävissä olevan asennuksen useilla esiintymillä. Docker Enterprise Edition tukee Layer-7 sticky -istuntoa, mutta tässä oppaassa keskitymme Dockerin ilmaiseen (CE) versioon. Kiinnittyvien istuntojen toteuttamiseen käytämme Traefikia.
Edellytykset
- Vähintään kaksi juuri käyttöön otettua ja päivitettyä Debian 9 -esiintymää samassa aliverkossa, joissa yksityinen verkko on käytössä
- Docker CE asennettuna näihin tapauksiin
- Elementtien tulee olla osa samaa Swarmia, ja niiden pitäisi pystyä kommunikoimaan keskenään yksityisen verkon kautta
- Aiempi tuntemus Dockerista ja Docker Swarmista
- Ei-root-käyttäjä, jolla on
sudo
oikeudet (valinnainen, mutta on erittäin suositeltavaa olla käyttämättä pääkäyttäjää)
Tässä opetusohjelmassa käytämme kahta Vultr-instanssia yksityisillä IP-osoitteilla 192.168.0.100
ja 192.168.0.101
. Molemmat ovat Docker Swarm -hallintasolmuja (joka ei ole ihanteellinen tuotantoon, mutta riittää tähän opetusohjelmaan).
Kuka olen
Tämä opetusohjelma käyttää jwilder/whoami
Docker-kuvaa esittelysovelluksena. Tämä yksinkertainen säilö vastaa REST-kutsuun vastaavan säilön nimellä, joten on erittäin helppoa testata, toimivatko pysyvät istunnot. Tätä kuvaa käytetään luonnollisesti vain esittelytarkoituksiin, ja se on korvattava omalla sovelluksesi kuvalla.
Whoami-palvelu on konfiguroitu seuraavasti:
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
Jos käytämme myöhemmin curl
whoami REST -päätepistettä kohdassa http://192.168.0.100/
, voimme nähdä Docker Swarmin kuormituksen tasapainotuksen:
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
Tätä ei kannata testata nykyaikaisilla selaimilla, kuten Chromella tai Firefoxilla, koska ne on suunniteltu pitämään yhteydet elossa, ja Docker Swarm -kuormituksen tasapainottaja vaihtaa toiseen säiliöön vain jokaisen uuden yhteyden yhteydessä. Jos haluat testata tätä selaimella, sinun on odotettava vähintään 30 sekuntia yhteyden sulkeutumista ennen kuin päivität sen uudelleen.
Asetetaan Traefik
Traefik tukee alkuperäisesti Docker Swarmia, se voi havaita ja rekisteröidä kontteja tai poistaa niiden rekisteröinnit lennossa ja kommunikoi sovelluksesi kanssa sisäisen peittoverkon kautta. Traefik tarvitsee tietoja sovelluksestasi ennen kuin se voi käsitellä sitä koskevia pyyntöjä. Nämä tiedot toimitetaan Traefikille lisäämällä tarrat Swarm-palveluusi:
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
Seuraavassa luettelossa kuvataan, mitä kukin tarra tarkoittaa:
traefik.docker.network
: Docker-peittoverkko, jonka kautta Traefik kommunikoi palvelusi kanssa
traefik.port
: Portti, jota palvelusi kuuntelee (tämä on sisäisesti esillä oleva portti, ei julkaistu portti)
traefik.frontend.rule
: PathPrefix:/
sitoo kontekstin juuren /
tähän palveluun
traefik.backend.loadbalancer.stickiness
: Ottaa käyttöön tämän palvelun pysyvät istunnot
Nyt whoami-service
kun tarvittavat tarrat on konfiguroitu, voimme lisätä Traefik-palvelun parveen:
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
Tämä komento tekee melko paljon asioita kerralla, kuten seuraavassa luettelossa näkyy:
--name traefik
: Uuden Docker-palvelumme nimi on Traefik
-p8080:80
: Julkaisemme Traefikin portista 80
portille, 8080
koska portti 80
on jo whoami-palvelumme käytössä
-p9090:8080
: Julkaisemme Traefikin oman web-käyttöliittymän porttiin 9090
--mount ...
: Asennamme Docker Socketin säiliöön, jotta Traefik pääsee käsiksi isännän Docker-ajoaikaan
--global
: Haluamme Traefik-kontit jokaiseen managerisolmuun korkean käytettävyyden vuoksi
--constraint 'node.role == manager'
: Haluamme, että Traefik toimii vain johtajasolmuissa, koska työntekijäsolmut eivät pysty tarjoamaan Traefikille sen tarvitsemia tietoja. Esimerkiksi docker service ls
työntekijäsolmu ei toimi, joten Traefik ei edes pystyisi selvittämään, mitkä palvelut ovat käynnissä
--network whoaminet
: Yhdistä Traefik samaan verkkoon kuin meidän whoami-service
, muuten se ei voi muodostaa yhteyttä siihen. Kerroimme aiemmin Traefikille yhteyden palveluumme tämän verkon kautta traefik.docker.network
etiketillä
traefik
: Pyydä Dockeria käyttämään viimeisintä Traefik Docker -kuvaa tälle palvelulle
--docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG
: Komentoriviargumentit välitetään suoraan Traefikille, jotta se voisi toimia Docker-parvitilassa. DEBUG
on valinnainen täällä, mutta mielenkiintoinen asennuksen aikana ja tässä opetusohjelmassa
Ei tarvitse kuin avata tarvittavat portit Debianin palomuurissa:
sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 9090 -j ACCEPT
Kuinka se toimii
Heti kun Traefik käynnistyy, voit nähdä lokeista, että Traefik löytää kaksi whoami
konttia. Se myös tulostaa evästeen nimen, jota se käyttää kiinnittyvän istunnon käsittelemiseen:
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"
Jos käymme kiinni, http://192.168.0.100:8080
voimme nähdä, että uusi eväste, _a49bc
, on asetettu:
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
Jos lähetämme tämän evästeen seuraavissa puheluissa Traefikille, meidät ohjataan aina samaan säiliöön:
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
Eväste sisältää vain sen kontin sisäisen IP-osoitteen, johon Traefikin tulee lähettää pyyntö. Jos muutat evästeen arvoksi http://10.0.0.4:8000
, pyyntö välitettäisiin käytännössä toiseen säilöön. Jos evästettä ei koskaan lähetettäisi uudelleen Traefikille, kiinnitysistunto ei toimi ja pyynnöt tasapainotetaan sovelluksen säilöjen ja Traefik-säilöjen välillä.
Se on kaikki mitä tarvitaan Layer 7 Sticky Sessionsin määrittämiseen Docker CE:ssä Debian 9:ssä.