Changes

Docker Swarm Mode

1,682 bytes removed, 18:47, 10 February 2019
Swarm cluster létrehozása
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) --advertise-addr $(docker-machine ip mg$i)
done
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) --advertise-addr $(docker-machine ip worker$i)
done
</source>
{{tip|A KVM helyett itt használhattunk volna Amzaon EC2-es driver-t is, pont ugyan így ugyanígy létrehozta volna az egész cluster-t pár perc alatt. Részletek itt: [[Docker_Swarm_on_AWS|Docker Swarm on AWS]] }} A '''--advertise-addr''' paraméterre azt mondjuk meg, hogy az újonnan létrehozandó swarm node a swarm-management node-to-node kommunikációra melyik interfészét használja a VM-nek (ha több is van). A swarm node ezen az interfészen (alhálózaton) fogja magát reklámozni a swarm cluster-ben, a többi node az itt megadott interfészen fogja keresni. A swarm management node-to-node kommunikációt biztonsági okokból mindig VM internal hálózaton kell bonyolítani, tehát a '''--advertise-addr''' paraméternek mindig egy VM internal hálózati interfészt kell megadni.  A VM-eket mindig úgy kell létrehozni, hogy legalább két hálózatra csatlakozzanak. Legyen egy VM internal hálózat, ami a publikusan nem érhető el, csak a guest-ek látják rajta egymást, és legyen egy második hálózat, ahol a VM-ek kilátnak a netre, és akár a publikus hálózatból elérhetőek. A "'''docker-machine create'''"-el olyan VM-eket hoztunk létre, amikre ez teljesül: * '''eth0''':192.168.123.0/255.255.255.0 - ('''docker-network''') Azt a hálózatot mi definiáltuk, ez kilát a publikus internetre. (Ezt a hálózatot a KVM a "'''forward mode=nat'''" paraméterrel hoztuk létre, ezért lát ki a publikus net-re, lásd [[KVM#Add new network]] cikket a részletekért.) Ha az ingress load balance-olt hálózaton akarunk elérni egy service-t akkor az adott node ezen IP címét kell használni. * '''eth1''':192.168.42.0/255.255.255.0 - ('''docker-machines''') Ezt a hálózatot a KVM driver hozta létre automatikusan a VM internál kommunikációra, tehát minden node-nak az '''eth1''' interfész IP címét kell megadni az '''--advertise-addr''' paraméterben. Szerencsére a "'''docker-machine ip node-name'''" parancs pont ezt az ip-t adja vissza. <br>Részletek itt: [[Docker Machine#Create machines with KVM]] (ugyan ezen az IP-n is működik az ingress hálózat lokálisan, távolról ez nem elérhető)  KVM driver esetén ha nem az alapértelmezett OS-t akarjuk használni, akkor a '''--kvm-boot2docker-url''' kapcsolóval kell megadni a .ISO helyét. Én a rancherOS-t próbáltam ki és működött. Innen lehet letölteni: https://github.com/rancher/os (közvetlen link: https://releases.rancher.com/os/v1.5.0/rancheros.iso) <pre>docker-machine create -d kvm --kvm-boot2docker-url "/home/adam/Downloads/rancheros.iso" --kvm-network "docker-network" manager1</pre>    <pre># virsh net-list Name State Autostart Persistent---------------------------------------------------------- default active yes yes docker-machines active yes yes docker-network active yes yes</pre>
<br>
Most Végezetül 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ő.
<pre>
# docker-machine ssh mg0 docker node ls
<br><br>
=Portainer, GUI swarm manager management with Portainer=
:[[File:ClipCapIt-180824-214115.PNG]]
Az a gond, hogy a Portainer stateful szolgáltatás, a '''/data ''' konténer mappában tárolja az adatait (állapotát). Staeful szolgáltatások kezelése egy kicsit nehézkes. A /data a mappát kéne legalább a guest VM-re lementeni, hogy ha a szolgáltatás újra indulna ne vesszenek el a Portainer adatok (állapot). Azonban ha a swarm egy másik manager nodre-ra újratelepítené, akkor fontos hogy ott is rendelkezésre álljon ugyan az a '''/data ''' mappa tartalom (állapot), hogy ne vesszenek el a beállítások. Ehhez meg az valamelyik docker volume plugin -t kellhasználjuk, hogy minden manager node-ra mount-olva legyen ugyan az VM független, külső, közös meghajtólásd a [[Docker volume orchestration]] című cikket.
Ahhoz hogy elérjük azt a célt, hogy a Portainer-t tetszőleges manager node-ra fel tudja telepíteni a swarm, ugyan azt a perzisztens meghajtót fel kell csatolni az összes manager noder-ra, ráadásul olyan mount típusra van szükségünk, amire aztán "tovább" lehet mount-olni docker konténer mappát is. Sajnos a KVM host-guest file sharinge-el (9p) létrehozott mappákat nem lehet "tovább" mount-olni docker konténerek belsejébe, tehát az nem jó megoldás, hogy az összes manager node alá felcsatoljuk ugyan azt a KVM megosztott host mappát. Erre a célra KVM környezetben a legjobb az NFS megosztás vagy esetleg a samba. Mi most az '''NFS''' megosztást fogjuk használni. (Az Amazon-on ennek a megfelelője az '''Amazon Elastic File System''' (EFS), mi a szimpla, Linux-os NFS szervert fogjuk használni.)
{{note|Ha van egy stateful szolgáltatásunk (ami az állapotát fájlban tárolja), amit már nem a manager node-okra akarunk telepíteni, tehát adott esetben akár több száz node közül fog kikerülni valamelyikre, akkor az már nem járható út, hogy minden worker node-on létrehozzuk az NFS mount-ot, mert potenciálisan bármelyikre kikerülhet a szolgáltatás, ez már csacskaság lenne. Ilyen esetben már valamelyik "storage orchestration" megoldást kell használni, mint pl '''REX-ray'''. }}
===Portainer telepítése===
Telepítsük fel a '''Netshare''' docker volume plugin-t a [[Docker_volume_orchestration#Netshare|Docker volume orchestration/Netshare]] fejezetben leírtak alapján. A Netshare segítségével felcsatolhatunk NFS megosztást közvetlen a Portainer konténerbe on-demand alapon, tehát a megosztás csak azon a node-on fog létrejönni, ahova a swarm a Portainer-t telepíti majd.
===NFS szerver telepítése=== Elsőként a host gépen (vagy bárhol máshol, amit elérnek majd a VM-ek) hozzunk létre egy NFS megosztást. <pre># dnf install -y nfs-utils# systemctl enable nfs# systemctl restart nfs</pre>A host gép tűzfalán az alábbi portokat kell kinyitni: * '''2049''' - udp + tcp* '''111''' - udp + tcp  A NFS szerver konfigurációs fájlja a '''/etc/exports''' . Ebbe egy sort kell csak belerakjunk: <pre>/home/adam/docker/portainer/data/ 192.168.42.0/255.255.255.0(rw,sync,no_root_squash,no_subtree_check)</pre>Vagyis, hogy a /home/adam/docker/portainer/data/ mappának a megosztását megengedjük a 192.168.42. -ás alhálózaton  Töltsük újra a NFS fájlt: <pre># exportfs -ra</pre>  Majd nézzük meg, a showmount paranccsal hogy a szerverünk valóban kiajánlja e a fenit mappát: <pre># showmount -e 192.168.42.1Export list for 192.168.42.1:/home/adam/Projects/DockerCourse/portainer/data 192.168.42.0/255.255.255.0</pre>  <br> ===NFS kliens beállítása===Az összes manager node-on mount-olni kell az előbb létrehozott NFS megosztást, amiben a Portainer a perzisztens adatait fogja tárolni (pl. user adatok). Ehhez be kell lépni SSH-val egyenként a manager node-kora és ott futtatni kell a '''mount''' parancsot.  {{note|KVM driver által telepített boot2docker Linux-okon csak a /var/lib/boot2docker mappa tartalma boot perzisztens, minden máshol történt módosítást ki fog dobni}} A boot2docker-ben az NFS mount-nak speciális szerkezete van, leírás itt: https://gist.github.com/leeor/e70419fd7f656ca4bff3<br>Mivel a boot2docker-ben csak a '''/var/lib/boot2docker/''' tartalma boot perzisztens, ezen a mappán belül hozzuk létre a portainer számára azt a mappát ahova az NFS megosztást fel fogjuk csatolni. <pre>sudo /var/lib/boot2docker/portainerdatasudo /usr/local/etc/init.d/nfs-client startsudo mount 192.168.42.1:/home/adam/docker/portainer/data/ /var/lib/boot2docker/portainerdata -o rw,async,noatime,rsize=32768,wsize=32768,proto=tcp</pre>(normál esetben a mount így nézne ki: ''mount -t nfs source target'')  Ha ez működik, akkor az utolsó két sort írjuk be a '''/var/lib/boot2docker/profile''' fájlba, ami a docker user-hez tartozó profile, hogy boot perzisztensé tegyük. Fontos, hogy a profile fájlt csak akkor tudjuk írni, ha előtte 777 jogot adunk rá.   Végezetül ezt beleépíthetjük a '''createCluser.sh''' script fájlba, hogy a fenti lépések automatizáltan lefussanak: <source lang="sh">#!/bin/bash PORTA_HOST_DIR='/home/adam/docker/portainer/data'PORTA_GUEST_DIR='/var/lib/boot2docker/portainerdata'PORTA_MOUNT_OPT='-o rw,async,noatime,rsize=32768,wsize=32768,proto=tcp' for i in 0 1 2; do #Create VM docker-machine create -d kvm --kvm-network "docker-network" --kvm-disk-size "5000" --kvm-memory "800" mg$i  #Mount NFS for this session docker-machine ssh mg$i sudo mkdir /var/lib/boot2docker/portainerdata docker-machine ssh mg$i sudo /usr/local/etc/init.d/nfs-client start docker-machine ssh mg$i sudo mount 192.168.42.1:$PORTA_DATA_DIR $PORTA_GUEST_DIR $PORTA_MOUNT_OPT  #Make the NFS mount boot persistent docker-machine ssh mg$i sudo chmod 777 /var/lib/boot2docker/profile docker-machine ssh mg$i "echo 'sudo /usr/local/etc/init.d/nfs-client start'" docker-machine ssh mg$i "echo 'sudo mount 192.168.42.1:$PORTA_DATA_DIR $PORTA_GUEST_DIR $PORTA_MOUNT_OPT' >> /var/lib/boot2docker/profile"done</source>A script többi része megegyezik a [[/Docker_Swarm_Mode#Swarm_cluster_l.C3.A9trehoz.C3.A1sa|''Swarm cluster létrehozása'']] fejezetben leírtakkal. A fenti script-et futtatva három olyan VM-et kapunk, ahova ugyan az a NFS megosztás van felcsatolva a '''/var/lib/boot2docker/portainerdata''' mappába. A portainer docker konténer '''/data''' mappáját erre a mappára kell mount-olni, így bármelyik manager noder-ra is kerül majd a '''portainer''', ugyan azt a '''/data''' mappát fogja látni. <br>===Portainer telepítése===A portainer-t swarm service-ként fogjuk telepíteni. Ki fogjuk kötni a hogy csak manager node-ra telepítheti a swarm, tehát biztos, hogy az előbb létrehozott mg0, mg1 és mg2 valamelyikén fog landolni. Fontos, hogy megadjuk, hogy csak egy példány jöhessen belőle létre. Két fontos mount-ot kell beállítani: # '''/data''': ezt Egy távoli NFS megosztást fogunk felcsatolni a guest VM /var/lib/boot2docker/portainerdata mappájába fogjuk felcsatolniNetshare plugin segítségével, ahova az NFS megosztás mount-olva vanahol a Portainer a perzisztens adatait fogja tárolni. # '''/var/run/docker.sock''': ezt a guest VM docker socket-jére kell rákötni, hogy a portainer hozzáférjen a docker/swarm adatokhoz és tudja is módosítani azokat.
<pre>
--constraint 'node.role == manager' \
--mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
--mount type=bindvolume,src=192.168.42.1/varhome/libadam/boot2dockerProjects/DockerCourse/persistentstore/portainer/data/portainerdata,dst=/data ,volume-driver=nfs \
portainer/portainer -H unix:///var/run/docker.sock
</pre>
Ha a portainer-t swarm service-ként futtatjuk, akkor fontos, hogy command-nak is megadjuk a unix-docker socket használatát: '''-H unix:///var/run/docker.sock'''{{note|A command részben fontos, hogy a unix után három / jel van. Ebből aztán kettő lesz mire konténer lesz belőle, nem pontosan értem, hogy ha escape-elni kell, akkor miért nem négy kell, minden esetre ha csak kettőt írunk, akkor a /run/docker.sock-ban fogja keresni a /var/run/docker.sock helyett}}
jh04xrikkskh portainer.1 portainer/portainer:latest mg0
</pre>
Láthatjuk hogy az mg0 manager node-ra került ki.
 
 
<br>
===Belépés a web-es konzolra===