Changes

Docker Swarm Classic

8,817 bytes added, 15:11, 8 August 2018
no edit summary
[[Docker Orchestration|<< Back to Orchestration Docker main]]
* A Swarm classic nem része az alap Docker programnak, ez egy független kiegészítése, amit külön kell telepíteni, ugyan úgy mint pl a docker-machine-t.
* A Swarm classic szabványos docker konténereket hoz létre a master és anode VM-eken. Külön konténert kap a swarm manager és külön konténert kap a swarm agent. Tehát a hagyományos Docker eszközkészletet használtja fel a swarm classic. Ezen konténerek segítségével telepíti aztán a swarm classic a megfelelő service-eket (konténereket) a node VM-eken. Mindenre a swarm nevű image-et fogjuk használni. Attól függ hogy mit fog csinálni a swarm konténer, amit az image-ból létrehozunk, hogy milyen CMI paramétereket kapott. (master, node vagy list)
* A swarm kezelésére nincsenek dedikált docker és compose parancsok. Be kell 'jelentkezni' swarm módban a manager VM-re, majd onnantól kezdve minden kiadott docker és compose parancs az egész cluster-re vonatkozik, nem a manager VM-en futó docker démonra. (Swarm mode-ban ez nem így van, ott saját parancs készlete van már a swarm-nak)
* A scheduling stratégiákat a swarm cluster létrehozásakor meg kell adni, a service-ek telepítése közben erre már nincs lehetőség. Tehát a docker-compose.yml fájl deploy szekcióját nem veszi figyelembe a swarm classic, az kizárólag a swarm mode-nak szól.
* A swarm classic-kban nincs beépített load balancer szolgáltatás. Magunknak kell létrehozni. A load-balancer a végpontok listáját a discovery service szolgáltatótól kell hogy lekérdezze (pl. consul)
Kétféleképpen hozhatunk létre swarm classic cluster-t:
* Saját kezűleg hozzuk létre a docker-t futtató virtuális vagy fizikai gépeket. Ezeken manuálisan, docker parancsokkal hozzuk létre a master-t és a node swarm node-okatkonténereket. * Használhatjuk a 'docker-machin' parancsot a '--swarm' kapcsolóval, hogy a megfelelő swarm cluster-hez is hozzáadja a létrehozott VM-et. Ez a funkció VM driver-től függetlenül működik, ez a funkció be van építve a 'docker-machine' programba, azonban kizárólag swarm classic cluster-t tud kezelni. (Azonban bizonyos Bizonyos driver-ek , talán az Amazon támogatják, hogy a létrehozott VM swarm mode cluster tagja legyen)
Bármelyik megoldást is választjuk a swarm cluster létrehozására, szükség van egy discovery szolgáltatóra, ahova a node-ok regisztrálják magukat. A discovery szolgáltatás egy KV (Key-Value) pár regiszter, ahova minden node beírja saját magát. A master a discovery szolgáltatót folyamatosan poll-ozza, hogy hozzájusson az aktuális member listához.
{{note|Ez a swarm mode-ban (swarm 2.0) már nincs így. Discovery service nélkül is képes a master megtalálni a node-okat. }}
* '''token''': A DockerHub által nyújtott, ingyenes discovery szolgáltatás. Produkciós környezetbe nagyon nem ajánlott.
* '''consul''': A Consul egy ingyenes, lokálisan futó discovery szolgáltatás, ezt írja magáról: "Consul is a distributed service mesh to connect, secure, and configure services across any runtime platform and public or private cloud Service registry, integrated health checks, and DNS and HTTP interfaces enable any service to discover and be discovered by other services"
* '''etcd''': Ez is egy KV store. Úgy tudom hogy ez lett az új Swarm mode beépített service discovery megoldása, de a Kubernetes is ezt használja.
* fájl alapú: Egy fájlba kézzel beírjuk, hogy hol vannak a kliensek. Nyilván ez is csak játékra való, mint a DockerHub alapú megoldás
...
:[[File:ClipCapIt-180726-170103.PNG]]
=Swarm cluster DockerHub discovery service használatával=
Ahogy már írtam fentebb, a swarm master-nek mindenképpen szüksége van egy discovery szolgáltatóra, hogy meg tudja találni a node-okat. A DocerkHub egy ingyenes, bárki számára elérhető discovery szolgáltatást nyújt. Ez azonban csak tesztelési és fejlesztési célokra használható, produkciós környezetben nem. Cserébe nagyon egyszerű a használata, mert nem kell hozzá extra szoftver komponenseket telepíteni, össz-vissz annyira van szükségünk, hogy a swarm-ot futtató VM-eknek legyen publikus internet elérése, hogy elérjék a DockerHub-ot.
{{warning|A '''docker:[[File:ClipCapIt-machine''' paranccsal csak swarm classic cluster180726-t tudunk natívan építeni, swarm mode cluster-t nem tud létrehozni a VM legyártásakor, kivéve ha a driver ezt lehetővé teszi. Tehát a docker-machine parancs '''--swarm''' kapcsolója kizárólag swarm classic-hoz jó. Pl. az Amazon diver támogatja a swarm mode cluster létrehozását a VM legyártása közben170549. }}PNG]] 
===Swarm inicializál===
Elsőként regisztrálni kell az új swarm cluster-ünket a Docker Hub-on, ami a discovery szolgáltatás szerepét tölti most be. A regisztráció végén a Docker Hub vissza fogja adni az új cluster azonosítóját, amivel a node-ok regisztrálni tudják magukat, és amivel a master bekérdezhet a discovery a Docker Hub-ba, hogy lekérdezze a cluster node-ok listáját. A regisztrációt a ''''swarm'''' nevű konténer image futtatásával tehetjük meg, aminek az argumentuma a ''''create''''
A regisztrációt a swarm konténer itt végzi el: https://registry-1.docker.io/v2/. Ha nem tudja elérni ezt a publikus host-ot, akkor a konténer hibát fog dobni.
<br>
<br>
===Swarm ready VM-ek legyártása===
A '''docker-machine''' parancs létre tudja úgy hozni a VM-eket, hogy azok már elve csatlakoznak egy docker swarm classic cluster-hez vagy master-ként vagy worker-ként. Sajnos a '''docker-machine''' a '''swarm mode'''-ot már nem támogatja semmilyen formában. Azonban bizonyos VM szolgáltatók driver-e lehetővé teszi, hogy az új VM-em swarm mode tagjaként jöjjön eleve létre (azt hiszem a DigitalOchean ilyen).
 
 
A '''docker-machine ls''' parancs-nak van egy SWARM oszlopa. De ez is kizárólag a swarm classic-ra vonatkozik. Ha a VM tagja egy swarm mode cluster-nek, akkor sajnos a SWARM oszlopban ez nem fog megjelenni:
<pre>
# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
mg5 - kvm Stopped Unknown
</pre>
 
 
A swarm classic ready gépeket a '''--swarm''' kapcsolóval kell létrehozni. A docker-machine-nek nagyon sok további paramétere van, ami azt szabályozza, hogy az új VM hogyan és milyen szerepben csatlakozzon a swarm classic cluster-hez. <br>
Elsőként '''--swarm-master''' kapcsolóval adjunk hozzá egy master node-ot a cluster-hez. A discover szolgáltatást a '''--swarm-discovery''' kapcsolóval kell megadni. Mivel a '''DocekrHub'''-os token-t használtuk, itt is ezt a protokollt kell megadni.
<pre>
docker-machine create -d kvm --kvm-network "docker-network" --kvm-disk-size "5000" \
Checking connection to Docker...
</pre>
{{tip|Természetesen a '''swarm classic konténereket''' manuálisan is létre lehet hozni, nem kell hozzá a '''docker-machine --swarm''' parancs. Ez csak egy segítség. Ilyenkor a docker-machine ugyan azt csinálja, amit mi is csinálni fogunk a [[Docker Swarm Classic#Cluster_l.C3.A9trehoz.C3.A1sa_manu.C3.A1lisan|Cluster létrehozás manuálisan]] fejezetben. }}
Ha a '''--swarm-master''' kapcsolót elhagyjuk, akkor normál worker-t adunk hozzá:
<pre>
docker-machine create -d kvm --kvm-network "docker-network" --kvm-disk-size "5000" \
Checking connection to Docker...
</pre>
 
<br>
===VM-ek ellenőrzése===
{{note|A '''docker-machine ls''' parancsában a SWARM oszlop kizárólag a '''--swarm''' kapcsolóval létrehozott swarm classic cluster-re vonatkozik. A Swarm mode-al létrehozott cluster esetében ez az oszlop nem lesz kitöltve.}}
Láthatjuk a host gép route táblábantáblájában, hogy két KVM-re vonatkozó route bejegyzés van, ezek a '''virbr0''' és a '''virbrDocker'''. * A '''virbr0''' a '''KVM ''' docker-machine driver által létrehozott hálózat, amivel a VM-ek egymás között tudnak csak kommunikálni. Ez a '''default''' nevű KVM hálózathálózatnak felel meg a 'virsh net-list' listába. Ezt a hálózatot automatikusan hozza létre a driver, nincs rá hatásunk. * A '''virbrDocker''' pedig az a hálózat amit mi definiáltunk korábban '''docker-network''' néven. Ez a hálózat kilát a publikus internetre. Ezt adtuk meg a VM-ek létrehozásakora '''docker-machine'''-nek.
<pre>
# route
192.168.123.0 0.0.0.0 255.255.255.0 U 0 0 0 virbrDocker
</pre>
 
 
Nézzük meg, hogy ezek melyik hálózatok a KVM szerint
 
<pre>
# virsh net-list
</pre>
<br>
===Swarm cluster ellenőrzése===
A swarm classic cluster tagjait ki tudjuk listázni a '''swarm image''' segítségével, ha megkérjük, hogy kérje le a discovery agent-től (ami most a '''DockerHub''') a node-ok listáját.
Ezt bárhol lefuttathatjuk, nem csak a VM-eken. A swarm konténer le fogja kérdezni a Docker Hub-tol a node-ok listáját. Azért van három node, mert a master VM-en is fut egy swarm agent.
<pre>
Ahhoz hogy utasításokat tudjunk kiadni a swarm cluster-en, a docker kliensünkkel rá kell csatlakozni a swarm manager konténerben futó docker démonra. Tehát arra a docker-démonra kell csatlakozni ami a konténert natívan futtatja a VM-en, hanem arra swarm docker démonra a swarm konténer belsejében:
:[[File:ClipCapIt-180726-223323.PNG]]
Ezt kétféle képen tehetjük meg.
# A docker kliensünknek a '''-H tcp:ip:port''' paraméterrel megadjuk a swarm konténer címét és portját
# Használjuk a '''docker-machine env''' parancs '''--swarm''' kapcsolóját, ami ezt elvégzi helyettünk. Már korábban is láthattuk, hogy a '''docker-machine evn <gépnév>''' paranccsal transzparens módon tudtunk csatlakozni a távoli démonra a lokális klienssel. Ekkor minden kiadott docker parancs a távoli démonon futott le. Ha a '''--swarm''' kapcsolót is használjuk, és a távoli docker démon futtat swarm manager konténert, akkor közvetlen a swarm konténer belsejébe futó docker démon-ra fog csatlakozni szintén transzparens módon a lokális docker kliens.
Ha a '''--swarm''' kapcsolót is használjuk, akkor innentől kezdve minden kiadott docker parancs már a swarm classic cluster-en fog lefutni:
<pre>
# eval "$(docker-machine env --swarm swarm-master)"
A '''docker info''' láthatjuk, hogy 4 konténert mutat, holott a master-t futtató VM-en még semmilyen konténert nem telepítettünk. Ezek mind swarm konténerek, három worker és egy master.
<pre>
# docker info
Containers: 54
Running: 4
Paused: 0
A '''ps''' parancs is az egész cluster-re vonatkozik:
<pre>
# docker ps -a
<br>https://www.consul.io
{{tip|A Docker Hub-os discover szolgáltatással ellentétben ez már használható produkciós környezetben is. }}
 
===Consule telepítése===
A conluse szintén telepíthető docker konténerként, majd ide fogják magukat regisztrálni a node-ok, és innen fogja lekérdezni a node listát a master. A conlue -nak nem fogunk most külön VM-et létrehozni, a host docker démonján fog futni:
<pre>
# docker run -d -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h consul progrium/consul -server -bootstrap -ui-dir /ui
</pre>
Az utolsó paraméter (/ui) hatására lesz web-es admin konzolunk is. Ha elindult a konténer, akkor a webes konzolt itt érhetjük el: http://localhost:8500/ui/
:[[File:ClipCapIt-180709-000402.PNG]]
Hozzuk újra létre a master-t futtat VM-et kapásból swarm classic módban. ('''--swarm''' és '''--swarm-master'''). A '''--swarm-discovery''' értékének most a '''consul''' címét kell megadni. Innen fogja a master lekérdezni a node-k listáját és a telepített service-k listáját. <pre>docker-machine create -d kvm --kvm-network "docker-network" --kvm-disk-size "5000" \--swarm --swarm-master \--swarm-discovery="consul:[[File//192.168.0.105:ClipCapIt8500" \consule-180708-235803.PNG]]master</pre>
Hozzunk létre node-okat is a '''--swarm-master''' kapcsoló elhagyásával. A discovery szolgáltatás címe változatlan.
<pre>
docker-machine create -d kvm --kvm-network "docker-network" --kvm-disk-size "5000" \
--swarm \
--swarm-discovery="consul://192.168.0.105:8500" \
consule-node1
</pre>
A node-ok listázását bármelyik gépen futtathatjuk, ami eléri a host-ot. Ez a VM-en futó docker-engine-ben fog létrehozni egy új swarm konténert a lekérdezés idejére. Paraméterként megkapja a consul címét, ahonnan elkéri a node-ok listáját. Látható, hogy mind két node-ot megtalálta. Egy van a master VM-en, amit automatikusan hozott létre a '''docker-machine''' parancs, és egy van a node számára létrehozott VM-en.
<pre>
# docker run --rm swarm list consul://192.168.0.105:8500
192.168.42.10:2376
192.168.42.110:2376
</pre>
 
 
A Consul webes konzolján is megnézhetjük a node-ok listáját a /nodes alatt:
http://localhost:8500/ui/#/dc1/kv/docker/swarm/nodes/
:[[File:ClipCapIt-180708-235803.PNG]]
 
 
Most a lokális docker kliensünkkel csatlakozzunk rá a swarm master-re ahogy azt már fentebb tettük:
<pre>
# eval "$(docker-machine env --swarm consule-master)"
</pre>
 
 
És nézzük meg hány konténer jött létre összesen a cluster-ben:
<pre>
# docker info
Containers: 3
Running: 3
Paused: 0
Stopped: 0
Images: 2
Server Version: swarm/1.2.9
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint, whitelist
Nodes: 2
consule-master: 192.168.42.10:2376
└ ID: KD2G:QYRW:Z63A:O2GV:4CU4:2GWK:IR5D:NUWX:EAIH:H4ON:ODCH:6QUB|192.168.42.10:2376
└ Status: Healthy
└ Containers: 2 (2 Running, 0 Paused, 0 Stopped)
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.021 GiB
└ Labels: kernelversion=4.9.93-boot2docker,
└ UpdatedAt: 2018-07-08T22:08:15Z
└ ServerVersion: 18.05.0-ce
consule-node1: 192.168.42.110:2376
└ ID: V2ZU:666C:DI7V:4RC7:KWGI:Y4LW:AYL5:IXQO:2QAE:4HOP:EHHC:2D7Y|192.168.42.110:2376
└ Status: Healthy
└ Containers: 1 (1 Running, 0 Paused, 0 Stopped)
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 1.021 GiB
└ Labels: kernelversion=4.9.93-boot2docker
</pre>
=Cluster létrehozása manuálisan=
A '''swarm classic cluster'''-t nem csak a '''docker-machine''' paranccsal lehet létrehozni, bár kétségtelen hogy úgy a legegyszerűbb. Létrehozhatjuk swarm cluster nélkül is a VM-eket, majd oda SSH-val belépve, manuálisan is felépíthetjük a cluster-t (vagyis elindíthatjuk a swarm konténereket). Nézzünk erre egy token-es (DockerHub) példát.
===Cluster regisztrálása===
Most is DockerHub-ot fogunk használni discovery szolgáltatóként, az egyszerűség végett. Ugyan úgy regisztráljuk a cluster-t a rögtön megszűnő swarm konténerrel ahogy azt már tettük.
<pre>
# docker run --rm swarm create
</pre>
https://docs.docker.com/swarm/reference/manage/<br>
http://harrylee.me/2016/08/23/Docker-Docker-Swarm-with-Docker-Machine-Quick-Setup-Guide/
 https://docs.docker.com/swarm/reference/manage/ http://harrylee.me/2016/08/23/Docker-Docker-Swarm-with-Docker-Machine-Quick-Setup-Guide/<br>
===Master létrehozása===
https://www.w3cschool.cn/doc_docker_1_10/docker_1_10-swarm-install-manual-index.html
 
Hozzuk létre a master VM-jét swarm nélkül. A docker-machine-al készítünk egy docker ready gépet.
<pre>
# docker-machine create -d kvm --kvm-network "docker-network" manager
Lépjünk be SSH-val az új VM-re.
<pre>
# docker-machine ssh manager
Mikor a manager-t létrehozzuk, akkor ugyan azt a '''swarm konténert ''' image-t futtatjuk, amivel regisztráltuk a cluster-t a Docker Hub-on, csak most nem a create hanem a manager paraméterrel, innen fogja tudni a swarm, hogy manager konténert kell létrehoznia. <br>A második paraméter a cluster azonosítója a Docker Hub'''docker-machine --onswarm''' üzemmódja pont ezt csinálta meg, aminek azzal a segítségével le tudja kérdezni különbséggel, hogy a master VM-en egy node-ok listáját ot is mindig létrehoz a managermaster mellé.  
<pre>
docker@manager:~$ docker run -d -p 4000:4000 swarm manage -H :4000 --advertise 192.168.42.83:4000 token://4d245124e7feba5224a117bdd83c9acc
===Node-ok létrehozása===
Hozzunk létre egy swarm nélküli VM-et a node-nak is:
<pre>
# docker-machine create -d kvm --kvm-network "docker-network" node1
Lépjünk be SSH-val az új VM-re:
<pre>
# docker-machine ip node1
Itt is ugyan úgy a swarm image-ból fogunk csinálni egy konténert, de a manage paraméter helyett a '''join''' paramétert adjuk mega a konténernek, innen fogja tudni, hogy node-ot kell létrehozni.
<pre>
docker@node1:~$ docker run -d \
Ha ugyan ezen a VM-en nyomunk egy '''docker ps'''-t, akkor láthatjuk, hogy létrejött az egy szem swarm konténer, ami '''node''' üzemmódban fut.
<pre>
docker@node1:~$ docker ps
34e10a5463fa swarm "/swarm join --addr=…" 30 seconds ago Up 29 seconds 2375/tcp kind_goldberg
</pre>
 
 
==Mi jött létre==
Egy rögtön megszűnő swarm konténert futtassunk a list paraméterrel, hogy lekérje a DockerHub-tól a node-ok listáját.
<pre>
# docker run --rm swarm list token://4d245124e7feba5224a117bdd83c9acc
Ha a master VM-en az ott futó docker klienssel rácsatlakozunk a swarm master konténerre, akkor listázni tudjuk a swarm cluster részleteit.
<pre>
$ docker -H :4000 info
aa97325e8cb6 painted "/magic.sh bird" node1/bird_bird_3
</pre>
Láthatjuk, hogy 10 konténer jött létre, 3-3 a node2-ön és a swarm-master-en, és 4 a node1-en. A konténer neve mindig a node nevével kezdődik, majd jön az image név majd a sorszáma a replikának. Ahogy láthatjuk, a swarm egyenlően akarta elosztani a node-ok között a konténereket. Ez a "spread" elosztási stratégia, ez az alapértelmezett. Mivel a swarm cluster létrehozásakor nem adtunk meg stratégiát, ezért a "spread" scheduling stratégiát használja a cluster.
==Kiosztási stratégiák==
A kiosztási stratégiát a master létrehozásakor kell megadni a '''--swarm-strategy ''' kapcsolóval. Három stratégia közül választhatunk:
===spread===
Ez az alapértelmezett, ha nem adunk meg semmit, akkor mindig spread lesz.
<pre>
# docker-machine create -d kvm --kvm-network "docker-network" --kvm-disk-size "5000" \
--swarm --swarm-master \
--swarm-discovery="token://7b1602e9fc114f1f47ad7ad4df41521c" \
--swarm-strategy=spread
swarm-master
</pre>
 
 
<pre>
# docker info
....
Strategy: spread
</pre>
Ez azt jelenti, hogy csak olyan node-ok jöhetnek szóba az új konténer futtatására, amik '''size=small''' címkével lettek létrehozva.
* ===port===* ===dependency===