Увод
Предуслови
Ко сам ја
Постављање Траефик-а
Како то ради
Увод
Доцкер Сварм претвара ваше појединачне сервере у кластер рачунара, олакшавајући скалирање, високу доступност и балансирање оптерећења. Сварм балансатор оптерећења примењује стратегију заокруженог балансирања оптерећења и то може ометати исправно функционисање (застарелих) апликација са стањем које захтевају неки облик лепљивих сесија да би се омогућило подешавање високе доступности са више инстанци. Доцкер Ентерприсе Едитион подржава лепљиву сесију Лаиер-7, али у овом водичу ћемо се фокусирати на бесплатну (ЦЕ) верзију Доцкер-а. За имплементацију лепљивих сесија користићемо Траефик.
Предуслови
- Најмање две свеже распоређене и ажуриране инстанце ЦентОС 7 у истој подмрежи са омогућеним приватним умрежавањем
- Доцкер ЦЕ инсталиран на овим инстанцама
- Инстанце треба да буду део истог роја и треба да буду у могућности да комуницирају једна са другом преко приватне мреже
- Претходно познавање Доцкер-а и Доцкер Сварм-а
- Корисник који није администратор са судо правима (опционо, али се препоручује да не користите роот корисника)
У овом водичу ћемо користити две Вултр инстанце са приватним ИП адресама 192.168.0.100 и 192.168.0.101, обе су Доцкер Сварм менаџерски чворови (што није идеално за производњу, али довољно за овај водич).
Ко сам ја
Овај водич користи jwilder/whoamiдоцкер слику као демо апликацију. Овај једноставан контејнер ће одговорити на РЕСТ позив именом контејнера који одговара, што олакшава тестирање да ли лепљиве сесије раде. Ова слика се користи само у демо сврхе и треба је заменити сликом ваше апликације. whoami-serviceЈе конфигурисан на следећи начин:
sudo docker network create whoaminet -d overlay
sudo docker service create --name whoami-service --mode global --network whoaminet --publish "80:8000" jwilder/whoami
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --reload
Ако бисмо касније ОДМОР крајња тачка у , можемо видети роунд робин оптерећења за балансирање на Доцкер Роја на послу.curlwhoamihttp://192.168.0.100/
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
Нема сврхе тестирати ово са модерним прегледачима као што су Цхроме или Фирефок јер су дизајнирани да одржавају везе живима (отвореним), а Доцкер Сварм балансатор оптерећења ће се само пребацити на други контејнер након сваке нове везе. Ако желите да тестирате ово помоћу претраживача, мораћете да сачекате најмање 30 секунди да се веза затвори пре него што поново освежите.
Постављање Траефик-а
Траефик изворно подржава Доцкер Сварм, може да открије и региструје или дерегиструје контејнере у ходу и комуницира са вашом апликацијом преко интерне мреже за прекривање. Траефик-у су потребне неке информације о вашој апликацији пре него што почне да обрађује захтеве за њу. Ове информације се пружају Траефик-у додавањем етикета вашој Сварм услузи.
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
Листа у наставку описује шта свака ознака значи:
traefik.docker.network: Доцкер преклапајућа мрежа преко које ће Траефик комуницирати са вашом услугом
traefik.port: Порт на којем ваша услуга слуша (ово је интерно изложени порт, а не објављени порт)
traefik.frontend.rule: PathPrefix:/везује корен контекста /за ову услугу.
traefik.backend.loadbalancer.stickiness: Омогућава лепљиве сесије за ову услугу
Сада када whoami-serviceје конфигурисан са потребним ознакама, можемо додати услугу Траефик у рој:
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
Ова команда ради доста ствари одједном. Листа у наставку ће објаснити детаљније:
--name traefik: Назив наше нове Доцкер услуге је traefik
-p8080:80: Објављујемо Траефик-ов порт 80за порт 8080(порт 80је већ у употреби од стране наших whoami-service)
-p9090:8080: Објављујемо Траефик-ов сопствени веб интерфејс за порт 9090
--mount ...: Монтирамо Доцкер Соцкет у контејнер тако да Траефик може приступити Доцкер рунтиме-у хоста
--global: Желимо Траефик контејнере на сваком менаџерском чвору из разлога високе доступности
--constraint 'node.role == manager': Желимо само да Траефик ради на чворовима менаџера јер раднички чворови не могу да пруже Траефик-у информације које су му потребне. На пример, docker service lsна радном чвору не ради, тако да Траефик не би могао ни да открије које услуге се покрећу
--network whoaminet: Повезује Траефик на исту мрежу као и наш whoami-service, иначе не могу да се повежу. Претходно смо рекли Траефик-у да се повеже са нашом услугом преко ове мреже са traefik.docker.networkознаком
traefik: Реците Доцкер-у да користи најновију Траефик доцкер слику за ову услугу
--docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG: Аргументи командне линије су прослеђени директно Траефик-у како би му се омогућило да ради у режиму Доцкер роја ( --loglevel=DEBUGовде је опционо, али занимљиво током подешавања и за овај водич)
Све што је преостало је да отворите потребне портове у ЦентОС заштитном зиду:
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --zone=public --add-port=9090/tcp --permanent
sudo firewall-cmd --reload
Како то ради
Чим се Траефик покрене, можете видети у евиденцији да Траефик открива два whoamiконтејнера. Такође приказује име колачића који ће користити за руковање лепљивом сесијом:
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"
Ако се савијемо до http://192.168.0.100:8080, можемо видети да је нови колачић _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
Ако у наредним позивима пошаљемо овај колачић Траефик-у, увек ћемо бити прослеђени у исти контејнер:
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
Колачић не садржи ништа осим интерне (преклапање) ИП адресе контејнера на који Траефик треба да пошаље захтев. Ако промените вредност колачића на, http://10.0.0.4:8000онда би захтев ефективно био прослеђен другом контејнеру. Ако колачић никада не буде поново послат Траефик-у, лепљива сесија неће радити и захтеви ће бити балансирани између контејнера апликације и Траефик контејнера.
То је све што је потребно за постављање лепљивих сесија слоја 7 у Доцкер ЦЕ на ЦентОС 7.