Увод
Предуслови
Ко сам ја
Постављање Траефик-а
Како то ради
Увод
Доцкер Сварм претвара ваше појединачне сервере у кластер рачунара; олакшавајући скалирање, високу доступност и балансирање оптерећења. Сварм балансатор оптерећења примењује стратегију заокруженог балансирања оптерећења, а то би могло да омета правилно функционисање (застарелих) апликација са стањем које захтевају неки облик лепљивих сесија да би се омогућило високо доступно подешавање са више инстанци. Доцкер Ентерприсе Едитион подржава лепљиву сесију Лаиер-7, али у овом водичу ћемо се фокусирати на бесплатну (ЦЕ) верзију Доцкер-а. За имплементацију лепљивих сесија користићемо Траефик.
Предуслови
- Најмање две свеже распоређене и ажуриране инстанце Дебиан 9 у истој подмрежи са омогућеним приватним умрежавањем
- Доцкер ЦЕ инсталиран на овим инстанцама
- Инстанце треба да буду део истог роја и треба да буду у могућности да комуницирају једна са другом преко приватне мреже
- Претходно познавање Доцкер-а и Доцкер Сварм-а
- Не-роот корисник са
sudo
правима (опционо, али се препоручује да не користите роот корисника)
У овом водичу ћемо користити две Вултр инстанце са приватним ИП адресама 192.168.0.100
и 192.168.0.101
. Оба су Доцкер Сварм менаџерски чворови (што није идеално за производњу, али довољно за овај водич).
Ко сам ја
Овај водич користи jwilder/whoami
доцкер слику као демо апликацију. Овај једноставан контејнер ће одговорити на РЕСТ позив именом контејнера који одговара, што олакшава тестирање да ли лепљиве сесије раде. Ова слика се очигледно користи само у демо сврхе и треба је заменити сликом ваше апликације.
Вхоами-сервис је конфигурисан на следећи начин:
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
Ако накнадно curl
поставимо вхоами РЕСТ крајњу тачку на http://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
: Назив наше нове Доцкер услуге је Траефик
-p8080:80
: Објављујемо Траефик-ов порт 80
до порта 8080
јер порт 80
већ користи наш вхоами-сервис
-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
: Аргументи командне линије су прослеђени директно Траефик-у да би му се омогућило да ради у режиму Доцкер роја. DEBUG
је овде опционо, али занимљиво током подешавања и за овај водич
Све што је преостало је да отворите потребне портове у Дебиан заштитном зиду:
sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 9090 -j ACCEPT
Како то ради
Чим се Траефик покрене, можете видети у евиденцији да Траефик открива два 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 у Доцкер ЦЕ на Дебиан 9.