Ievads
Priekšnoteikumi
Kas es esmu
Traefik iestatīšana
Kā tas strādā
Ievads
Docker Swarm pārvērš jūsu individuālos serverus par datoru kopu; atvieglo mērogošanu, augstu pieejamību un slodzes līdzsvarošanu. Swarm slodzes līdzsvarotājs ievieš visaptverošu slodzes līdzsvarošanas stratēģiju, un tas var traucēt (mantoto) statusu lietojumprogrammu pareizai darbībai, kurām ir nepieciešamas zināmas fiksētas sesijas, lai nodrošinātu augstu pieejamo iestatīšanu ar vairākiem gadījumiem. Docker Enterprise Edition atbalsta Layer-7 lipīgo sesiju, taču šajā rokasgrāmatā mēs koncentrēsimies uz Docker bezmaksas (CE) versiju. Lai ieviestu lipīgās sesijas, mēs izmantosim Traefik.
Priekšnoteikumi
- Vismaz divi tikko izvietoti un atjaunināti Debian 9 gadījumi vienā apakštīklā ar iespējotu privāto tīklu
- Šajos gadījumos instalēts Docker CE
- Gadījumiem ir jābūt viena un tā paša spieta daļai un jāspēj sazināties vienam ar otru, izmantojot privāto tīklu
- Priekšzināšanas par Docker un Docker Swarm
- Lietotājs, kas nav root lietotājs ar
sudo
tiesībām (neobligāts, taču ļoti ieteicams neizmantot root lietotāju)
Šajā apmācībā mēs izmantosim divus Vultr gadījumus ar privātām IP adresēm 192.168.0.100
un 192.168.0.101
. Abi no tiem ir Docker Swarm menedžeru mezgli (kas nav ideāli piemērots ražošanai, taču ir pietiekami šai apmācībai).
Kas es esmu
Šajā apmācībā jwilder/whoami
docker attēls tiek izmantots kā demonstrācijas lietojumprogramma. Šis vienkāršais konteiners atbildēs uz REST zvanu ar atbildīgā konteinera nosaukumu, padarot to ļoti viegli pārbaudīt, vai lipīgās sesijas darbojas. Šis attēls acīmredzami tiek izmantots tikai demonstrācijas nolūkos, un tas ir jāaizstāj ar jūsu lietojumprogrammas attēlu.
Whoami pakalpojums ir konfigurēts šādi:
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
Ja pēc tam mēs curl
izmantojam whoami REST galapunktu http://192.168.0.100/
, mēs varam redzēt, ka darbojas Docker Swarm slodzes līdzsvarošana:
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
Nav jēgas to pārbaudīt ar modernām pārlūkprogrammām, piemēram, Chrome vai Firefox, jo tie ir paredzēti, lai uzturētu savienojumus, un Docker Swarm slodzes balansētājs pārslēgsies uz citu konteineru tikai pēc katra jauna savienojuma. Ja vēlaties to pārbaudīt pārlūkprogrammā, pirms atkārtotas atsvaidzināšanas ir jāgaida vismaz 30 sekundes, līdz savienojums tiks aizvērts.
Traefik iestatīšana
Traefik sākotnēji atbalsta Docker Swarm, tas var atklāt un reģistrēt vai atcelt konteinerus lidojumā, un tas sazinās ar jūsu lietojumprogrammu iekšējā pārklājuma tīklā. Traefik ir nepieciešama informācija par jūsu lietojumprogrammu, lai tas varētu sākt apstrādāt pieprasījumus. Šī informācija tiek nodrošināta Traefik, pievienojot etiķetes jūsu Swarm pakalpojumam:
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
Šajā sarakstā ir aprakstīts katras etiķetes nozīme.
traefik.docker.network
: Docker pārklājuma tīkls, kurā Traefik sazināsies ar jūsu pakalpojumu
traefik.port
: ports, kurā klausās jūsu pakalpojums (šis ir iekšēji atklātais ports, nevis publicētais ports)
traefik.frontend.rule
: PathPrefix:/
saista konteksta sakni " /
" ar šo pakalpojumu
traefik.backend.loadbalancer.stickiness
: šim pakalpojumam iespējo fiksētās sesijas
Tagad, kad whoami-service
ir konfigurēts ar nepieciešamajām etiķetēm, mēs varam pievienot Traefik pakalpojumu baram:
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
Šī komanda vienlaikus veic diezgan daudz lietu, kā parādīts šajā sarakstā:
--name traefik
: Mūsu jaunā Docker pakalpojuma nosaukums ir Traefik
-p8080:80
: Mēs publicējam Traefik portu 80
portu, 8080
jo portu 80
jau izmanto mūsu whoami-serviss
-p9090:8080
: Mēs publicējam paša Traefik tīmekļa saskarni portam 9090
--mount ...
: mēs uzstādām Docker Socket konteinerā, lai Traefik varētu piekļūt resursdatora Docker izpildlaikam
--global
: Mēs vēlamies Traefik konteinerus katrā pārvaldnieka mezglā augstas pieejamības iemeslu dēļ
--constraint 'node.role == manager'
: mēs vēlamies, lai Traefik darbotos tikai pārvaldnieka mezglos, jo darbinieku mezgli nevar nodrošināt Traefik tai nepieciešamo informāciju. Piemēram, docker service ls
darbinieka mezglā nedarbojas, tāpēc Traefik pat nevarētu atklāt, kādi pakalpojumi darbojas
--network whoaminet
: pievienojiet Traefik tam pašam tīklam kā mūsu whoami-service
, pretējā gadījumā tas nevar izveidot savienojumu ar to. Mēs iepriekš teicām Traefik izveidot savienojumu ar mūsu pakalpojumu, izmantojot šo tīklu ar traefik.docker.network
etiķeti
traefik
: Pastāstiet dokerim šim pakalpojumam izmantot jaunāko Traefik docker attēlu
--docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG
: Komandrindas argumenti tiek tieši nosūtīti Traefik, lai tas varētu darboties Docker spieta režīmā. DEBUG
šeit ir neobligāts, taču interesants iestatīšanas laikā un šai apmācībai
Viss, kas jādara, ir atvērt nepieciešamos portus Debian ugunsmūrī:
sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 9090 -j ACCEPT
Kā tas strādā
Tiklīdz Traefik sāk darboties, žurnālos var redzēt, ka Traefik atklāj abus whoami
konteinerus. Tas arī izvada sīkfaila nosaukumu, ko tas izmantos lipīgās sesijas apstrādei:
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"
Ja pievēršamies, http://192.168.0.100:8080
mēs redzam, ka _a49bc
ir iestatīts jauns sīkfails :
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
Ja turpmākajos zvanos mēs nosūtīsim šo sīkfailu Traefik, mēs vienmēr tiksim pārsūtīti uz to pašu konteineru:
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
Sīkdatnē ir ietverta tikai konteinera iekšējā IP adrese, uz kuru Traefik ir jānosūta pieprasījums. Ja maināt uz sīkfaila vērtību uz http://10.0.0.4:8000
, pieprasījums faktiski tiks pārsūtīts uz citu konteineru. Ja sīkfails nekad netiktu atkārtoti nosūtīts uz Traefik, lipīgā sesija nedarbosies un pieprasījumi tiks līdzsvaroti starp lietojumprogrammas konteineriem un Traefik konteineriem.
Tas ir viss, kas nepieciešams, lai iestatītu Layer 7 Sticky Sessions programmā Docker CE uz Debian 9.