Docker volume orchestration

From berki WIKI
Revision as of 16:22, 1 September 2018 by Adam (talk | contribs) (docker volume plugin)

Jump to: navigation, search

<< Back to Docker main


Áttekintés

Az úgynevezett volume orkesztráció kulcsfontosságú a konténeres cluster építésben. Orchestration alatt azt érjük, hogy a több VM-en futó, sok konténerből álló cluster-en az egyes konténerek (amiket "random" telepít fel a swarm valamelyik szabad kapacitású VM-re) hogyan férnek hozzá a futásukhoz szükséges perzisztens tárolóhoz, ahol a konfigurációs állományuk van. Pl. a Portainer-nek hozzá kell férnie egy olyan perzisztens tárolóhoz, ahol az adatbázisát, beállításait tárolni tudja. Ha a Portainer-t swarm service-ként telepítjük fel, akkor nem tudjuk előre megmondani, hogy a swarm melyik node-ra fogja feltelepíteni. Bárhova is telepíti föl, ott rendelkezésre kell álljon a neki szükséges perzisztens állomány. Két fő csapásirány közül választhatunk:

Network file share on the VM

Valamilyen network file system-et mount-unk minden egyes VM-re, ami részt vesz a cluster-ben. (NFS vagy Samba). Aztán a VM-en létrejött megosztásnak a tetejére mount-oljuk a konténer megfelelő mappáját. Ezzel több baj is van, ez produckicós környezetben csak nagyon kis cluster-en működőképes.

  1. Egy bizonyos cluster méret felett nem igazán lehet ugyan azt a network megosztást (pl NFS) minden egyes VM-re mount-olni (sávszélesség, sebesség, erőforrás igény)
  2. Mivel a swarm "random" módon telepíti fel a konténereket, a VM-ek nem is lesz szükség egyáltalán a megosztásra, feleslegesen foglalja majd az erőforrást. Tehát ez így nagyon favágó módszer. (Mivel nem tudjuk hol lesz tegyük oda mindenhova)

docker volume plugin

Használhatunk úgynevezett docker volume plugin-eket, amik lehetőév teszik, hogy on-demand alapon közvetlen a konténerre mount-oljuk föl a network fájlrendszer megfelelő megosztását. Nagyon sokféle volume plugin elérhető a docker-hez, amikkel NFS, AWS, Azure és még sok más network fájlrendszert tudunk közvetlen a konténerbe bekötni. A volume plugin használatakor pont úgy kell megadni a volume-ot mint ha az a lokális VM-en lenne. A plugin elfedi előlünk a network filesystem-hez való csatlakozás komplexitását.

Mikor egy volume-ot megadunk akár a docker run, akár a docker service create parancsban, akkor igazából mindig megadjuk a volume driver típusát

NFS mount on the VM

Netshare

Bemutatás

http://netshare.containx.io/

ClipCapIt-180830-002410.PNG

Mount NFS v3/4, AWS EFS or CIFS

Mesos/Marathon and Docker Swarm

Installálás a boot2docker VM-en

A netshare -nek egy futtatható bináris állománya van. Nincs más dolgunk, mint hogy ezt letöltsük a boot2docker VM-ekbe, és ott elindítsuk. Ekkor létre fog hozni egy volume plugin-t a docker-ben. Fontos, hogy privilegizált felhasználóként futtassuk, hogy hozzá férjen a docker plugin mappájához. A boot2docker mindent módosítást kitöröl újraindításkor, kivéve a /var/lib/boot2docker mappa tartalmát. Csak az marad meg, amit ide írnunk. Tehát a netshare-t is ide kell kicsomagolni, és innen kell futtatni.

docker@mg0:~$ cd /var/lib/boot2docker
docker@mg0:~$ sudo wget https://github.com/ContainX/docker-volume-netshare/releases/download/v0.35/docker-volume-netshare_0.35_linux_amd64.tar.gz

docker@mg0:~$ sudo tar -xvzf docker-volume-netshare_0.35_linux_amd64.tar.gz
docker@mg0:~$ sudo mv docker-volume-netshare_0.35_linux_amd64 netshare
docker@mg0:~$ cd netshare/


A docker-volume-netshare futtatásakor meg kell adni az első argumentumban, hogy az adott netshare példány milyen megosztást támogasson az adott VM-en. Ez lehet NFS, AWS EFS vagy CIFS. Minden egyes megosztási fajtára indíthatunk egy netshare példányt. A boot2docker csak az nfs3 protokollt támogatja, ezért fontos, hogy a netshare indításakor megadjuk az nfs verziót, különben az nfs4-et fogja elindítani, ami boot2docker alatt nem működik.

$ sudo ./docker-volume-netshare nfs -v 3
INFO[0000] == docker-volume-netshare :: Version: 0.35 - Built: 2018-01-27T22:43:03-08:00 == 
INFO[0000] Starting NFS Version 3 :: options: '' 


Induláskor beírja magát ide: /run/docker/plugins, ezért nem kell külön docker plugin-ként telepíteni.

# docker-machine ssh mg0 sudo ls /run/docker/plugins
nfs.sock

Docker standalone

# docker run -i -t --name ubuntu --volume-driver=nfs -v 192.168.42.1/home/adam/Projects/DockerCourse/persistentstore/portainer/data/:/data ubuntu /bin/bash
root@5e82828c7a37:/#
...
INFO[0060] Mounting NFS volume 192.168.42.1:/home/adam/Projects/DockerCourse/persistentstore/portainer/data/ on /var/lib/docker-volumes/netshare/nfs/192.168.42.1/home/adam/Projects/DockerCourse/persistentstore/portainer/data 
...


root@5e82828c7a37:/# ls /data
adam


# docker rm -f ubuntu
...
INFO[0388] Unmounting volume name 192.168.42.1/home/adam/Projects/DockerCourse/persistentstore/portainer/data/ from /var/lib/docker-volumes/netshare/nfs/192.168.42.1/home/adam/Projects/DockerCourse/persistentstore/portainer/data 
...

Volume létrehozása

Swarm service

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=volume,src=192.168.42.1/home/adam/Projects/DockerCourse/persistentstore/portainer/data/,dst=/data,volume-driver=nfs \
portainer/portainer -H unix:///var/run/docker.sock
# docker volume ls
DRIVER              VOLUME NAME
nfs                 192.168.42.1/home/adam/Projects/DockerCourse/persistentstore/portainer/data/
WarningIcon.png

Warning
Valami olyat vettem észre, hogy ha swarm service-ként is fel van csatolva egy mappa, akkor azt nem lehet egy standalone swarm konténerbe is felcsatolni: failed: Device or resource busy

Viszont még egy VM-en belül is, akár több konténerhez is fel lehet ugyan azt csatolni


Futtatás a háttérben

sudo chmod 777 /var/lib/boot2docker/profile
sudo echo 'cd /var/lib/boot2docker/netshare' >> /var/lib/boot2docker/profile
sudo echo 'sudo nohup ./docker-volume-netshare nfs -v 3 &' >> /var/lib/boot2docker/profile


A logokat a /var/log/boot2docker.log fájlba fogja írni, nem a nohup.out-ba.

ImportantIcon.png

Note
Ha újra indul a VM (és vele együtt a netshare) akkor az összes megosztás elveszik, mivel a netshare nem perzisztálja a rajta létrehozott megosztásokat. Ez a swarm service-eket kicsit sem zavarja, mert ha a swarm service nem indul el, akkor indít belőle egy új példányt a swarm, ami létre fogja hozni megint a megosztást, és újra fel fogja csatolni a távoli mappát. Ugyanez nem elmondható a standalone konténerekről, amiket a docker run-al hoztunk létre. Ezekből nem fog új példány indulni, viszont nem fognak tudni elindulni, mivel a megosztás már nem létezik a netshare dirver-ben. Ezeket újra létre kell hozni (lehet hogy a --restart always segíthet ezen)


Automatikus telepítés

installNetshare.sh

#!/bin/bash


# Usage: ./installNetshare.sh machine-name

machineName=$1

#Download Netshare binary into the users home directory (/home/docker)
docker-machine ssh $machineName "sudo wget https://github.com/ContainX/docker-volume-netshare/releases/download/v0.35/docker-volume-netshare_0.35_linux_amd64.tar.gz"

#Unpack Netshare
docker-machine ssh $machineName "sudo tar -xvzf docker-volume-netshare_0.35_linux_amd64.tar.gz"
docker-machine ssh $machineName "sudo mv docker-volume-netshare_0.35_linux_amd64 /var/lib/boot2docker/"
docker-machine ssh $machineName "sudo mv /var/lib/boot2docker/docker-volume-netshare_0.35_linux_amd64 /var/lib/boot2docker/netshare"
docker-machine ssh $machineName "sudo chmod 777 /var/lib/boot2docker/netshare/"

#Start NFS during system start up
docker-machine ssh $machineName "sudo chmod 777 /var/lib/boot2docker/profile"
docker-machine ssh $machineName "sudo echo 'cd /var/lib/boot2docker/netshare' >> /var/lib/boot2docker/profile"
docker-machine ssh $machineName "sudo echo 'sudo nohup ./docker-volume-netshare nfs -v 3 &' >> /var/lib/boot2docker/profile"

#Restart the sytem for the modifications to take effect
#docker-machine restart $machineName
virsh shutdown $machineName
sleep 20s
virsh start $machineName

Sajnos a docker-machine ssh machine command paranccsal nem lehet valamiért elindítani a netshare-t. Tehát ez a formula nem működik:

docker-machine ssh mg0 sudo nohup nohup ./docker-volume-netshare nfs -v 3 &

Ugyan nem dob hibát, de nem is csinál semmit. Így muszáj újraindítani a VM-et, hogy a /profile fájlban lévő netshare indítás lefusson. Lehet hogy valahogy újra lehetne tölteni a profile-t, de itt a boot2docker-ban semmi nem megy könnyen.

Ezen felül azt is észrevettem, hogy ha a docker-machine restart paranccsal indítom újra a VM-et néha elveszik minden módosítás, hiba írtam azokat a perzisztens mappába (/var/lib/boot2docker). Ezrét inkább a virsh-val indítom újra.

Érdemes lenne monitorozni, hogy elindult e már a VM mielőtt tovább megyünk. Vagy hogy tényleg leállt e mielőtt elindítjuk.



Convoy

https://github.com/rancher/convoy

REX-Ray

Trident