Sticky Session With Docker Swarm (CE) på CentOS 7

Introduksjon

Docker Swarm gjør dine individuelle servere til en klynge av datamaskiner, noe som letter skalering, høy tilgjengelighet og belastningsbalansering. Swarm load-balancer implementerer en round-robin lastbalanseringsstrategi, og dette kan forstyrre riktig funksjon av (legacy) stateful applikasjoner som krever en form for klebrige økter for å tillate et høytilgjengelighetsoppsett med flere forekomster. Docker Enterprise Edition støtter Layer-7 sticky session, men i denne veiledningen vil vi fokusere på den gratis (CE) versjonen av Docker. For å implementere klissete økter bruker vi Traefik.

Forutsetninger

  • Minst to nylig distribuerte og oppdaterte CentOS 7-forekomster i samme undernett med privat nettverk aktivert
  • Docker CE installert på disse forekomstene
  • Forekomstene skal være en del av samme Swarm og skal kunne kommunisere med hverandre over det private nettverket
  • Forkunnskaper om Docker og Docker Swarm
  • En ikke-admin-bruker med sudo-rettigheter (valgfritt, men det anbefales på det sterkeste å ikke bruke root-brukeren)

I denne opplæringen skal vi bruke to Vultr-forekomster med private IP-adresser 192.168.0.100 og 192.168.0.101, begge er Docker Swarm-managernoder (som ikke er ideell for produksjon, men nok for denne opplæringen).

Hvem er jeg

Denne opplæringen bruker jwilder/whoamidocker-bildet som demoapplikasjon. Denne enkle beholderen vil svare på et REST-anrop med navnet på den svare beholderen, noe som gjør det veldig enkelt å teste om de klissete øktene fungerer. Dette bildet brukes kun til demoformål og må erstattes av ditt eget programs bilde. Den whoami-serviceer konfigurert som følger:

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

Hvis vi skulle senere curlwhoamiREST endepunkt på http://192.168.0.100/, vi kan se round-robin lastbalansering av Docker sverm på jobb.

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

Det nytter ikke å teste dette med moderne nettlesere som Chrome eller Firefox fordi de er designet for å holde tilkoblinger i live (åpne) og Docker Swarm load-balancer vil bare bytte til den andre beholderen ved hver ny tilkobling. Hvis du vil teste dette med en nettleser, må du vente i minst 30 sekunder før tilkoblingen lukkes før du oppdaterer igjen.

Sette opp Traefik

Traefik støtter Docker Swarm, den kan oppdage og registrere eller avregistrere containere mens du er på farten, og den kommuniserer med applikasjonen din over det interne overleggsnettverket. Traefik trenger litt informasjon om søknaden din før den kan begynne å håndtere forespørsler om den. Denne informasjonen gis til Traefik ved å legge til etiketter til Swarm-tjenesten din.

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

Listen nedenfor beskriver hva hver etikett betyr:

  • traefik.docker.network: Docker-overleggsnettverket som Traefik vil kommunisere med tjenesten din over
  • traefik.port: Porten som tjenesten din lytter til (dette er den internt eksponerte porten, ikke den publiserte porten)
  • traefik.frontend.rule: PathPrefix:/binder kontekstroten /til denne tjenesten.
  • traefik.backend.loadbalancer.stickiness: Aktiverer selvklebende økter for denne tjenesten

Nå som whoami-serviceer konfigurert med de nødvendige etikettene, kan vi legge til Traefik-tjenesten til svermen:

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

Denne kommandoen gjør ganske mange ting samtidig. Listen nedenfor vil forklare mer detaljert:

  • --name traefik: Vår nye Docker-tjeneste heter traefik
  • -p8080:80: Vi publiserer Traefiks port 80til port 8080(port 80er allerede i bruk av vår whoami-service)
  • -p9090:8080: Vi publiserer Traefiks eget webgrensesnitt til port 9090
  • --mount ...: Vi monterer Docker Socket inn i containeren slik at Traefik kan få tilgang til vertens Docker runtime
  • --global: Vi ønsker Traefik-beholdere på hver managernode av høye tilgjengelighetsgrunner
  • --constraint 'node.role == manager': Vi vil bare at Traefik skal kjøre på ledernoder fordi arbeidernoder ikke kan gi Traefik den informasjonen den trenger. For eksempel, docker service lspå en arbeider node fungerer ikke, så Traefik ville ikke engang kunne oppdage hvilke tjenester som kjører
  • --network whoaminet: Kobler Traefik til samme nettverk som vår whoami-service, ellers kan de ikke koble seg til. Vi har tidligere fortalt Traefik å koble til tjenesten vår over dette nettverket med traefik.docker.networketiketten
  • traefik: Be docker om å bruke det nyeste Traefik docker-bildet for denne tjenesten
  • --docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG: Kommandolinjeargumenter sendt direkte til Traefik for å la den kjøre i Docker-svermmodus ( --loglevel=DEBUGer valgfritt her, men interessant under oppsett og for denne opplæringen)

Alt som gjenstår å gjøre er å åpne de nødvendige portene i CentOS-brannmuren:

sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --zone=public --add-port=9090/tcp --permanent
sudo firewall-cmd --reload

Hvordan det fungerer

Så snart Traefik starter opp, kan du se i loggene at Traefik oppdager de to whoamicontainerne. Den sender også ut navnet på informasjonskapselen som den vil bruke til å håndtere den klissete økten:

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"

Hvis vi krøller til kan http://192.168.0.100:8080vi se at en ny informasjonskapsel _a49bcer satt:

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

Hvis vi ved senere samtaler sender denne informasjonskapselen til Traefik, vil vi alltid bli videresendt til samme beholder:

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

Informasjonskapselen inneholder ingenting annet enn den interne, (overlegg), IP-adressen til beholderen som Traefik skal sende til for å be om. Hvis du endrer informasjonskapselverdien til, http://10.0.0.4:8000vil forespørselen i praksis bli videresendt til den andre beholderen. Hvis informasjonskapselen aldri skulle sendes til Traefik på nytt, vil ikke den klebrige økten fungere og forespørsler vil balanseres mellom applikasjonens beholdere og Traefik-beholderne.

Det er alt som trengs for å sette opp Layer 7 Sticky Sessions i Docker CE på CentOS 7.

Legg igjen en kommentar

The Rise of Machines: Real World Applications of AI

The Rise of Machines: Real World Applications of AI

Kunstig intelligens er ikke i fremtiden, det er her akkurat i nåtiden I denne bloggen Les hvordan kunstig intelligens-applikasjoner har påvirket ulike sektorer.

DDOS-angrep: en kort oversikt

DDOS-angrep: en kort oversikt

Er du også et offer for DDOS-angrep og forvirret over forebyggingsmetodene? Les denne artikkelen for å løse spørsmålene dine.

Har du noen gang lurt på hvordan hackere tjener penger?

Har du noen gang lurt på hvordan hackere tjener penger?

Du har kanskje hørt at hackere tjener mye penger, men har du noen gang lurt på hvordan tjener de den slags penger? la oss diskutere.

Revolusjonerende oppfinnelser fra Google som vil gjøre livet ditt enkelt.

Revolusjonerende oppfinnelser fra Google som vil gjøre livet ditt enkelt.

Vil du se revolusjonerende oppfinnelser fra Google og hvordan disse oppfinnelsene forandret livet til alle mennesker i dag? Les deretter til bloggen for å se oppfinnelser fra Google.

Fredag ​​Essential: Hva skjedde med AI-drevne biler?

Fredag ​​Essential: Hva skjedde med AI-drevne biler?

Konseptet med selvkjørende biler som skal ut på veiene ved hjelp av kunstig intelligens er en drøm vi har hatt en stund nå. Men til tross for flere løfter, er de ingen steder å se. Les denne bloggen for å lære mer...

Teknologisk singularitet: en fjern fremtid for menneskelig sivilisasjon?

Teknologisk singularitet: en fjern fremtid for menneskelig sivilisasjon?

Ettersom vitenskapen utvikler seg raskt og tar over mye av innsatsen vår, øker også risikoen for å utsette oss for en uforklarlig singularitet. Les hva singularitet kan bety for oss.

Funksjonaliteter til Big Data Reference Architecture Layers

Funksjonaliteter til Big Data Reference Architecture Layers

Les bloggen for å kjenne ulike lag i Big Data Architecture og deres funksjoner på den enkleste måten.

Evolusjon av datalagring – infografikk

Evolusjon av datalagring – infografikk

Lagringsmetodene for dataene har vært i utvikling kan være siden fødselen av dataene. Denne bloggen dekker utviklingen av datalagring på grunnlag av en infografikk.

6 fantastiske fordeler ved å ha smarte hjemmeenheter i livene våre

6 fantastiske fordeler ved å ha smarte hjemmeenheter i livene våre

I denne digitaldrevne verden har smarthusenheter blitt en avgjørende del av livet. Her er noen fantastiske fordeler med smarthusenheter om hvordan de gjør livet vårt verdt å leve og enklere.

macOS Catalina 10.15.4 tilleggsoppdatering forårsaker flere problemer enn å løse

macOS Catalina 10.15.4 tilleggsoppdatering forårsaker flere problemer enn å løse

Nylig lanserte Apple macOS Catalina 10.15.4 en tilleggsoppdatering for å fikse problemer, men det ser ut til at oppdateringen forårsaker flere problemer som fører til muring av mac-maskiner. Les denne artikkelen for å lære mer