Changes

Docker Swarm Classic

6,384 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:
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
Ha 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 fut, létrehozhatjuk ''' címét kell megadni. Innen fogja a master lekérdezni a node-k listáját és a worker nodetelepített service-okatk listáját.   
<pre>
docker-machine create -d kvm --kvm-network "docker-network" --kvm-disk-size "5000" \
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" \
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
</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)"
És nézzük meg hány konténer jött létre összesen a cluster-ben:
<pre>
# docker info
=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===