Sissejuhatus
Eeltingimused
Kes ma olen
Traefiku seadistamine
Kuidas see töötab
Sissejuhatus
Docker Swarm muudab teie üksikud serverid arvutite klastriks; hõlbustab skaleerimist, kõrget saadavust ja koormuse tasakaalustamist. Swarmi koormuse tasakaalustaja rakendab koormuse tasakaalustamise strateegiat ja see võib häirida (pärand) olekupõhiste rakenduste nõuetekohast toimimist, mis nõuavad teatud tüüpi kleepuvaid seansse, et võimaldada kõrgetasemelist seadistust mitme eksemplariga. Docker Enterprise Edition toetab Layer-7 kleepuvat seanssi, kuid selles juhendis keskendume Dockeri tasuta (CE) versioonile. Kleepuvate seansside rakendamiseks kasutame Traefikut.
Eeltingimused
- Vähemalt kaks värskelt juurutatud ja värskendatud Debian 9 eksemplari samas alamvõrgus, kus privaatvõrk on lubatud
- Nendele eksemplaridele installitud Docker CE
- Eksemplarid peaksid olema sama sülemi osad ja suutma üksteisega privaatvõrgu kaudu suhelda
- Eelteadmised Dockerist ja Docker Swarmist
- Mitte-juurkasutaja, kellel on
sudo
õigused (valikuline, kuid on tungivalt soovitatav mitte kasutada juurkasutajat)
Selles õpetuses kasutame kahte Vultri eksemplari privaatse IP-aadressiga 192.168.0.100
ja 192.168.0.101
. Mõlemad on Docker Swarmi haldurisõlmed (mis pole tootmiseks ideaalne, kuid selle õpetuse jaoks piisav).
Kes ma olen
See õpetus kasutab jwilder/whoami
dokkeri pilti demorakendusena. See lihtne konteiner vastab REST-kõnele vastava konteineri nimega, muutes kleepuvate seansside töötamise väga lihtsaks. Seda pilti kasutatakse ilmselt ainult demoeesmärkidel ja see tuleb asendada teie enda rakenduse pildiga.
Whoami-teenus on konfigureeritud järgmiselt:
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
Kui kasutame seejärel curl
whoami REST-i lõpp-punkti kohas http://192.168.0.100/
, näeme Docker Swarmi koormuse tasakaalustamist:
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
Seda pole mõtet testida kaasaegsete brauseritega, nagu Chrome või Firefox, kuna need on loodud ühenduste elus hoidmiseks ja Docker Swarmi koormuse tasakaalustaja lülitub teisele konteinerile ainult iga uue ühenduse korral. Kui soovite seda brauseris testida, peate enne uuesti värskendamist ootama vähemalt 30 sekundit, kuni ühendus sulgub.
Traefiku seadistamine
Traefik toetab algselt Docker Swarmi, suudab konteinereid käigupealt tuvastada ja registreerida või nende registreerimise tühistada ning suhtleb teie rakendusega sisemise ülekattevõrgu kaudu. Traefik vajab teie rakenduse kohta teavet, enne kui saab hakata selle taotlusi käsitlema. See teave edastatakse Traefikule, lisades oma Swarmi teenusele sildid:
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
Järgmises loendis kirjeldatakse iga sildi tähendust.
traefik.docker.network
: Dockeri ülekattevõrk, mille kaudu Traefik teie teenusega suhtleb
traefik.port
: port, mida teie teenus kuulab (see on sisemiselt avatud port, mitte avaldatud port)
traefik.frontend.rule
: PathPrefix:/
seob konteksti juure /
selle teenusega
traefik.backend.loadbalancer.stickiness
: lubab selle teenuse jaoks kleepuvad seansid
Nüüd, kui whoami-service
on vajalike siltidega seadistatud, saame lisada sülemi teenuse Traefik:
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
See käsk teeb üsna palju asju korraga, nagu on näidatud järgmises loendis:
--name traefik
: Meie uue Dockeri teenuse nimi on Traefik
-p8080:80
: Avaldame Traefiku sadamast 80
sadamasse, 8080
sest port 80
on juba meie whoami-teenuse kasutuses
-p9090:8080
: Avaldame pordile Traefiku enda veebiliidese 9090
--mount ...
: Paigaldame Docker Socketi konteinerisse, et Traefik pääseks juurde hosti Dockeri käitusajale
--global
: Soovime Traefiku konteinereid igasse haldurisõlme kõrge kättesaadavuse tõttu
--constraint 'node.role == manager'
: Soovime, et Traefik töötaks ainult haldurisõlmedes, kuna töötaja sõlmed ei suuda pakkuda Traefikule vajalikku teavet. Näiteks docker service ls
töötaja sõlmes ei tööta, nii et Traefik ei saaks isegi tuvastada, millised teenused töötavad
--network whoaminet
: Ühendage Traefik meiega samasse võrku whoami-service
, muidu ei saa sellega ühendust. Eelnevalt ütlesime Traefikule, et ühenduks meie teenusega selle traefik.docker.network
märgisega võrgu kaudu
traefik
: käskige dockeril kasutada selle teenuse jaoks uusimat Traefik dockeri pilti
--docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG
: käsurea argumendid edastati otse Traefikule, et see saaks töötada Dockeri sülemirežiimis. DEBUG
on siin valikuline, kuid huvitav seadistamise ajal ja selle õpetuse jaoks
Jääb üle vaid Debiani tulemüüris vajalikud pordid avada:
sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 9090 -j ACCEPT
Kuidas see töötab
Niipea kui Traefik käivitub, on logides näha, et Traefik avastab need kaks whoami
konteinerit. Samuti väljastab see küpsise nime, mida ta kasutab kleepuva seansi käsitlemiseks:
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"
Kui kõverdame, http://192.168.0.100:8080
näeme, et on seatud uus küpsis _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
Kui järgmistel kõnedel saadame selle küpsise Traefikule, suunatakse meid alati samasse konteinerisse:
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
Küpsis ei sisalda midagi peale konteineri sisemise IP-aadressi, kuhu Traefik peaks saatma päringu. Kui muudate küpsise väärtuseks http://10.0.0.4:8000
, edastatakse taotlus tegelikult teisele konteinerile. Kui küpsist ei saadeta kunagi Traefikule, siis kleepuva seansi seanss ei tööta ja taotlused jaotatakse rakenduse konteinerite ja Traefiku konteinerite vahel.
See on kõik, mida on vaja Debian 9-s Docker CE-s Layer 7 Sticky Sessions seadistamiseks.