Įvadas
Būtinos sąlygos
Kas aš esu
„Traefik“ nustatymas
Kaip tai veikia
Įvadas
„Docker Swarm“ paverčia jūsų atskirus serverius kompiuterių grupe; palengvinantis mastelio keitimą, aukštą prieinamumą ir apkrovos balansavimą. Swarm apkrovos balansavimo priemonė įgyvendina visapusišką apkrovos balansavimo strategiją, ir tai gali trukdyti tinkamai veikti (senoms) būseną turinčioms programoms, kurioms reikia tam tikros formos fiksuotų seansų, kad būtų galima atlikti daug pasiekiamą sąranką su keliais egzemplioriais. „Docker Enterprise Edition“ palaiko „Layer-7“ lipnią seansą, tačiau šiame vadove daugiausia dėmesio skirsime nemokama (CE) „Docker“ versijai. Norėdami įgyvendinti lipnias sesijas, naudosime Traefik.
Būtinos sąlygos
- Bent du naujai įdiegti ir atnaujinti Debian 9 egzemplioriai tame pačiame potinklyje su įjungtu privačiu tinklu
- Šiuose egzemplioriuose įdiegta „Docker CE“.
- Egzemplioriai turėtų būti to paties spiečiaus dalis ir turėti galimybę bendrauti tarpusavyje privačiu tinklu
- Išankstinės Docker ir Docker Swarm žinios
- Ne root naudotojas, turintis
sudo
teises (neprivaloma, bet primygtinai patariama nenaudoti root vartotojo)
Šioje pamokoje naudosime du Vultr egzempliorius su privačiais IP adresais 192.168.0.100
ir 192.168.0.101
. Abu jie yra „Docker Swarm“ vadybiniai mazgai (kuris nėra idealus gamybai, bet pakankamai šiai mokymo programai).
Kas aš esu
Šioje mokymo programoje naudojamas jwilder/whoami
docker vaizdas kaip demonstracinė programa. Šis paprastas konteineris atsakys į REST skambutį su atsakančio konteinerio pavadinimu, todėl bus labai lengva patikrinti, ar veikia lipnios sesijos. Akivaizdu, kad šis vaizdas naudojamas tik demonstraciniais tikslais ir jį reikia pakeisti jūsų programos vaizdu.
Whoami paslauga sukonfigūruota taip:
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
Jei vėliau curl
susikursime whoami REST galutinį tašką http://192.168.0.100/
, pamatysime, kaip veikia Docker Swarm apkrovos balansavimas:
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
Neverta tai išbandyti naudojant šiuolaikines naršykles, pvz., „Chrome“ ar „Firefox“, nes jos skirtos palaikyti ryšį, o „Docker Swarm“ apkrovos balansavimo priemonė persijungs į kitą talpyklą tik po kiekvieno naujo prisijungimo. Jei norite tai išbandyti naudodami naršyklę, prieš atnaujindami vėl turėsite palaukti bent 30 sekundžių, kol ryšys užsidarys.
„Traefik“ nustatymas
„Traefik“ iš esmės palaiko „Docker Swarm“, jis gali aptikti ir užregistruoti konteinerius arba išregistruoti juos skrydžio metu ir palaiko ryšį su jūsų programa per vidinį perdangos tinklą. „Traefik“ reikia šiek tiek informacijos apie jūsų programą, kad galėtų pradėti tvarkyti su ja susijusias užklausas. Ši informacija pateikiama Traefik pridedant etiketes prie jūsų Swarm paslaugos:
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
Toliau pateiktame sąraše aprašoma, ką reiškia kiekviena etiketė:
traefik.docker.network
: „Docker“ perdangos tinklas, per kurį „Traefik“ susisieks su jūsų paslauga
traefik.port
: prievadas, kuriame klausosi jūsų paslauga (tai yra viduje atskleistas prievadas, o ne paskelbtas prievadas)
traefik.frontend.rule
: PathPrefix:/
susieja konteksto šaknį „ /
“ su šia paslauga
traefik.backend.loadbalancer.stickiness
: įgalina šios paslaugos fiksuotus seansus
Dabar, kai whoami-service
sukonfigūruotas reikiamas etiketes, prie būrio galime pridėti „Traefik“ paslaugą:
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
Ši komanda vienu metu atlieka gana daug dalykų, kaip parodyta šiame sąraše:
--name traefik
: Mūsų naujoji „Docker“ paslauga vadinasi „Traefik“.
-p8080:80
: Mes skelbiame Traefik prievadą 80
prie uosto, 8080
nes prievadą 80
jau naudoja mūsų whoami paslauga
-p9090:8080
: Mes skelbiame „Traefik“ žiniatinklio sąsają prie prievado 9090
--mount ...
: Sumontuojame „Docker Socket“ į konteinerį, kad „Traefik“ galėtų pasiekti pagrindinio kompiuterio „Docker“ vykdymo laiką
--global
: Mes norime, kad „Traefik“ konteineriai būtų kiekviename valdytojo mazge dėl didelio prieinamumo priežasčių
--constraint 'node.role == manager'
: Norime, kad „Traefik“ veiktų tik vadovo mazguose, nes darbuotojų mazgai negali suteikti „Traefik“ reikalingos informacijos. Pavyzdžiui, docker service ls
darbuotojo mazgas neveikia, todėl Traefik net negalėtų sužinoti, kokios paslaugos veikia
--network whoaminet
: Prijunkite Traefik prie to paties tinklo kaip ir mūsų whoami-service
, kitaip jis negalės prie jo prisijungti. Anksčiau liepėme „Traefik“ prisijungti prie mūsų paslaugos per šį tinklą su traefik.docker.network
etikete
traefik
: nurodykite dokeriui, kad šiai paslaugai naudotų naujausią „Traefik Docker“ vaizdą
--docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG
: Komandinės eilutės argumentai perduodami tiesiogiai „Traefik“, kad jis veiktų „Docker“ spiečiaus režimu. DEBUG
čia neprivalomas, bet įdomus sąrankos metu ir šiai mokymo programai
Viskas, ką reikia padaryti, tai atidaryti reikiamus prievadus Debiano užkardoje:
sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 9090 -j ACCEPT
Kaip tai veikia
Kai tik Traefik paleidžiamas, žurnaluose matote, kad Traefik aptinka du whoami
konteinerius. Jis taip pat išveda slapuko pavadinimą, kurį naudos tvarkydamas priklijuotą seansą:
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"
Jei pasilenksime, http://192.168.0.100:8080
pamatysime, kad _a49bc
buvo nustatytas naujas slapukas :
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
Jei vėliau skambindami išsiųsime šį slapuką „Traefik“, visada būsime nukreipti į tą patį konteinerį:
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
Slapuke yra ne kas kita, kaip vidinis konteinerio IP adresas, į kurį „Traefik“ turėtų siųsti užklausą. Jei pakeisite slapuko vertę į http://10.0.0.4:8000
, užklausa bus iš esmės persiųsta į kitą sudėtinį rodinį. Jei slapukas niekada nebūtų iš naujo siunčiamas „Traefik“, lipni seansas neveiks ir užklausos bus subalansuotos tarp programos konteinerių ir „Traefik“ konteinerių.
Tai viskas, ko reikia norint nustatyti „Layer 7 Sticky Sessions“ „Docker CE“ sistemoje „Debian 9“.