7,540
edits
Changes
→NFS mount on the VM
=NFS mount on the VM=
Ahogy azt már a bevezetőben láthattuk, a leg fapadosabb megoldás az ha minden egyes guest VM-re (tehát nem a konténerbe) mountoljuk az összes olyan NFS megosztást, amire szüksége lehet valamelyik konténernek, amiket a swarm service létre fog hozni. De mivel nem tudjuk előre megmondani, hogy melyik node-ra fognak kerülni, ezért minden szükséges megosztást minden node-on létrehozunk.
Itt bemutatom, hogyan hozzunk létre egy NFS megosztást a hoszt-on, és hogyan csatoljuk föl azt a megosztást minden egyes VM-re boot2docker használatával. A példában a Portainer service számára fogunk létrehozni egy megosztást, ahol a /data mappáját perzisztens módon tudja tárolni, amiben a beállítások és felhasználó adatok vannak.
==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
Ha a GUI tűzfal szerkesztőben csak a Permanent beállítások közé vesszük fel, akkor újra kell indítani a tűzfalat vagy a gépet. Ha a Runtime-ba is felvesszük, akkor azonnal érvényre jut. (A 'No route to host' tipikusan tűzfal hibára vall)
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.1
Export 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 node-on mount-olni kell az előbb létrehozott NFS megosztást, amiben a Portainer a perzisztens adatait fogja tárolni. Ehhez be kell lépni SSH-val egyenként az összes node-kora és ott futtatni kell a megfelelő '''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 újraindításkor}}
===Kézi mount==
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 mkdir /var/lib/boot2docker/portainerdata
sudo /usr/local/etc/init.d/nfs-client start
sudo 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>
A második parancs elindítja az NFS klienst a mount előtt.
(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-ja, hogy boot perzisztensé tegyük a mount-ot. Fontos, hogy a profile fájlt csak akkor tudjuk írni, ha előtte 777 jogot adunk rá még akkor is ha sudo-t használunk. Ki érti ezt?!
===Automatizált mount script-el===
'''mountNFS.sh'''
<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'
#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 majd mount-olni, így bármelyik manager noder-ra is kerül majd a '''portainer''', ugyan azt a '''/data''' mappát fogja látni.
Itt a teljes módosított creatCluster.sh: File:
[[:File:CreateSwarmClusterOnKVMwithNFSmountWithPortainer.zip |CreateCluster.sh]]
<br>
==Portainer telepítése==
A portainer-t swarm service-ként fogjuk telepíteni. Ki fogjuk kötni 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 a guest VM /var/lib/boot2docker/portainerdata mappájába fogjuk felcsatolni, ahova az NFS megosztás mount-olva van.
# '''/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>
eval $(docker-machine env mg0)
docker service create \
--name portainer \
--publish 9000:9000 \
--replicas=1 \
--constraint 'node.role == manager' \
--mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
--mount type=bind,src=/var/lib/boot2docker/portainerdata,dst=/data \
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}}
Nézzük meg melyik manager node-ra települt a portainer.
<pre>
# docker service ps portainer
ID NAME IMAGE NODE
jh04xrikkskh portainer.1 portainer/portainer:latest mg0
</pre>
Láthatjuk hogy az mg0 manager node-ra került ki.
=Netshare=