Docker Swarm Mode

Revision as of 19:09, 17 July 2018 by Adam (talk | contribs) (Routing mesh)

Revision as of 19:09, 17 July 2018 by Adam (talk | contribs) (Routing mesh)

Bevezető

IPTV

IPVS (IP Virtual Server) implements transport-layer load balancing, usually called Layer 4 LAN switching, as part of the Linux kernel. IPVS can direct requests for TCP- and UDP-based services to the real servers, and make services of the real servers appear as virtual services on a single IP address. IPVS is built on top of the Netfilter.[


routing mesh

A swarm -on futó szolgáltatások portjait az úgynevezett routing mesh tartja nyilván. Ha egy szolágáltatást egy adott porton el kell hogy érjünk a swarm-on kívülről, akkor be kell regisztrálni a portot a routing mesh-be.
Az alábbi portokat kell kinyitni a VM-ek között még a swarm létrehozása előtt:

  • 7946 TCP/UDP for container network discovery.
  • 4789 UDP for the container ingress network.
TipIcon.png

Tip
A docker-machine-el KVM-re létrehozott gépeken minden port nyitva van


Create swarm cluster

A swarm mode cluster-t egy bash szkripttel fogjuk létrehozni. 3 manager-t és 3 worker node-t. Elsőként a három manager virtuális gépet hozzuk létre. Ezután a mg0-ás gépen inicializáljuk a cluster-t, majd az m1 és m2 node-okat manager-ként beléptetjük a cluster-be. Ha ez megvan, akkor létrehozzuk a három worker node-t és azokat worker-ként léptetjük be a cluster-be.

#!/bin/bash

Create managers
for i in 0 1 2; do 
	docker-machine create -d kvm --kvm-network "docker-network" --kvm-disk-size "5000" --kvm-memory "800"  mg$i
done

#Init cluster
docker-machine ssh mg0 docker swarm init --advertise-addr $(docker-machine ip mg0)

#Join managers
MANAGER_TOKEN=`docker-machine ssh mg0 docker swarm join-token -q manager`
WORKER_TOKEN=`docker-machine ssh mg0 docker swarm join-token -q worker`

for i in 0 1 2; do
	docker-machine ssh mg$i docker swarm join --token $MANAGER_TOKEN $(docker-machine ip mg0)
done

#Create workers
for i in 0 1 2; do 
	docker-machine create -d kvm --kvm-network "docker-network" --kvm-disk-size "5000" --kvm-memory "800"  worker$i
	docker-machine ssh worker$i docker swarm join --token $WORKER_TOKEN $(docker-machine ip mg0)
done
TipIcon.png

Tip
A KVM helyett itt használhattunk volna Amzaon EC2-es driver-t is, pont ugyan így létrehozta volna az egész cluster-t pár perc alatt. Részletek itt: Docker Swarm on AWS



Ha lefutottak a script, nézzük meg a keletkezett VM-eket elsőként docker-machine szemszögből:

# docker-machine ls
NAME      ACTIVE   DRIVER   STATE     URL                         SWARM   DOCKER        ERRORS
mg0       -        kvm      Running   tcp://192.168.42.41:2376            v18.05.0-ce   
mg1       -        kvm      Running   tcp://192.168.42.79:2376            v18.05.0-ce   
mg2       -        kvm      Running   tcp://192.168.42.154:2376           v18.05.0-ce   
worker0   -        kvm      Running   tcp://192.168.42.162:2376           v18.05.0-ce   
worker1   -        kvm      Running   tcp://192.168.42.74:2376            v18.05.0-ce   
worker2   -        kvm      Running   tcp://192.168.42.136:2376           v18.05.0-ce   


Majd nézzük meg a virsh-val is.

# virsh list 
 Id    Name                           State
----------------------------------------------------
 2     mg0                            running
 3     mg1                            running
 7     mg2                            running
 8     worker0                        running
 9     worker1                        running
 10    worker2                        running
ClipCapIt-180716-232126.PNG


Most listázzuk ki a swarm cluster node-jait elsőként az mg0-án, majd az mg1-en. Mind a két esetben ugyan azt az eredményt kapjuk. Láthatjuk, hogy jelenleg az mg0 a vezető.

# docker-machine ssh mg0 docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
nl5mmm994ckimhe5vjazjjecs *   mg0                 Ready               Active              Leader              18.05.0-ce
vacts6xlgb6ufyx49vx6fxgt0     mg1                 Ready               Active              Reachable           18.05.0-ce
3llb2b0qh7oids0qhych9w73r     mg2                 Ready               Active              Reachable           18.05.0-ce
s7hp748qu6u4bb98doss31t4r     worker0             Ready               Active                                  18.05.0-ce
211o588k4qw2uymq6dl977mmt     worker1             Ready               Active                                  18.05.0-ce
hlzuosjp7wx6rxt0a66fms698     worker2             Ready               Active                                  18.05.0-ce
# docker-machine ssh mg1 docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
nl5mmm994ckimhe5vjazjjecs     mg0                 Ready               Active              Leader              18.05.0-ce
vacts6xlgb6ufyx49vx6fxgt0 *   mg1                 Ready               Active              Reachable           18.05.0-ce
3llb2b0qh7oids0qhych9w73r     mg2                 Ready               Active              Reachable           18.05.0-ce
s7hp748qu6u4bb98doss31t4r     worker0             Ready               Active                                  18.05.0-ce
211o588k4qw2uymq6dl977mmt     worker1             Ready               Active                                  18.05.0-ce
hlzuosjp7wx6rxt0a66fms698     worker2             Ready               Active                                  18.05.0-ce



Networking

Routing mesh

  • Ahogy azt már a bevezetőben láthattuk, az úgynevezett routing mesh felelős azért, hogy egy külső portról elérjük a swarm szolgáltatást egy megadott porton.
  • A --publish kulcsszóval kell regisztrálni a port mapping-et. A published a külső még a target a belső port.
$ docker service create \
  --name my-web \
  --publish published=8080,target=80 \
  --replicas 2 \
  nginx


Vagy meglévő szolgáltatáshoz meg lehet adni új port mapping-et a --publish-add kapcsolóval.

$ docker service update \
  --publish-add published=8080,target=80 \
  my-web
ImportantIcon.png

Note
{{{1}}}


Load balancer

Monitor cluster

Több grafikus docker monitor eszköz is létezik:

  • Shipyard (webes)
  • Portainer (webes)
  • Kitematic (vastag kliens)


A legegyszerűbb a Portainer használata, ami egyetlen konténert telepít fel a docker-be, képes távoli docker démonho is kapcsolódni, és van benne swarm mode támogatás is.


Két lehetőségünk van a Portainer futtatására:

  • Ahhoz hogy a swarm klászer adatait tudjuk monitorozni, valamelyik manager node-on futó docker démonhoz kell kapcsolódni a lokális docker -ben futó Portainer-el. Ezt TLS autentikációval lehet megoldani. Ekkor a Portanier a localhost-on érhető el. (mi ezt fogjuk használni)
  • A Portainer-t eleve a manager node-ot is futtató docker démonban telepítjük fel a távoli gépen, ekkor Portanier a távoli gép IP címén érhető el.


A KVM dirver-el készült docker-machine-ekre boot2docker operációs rendszer kerül feltelepítésre, ha ezt nem változtatjuk meg. A boot2docker-ben alapértelmezetten be van kapcsolva a TLS remote docker API (port: 2376), és a titkosítatlan távoli hozzáférés ki van kapcsolva (port: 2375)

ImportantIcon.png

Note
A példában a mg0 manager node-ra fogunk kapcsolódni, de pont ugyan ezt az eredményt kapnánk az mg1 és mg2 manager-ekkel is.


TLS kulcsok begyűjtése

Mikor a docker-machine létrehozta a manager node-okat, legyártotta azokat az ssh kulcsokat, aminek a segítségével a docker-machine be tud ssh-zni a VM-re jelszó és felhasználó név megadása nélkül (docker-machine ssh mg0). Ezeket a kulcsokat fogjuk mi is felhasználni, hogy a lokálisan futó Portainer hozzá tudjon kapcsolódni a (távoli) virtuális gépen futó docker démonhoz.


Adjuk ki docker-machine env parancsot, hogy megtudjuk, hol tárolja a lokális docker-machine környezetünk a távoli VM SSH kulcsait:

# docker-machine env mg0
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.42.41:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/mg0"
export DOCKER_MACHINE_NAME="mg0"
# Run this command to configure your shell: 
# eval $(docker-machine env mg0)

Látható, hogy a kulcsok a /root/.docker/machine/machines/mg0 mappában vannak


Nekünk három fájlra van innen szükségünk. A CA-ra, a certifikációnkra és a titkos kulcsunkra. A docker-machine a publikus kulcsot még telepítés közben felmásolta a VM-re.

# ll /root/.docker/machine/machines/mg0
total 316444
..
-rw-r--r-- 1 root root       1029 Jul 15 22:41 ca.pem
-rw-r--r-- 1 root root       1070 Jul 15 22:41 cert.pem
...
-rw------- 1 root root       1675 Jul 15 22:41 key.pem
...

Másoljuk a kulcsokat egy olyan mappába, ahol a böngészőt futtató user is feléri. (Ugyanis nagy valószínűséggel a root mappában jöttek ezek létre)


Portainer telepítése

A Portainer-hez egyetlen egy image-et kell telepíteni: portainer/portainer

# docker container run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
  • A webes konzol a localhost:9000 -as porton lehsz elérhető:
  • Ha a lokális docker démon-t is monitorozni akarjuk, akkor a docker démon socket-re rá kell kötni a portainer-t.


Ha elindult a konténer, akkor válasszuk Remote lehetőséget

ClipCapIt-180716-005426.PNG
  • Adjuk meg a manager-t futtató VM IP címét a 2376 portal (alapértelmezett TLS port)
  • Kapcsoljuk be a TLS-t.
  • TLS CA certificate: ca.pem
  • TLS certificate: cert.pem
  • TLS key: key.pem

Majd mondjuk hogy connect. Ekkor bejön a desboard. Innentől kezdve a távoli manager docker démonjához kapcsolódunk.

Cluster monitorozása

Nyomjunk rá a Go to cluster visualizer linkre, vagy a baloldali menüben a swarm menüpontra.

ClipCapIt-180716-010553.PNG


Nézzük meg az mg0 node részleteit. Láthatjuk, hogy jelenleg ő a managerek vezetője:

ClipCapIt-180717-020139.PNG


Service futtatása

# docker service create --replicas 3 --name redis --update-delay 10s redis:3.0.6