7,540
edits
Changes
→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>
<pre>
# docker-machine ssh mg0 docker node ls
<br><br>
=GUI swarm manager management with Portainer=
:[[File:ClipCapIt-180824-214115.PNG]]
Két lehetőségünk van a Portainer futtatására:
* Ahhoz hogy a swarm cluster adatait tudjuk monitorozniA Portainer konténerünket lokálisan futtatjuk, és távolról kapcsolódik valamelyik manager noderemote API-on futó docker démonhoz kell kapcsolódni jához, ahonnan a swarm adatokat is ki tudja olvasni, illetve módosítani is tudja a lokális docker -ben futó Portainer-elkonfigurációt. Ezt A távoli kapcsolatot TLS autentikációval lehet megoldani. Ekkor a Portanier a localhost-on érhető elA Portainer webes felülete csak lokálisan lesz elérhető.* A Portainer-t eleve a manager nodeswarm service-ot is futtató docker démonban ként telepítjük fel azzal a távoli gépenmegkötéssel, ekkor Portanier a távoli gép IP címén érhető elhogy csak manager noder-ra telepíthető. Ekkor a Portainer közvetlen tud csatlakozni a docker A managernode-en on az ottan ott lokális docker démonhoz (ez inkább csak tesztelés céljárasocket-re fog kapcsolódni, ahonnan a swarm adatokat is ki tudja olvasni manager node-okon nem szokás semmi mást futtatni)ról lévén szó. Ekkor a Portainer webes felülete globálisan lesz elérhető mindenki számára.
==Portainer telepítése swarm service-ként==
A legkézenfekvőbb megoldás, ha a Portainer-t swarm service-ként a manager node-ok valamelyikére telepítjük föl. Az már mindegy, hogy melyik manager node-ra kerül, azt bízzuk a swarm-ra (cow személet), bármelyikre is kerül, lokális docker socket-re csatlakozva el fogja érni a cluster adatokat. Egy a fontos, hogy a Portainer adat mappája (/data, ahol a felhasználókat is tárolja) egy közös, perzisztens meghajtón legyen, ami az összes manager node-on elérhető, így mindegy hogy melyik manager node-ra kerül a Portainer.
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 valamelyik docker volume plugin -t kell használjuk, lásd a [[Docker volume orchestration]] című cikket.
A swarm service-ként való futtatásnak az a nagy előnye, hogy a Portainer életciklusát nem nekünk kell kezelni, ha az a manager node meghal, ahova a Portainer eredetileg telepítve volt, akkor a swarm automatikusan újra fogja telepíteni egy másik manager node-on. És mivel a Portainer /data mappáját a manager node-ok között egy közös perzisztens meghajtóra csatoltuk föl, miután a swarm újratelepíti a Portainer-t, az ott tudja folytatni, ahol a mások node-on abba hagyta.
===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.
<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===
A host gépen láthatjuk, hogy az NFS mappában megjelentek a portainer fájlok:
:[[File:ClipCapIt-180824-234015.PNG]]
<br>