Etude, conception et implémentation d'un cluster low-cost haut disponibilité de Raspberry Pi 3( Télécharger le fichier original )par Rodrigue Tchuenche Institut Africain d'Informatique (IAI) - Ingénieur 2016 |
CONCLUSION GÉNÉRALEArrivé au terme de notre travail sur la conception et l'implémentation d'un cluster low-cost haute disponibilité basé sur Raspberry Pi, nous sortons très bénéfiques et satisfait des travaux réalisés. les résultats sont très encourageants. le travail que nous avons mené durant ces cinq (05) mois de stage a abouti à la réalisation de notre première version de cluster. Cette réalisation a mis en avant l'utilisation des technologies comme Docker et Docker Swarm qui font partir des nouvelles technologies à la mode du moment. Après évaluation de notre cluster, nous pouvons affirmer que le challenge en coût et en énergie a été atteint. Notre solution se trouve ainsi bien adaptée à tout genre d'entreprises désirant s'offrir un serveur. Elle se trouve aussi adaptée à fonctionner dans les conditions plus ou moins dégradées en énergie vue qu'avec une petite batterie de véhicule, nous pouvont faire tourner notre cluster. Ce qui convient bien aux zones reculées sans couverture d'énergie électrique. Nous comptons poursuivre le travail étant donné que c'est un projet initié par la structure qui nous a accueillis et dans laquelle nous comptons être employés. Dans la suite du projet, il sera réalisé avec plus de Raspberry Pi ou avec des nano-ordinateurs Udoo qui sont plus puissants que les Raspberry Pi. Nous comptons aussi nous servir des Docker pas seulement pour Odoo, mais également pour beaucoup d'autres applications du même type client-serveur. En dépit de quelques difficultés rencontrées que nous pensons mineures et normales dans le déroulement de toute oeuvre humaine, nous avons atteint nos objectifs. Ce stage a été plus qu'une expérience enrichissante à tout point de vue. Il nous a permis à mieux organiser et manager notre temps. Ce stage nous a été bénéfique du point de vue connaissance car nous avons pu découvrir certains outils en pleine évolution : les Raspberry Pi et les Docker. Nous nous sommes familiarisés avec ces outils. Pour finir, nous pouvons conclure que ce stage a contribué à accroitre nos connaissances en administration système Linux. c~Tchuenché Rodrigue Élève Ingénieur En Informatique 55 56 Les Annexes .1 Annexe 1 Installation Système: <>
2. Source : http://blog.hypriot.com/getting-started-with-docker-on-your-arm-device/ 57 IAI Gabon FIGURE 3 - Fenêtre WinDiskImager FIGURE 4 - Fenêtre Zenmap c~Tchuenché Rodrigue Élève Ingénieur En Informatique 57 dans la zone commande, taper la commande nmap -sn 172.16.0.0/16 NB : Les adresses utilisées ici sont les adresses de notre structure et celle dont nous utilisons pour notre cluster. Après avoir identifié l'adresse du noeud en question, lancer Putty.exe (Voir figure) et se connecter (clic sur open) en ssh sur le noeud pour des éventuelles modifications comme: -- changer l'adresse IP dynamique en static -- changer le nom du noeud -- vérifier que le nouveau noeud est dans le réseau du cluster sinon, le connecter au réseau du cluster. Une fois cliquer sur open, si le noeud est bien en réseau, on aura cette fenêtre : (Voir figure) Pour se connecter à HYPRIOT OS (noeud), taper les paramètres suivants : login : root mot de pass : hypriot Une fois ces paramètres bien saisis et validés, on obtient cette fenêtre :(Voir figure) 58 IAI Gabon FIGURE 5 - Fenêtre Putty.exe FIGURE 6 - Fenêtre connexion Hypriot OS c~Tchuenché Rodrigue Élève Ingénieur En Informatique 58 .2 Annexe 2 Configuration Adresse IP : <> Pour changer l'adresse IP, éditer le fichier /etc/network/in-terfaces en ajoutant le contenu suivant en supposant que nous voulons fixer les paramètres suivants en mode administrateur (sudo) : -- adresse IP : 172.16.0.51 -- masque : 255.255.0.0 -- passerelle : 172.16.0.1 Éditer le fichier /etc/network/interfaces en mode administrateur (sudo) $sudo nano /etc/network/interfaces 59 IAI Gabon c~Tchuenché Rodrigue Élève Ingénieur En Informatique 59 FIGURE 7 - Fenêtre acceuil Hypriot OS .3 Annexe 3 Configuration Nom des noeuds <> $sudo nano /boot/occidentalis.txt # hostname for your Hypriot Raspberry Pi: hostname=hypriot-pi # basic wireless networking options: wifi_ssid=SSID wifi_password="secret_password" ou $sudo nano /boot/device-init.yaml hostname: black-pearl wifi: interfaces: wlan0: ssid: "MyNetwork" password: "secret_password" NB : Après avoir changé ces paramètres, redemarrer la machine et se reconnecter. Répéter cette étape pour tous les 10 noeuds du cluster. À ce stade, le noeud est fonctionnel et prêt à être configurer pour faire partie du cluster. 60 IAI Gabon c~Tchuenché Rodrigue Élève Ingénieur En Informatique 60 .4 Annexe 4 Installation du Docker: <> Connecter le noeud (ou la machine) à internet, lancer l'invite de commande et taper les commandes suivantes :
Une fois installé, taper la commande docker info et verifier qu'on obtient un resultat semblable à ceci : $ docker info Containers: 3 Running: 3 Paused: 0 Stopped: 0 Images: 2 Server Version: 1.10.2 Storage Driver: overlay Backing Filesystem: extfs Execution Driver: native-0.2 Logging Driver: json-file Plugins: Volume: local Network: bridge null host Kernel Version: 4.1.17-hypriotos-v7+ Operating System: Raspbian GNU/Linux 8 (jessie) OSType: linux Architecture: armv7l CPUs: 4 Total Memory: 925.5 MiB Name: black-pearl2 ID: FNWT:25U4:JGOW:SJPB:52UX:U7H6:FWPT:GVIY:54B5:PTD2:LESJ:7F2Z Debug mode (server): true File Descriptors: 40 Goroutines: 74 System Time: 2016-10-06T13:45:39.411942274+02:00 EventsListeners: 1 Init SHA1: dfeb8c17f8c3a118753fea8353b715a7a75f5491 Init Path: /usr/lib/docker/dockerinit Docker Root Dir: /var/lib/docker Cluster store: consul://172.16.0.51:8500 Cluster advertise: 172.16.0.52:2375 ou taper la commande docker version $ docker version Client: 61 IAI Gabon c~Tchuenché Rodrigue Élève Ingénieur En Informatique 61 Version: 1.10.2 API version: 1.22 Go version: go1.4.3 Git commit: c3959b1 Built: Wed Feb 24 09:51:38 2016 OS/Arch: linux/arm Server: Version: 1.10.2 API version: 1.22 Go version: go1.4.3 Git commit: c3959b1 Built: Wed Feb 24 09:51:38 2016 OS/Arch: linux/arm NB : Faire ceci sur tous les noeuds où l'on veut installer le moteur docker. A ce niveau où nous avons installé le moteur Docker, Nous pouvons déjà créer un Container Docker .5 Annexe 5 Création d'image Docker <> # vim:set ft=dockerfile: FROM resin/rpi-raspbian:jessie MAINTAINER Rodrigue Dester < rodridest@gmail.com> # explicitly set user/group IDs RUN groupadd -r postgres --gid=999 && useradd -r -g postgres --uid=999 postgres # grab gosu for easy step-down from root RUN gpg --keyserver pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A95BF357DD4 RUN apt-get update && apt-get install -y --no-install-recommends ca- certificates wget && rm -rf /var/lib/apt lists/* \ && wget -O /usr/local/bin/gosu " https://github.com/tianon/gosu/releases /download/1.2/gosu-$(dpkg --print architecture)" \ && wget -O /usr/local/bin/gosu.asc " https://github.com/tianon/gosu/ releases/download/1.2/gosu-$(dpkg --print architecture).asc" \ && gpg --verify /usr/local/bin/gosu.asc \ && rm /usr/local/bin/gosu.asc \ && chmod +x /usr/local/bin/gosu \ && apt-get purge -y --auto-remove ca-certificates wget 62 IAI Gabon ENV LANG en_US.utf8 RUN mkdir /docker-entrypoint-initdb.d ENV PG MAJOR 9.4 _ #ENV PG_VERSION 9.4.8-0+deb8u1 ENV PG_VERSION 9.4.9-0+deb8u1 RUN apt-get update \ && apt-get install -y postgresql-common \ && sed -ri 's/#(create_main_cluster) .*$/\1 = false/' /etc/postgresql- common/createcluster.conf \ && apt-get install -y \ postgresql-$PG_MAJOR=$PG_VERSION \ postgresql-contrib-$PG_MAJOR=$PG_VERSION \ && rm -rf /var/lib/apt/lists/* RUN mkdir -p /var/run/postgresql && chown -R postgres /var/run/postgresql ENV PATH /usr/lib/postgresql/$PG_MAJOR/bin:$PATH ENV PGDATA /var/lib/postgresql/data VOLUME /var/lib/postgresql/data COPY docker-entrypoint.sh / RUN chmod +x / docker-entrypoint.sh ENTRYPOINT ["/ docker-entrypoint.sh"] EXPOSE 5432 CMD ["postgres"] La syntaxe du Dockerfile : 3 FROM <image> ou FROM <image> :<tag> ou FROM <image>@<digest> FROM : indique sur quelle distribution ou image de référence va se baser cette nouvelle Image Docker. MAINTAINER <name> MAINTAINER: indique qui est responsable de cette image. RUN <command> ou RUN ["executable", "param1", "param2"] RUN : ensemble de commande qui vont successivement être exécutées pour créer cette Image Docker. ENV <key> <value> ou ENV <key>=<value> ENV : permet de définir des variables d'environnements qui pourront ensuite être modifiées grâce au paramètre de la commande run --env <key>=<value>. COPY <src>... <dest> ou COPY ["<src>",... "<dest>"] ou ADD <src>... <dest> ou ADD ["<src>",... "<dest>"] COPY ou ADD : permet de copier un fichier depuis la machine hôte ou depuis une URL VOLUME ["/data"] VOLUMES : permet de créer un point de montage qui permettra de persister les données. On pourra alors choisir de monter ce volume dans un dossier spécifique en utilisant la com- mande run -v : EXPOSE <port> [<port>...] EXPOSE : permet d'ouvrir des ports de communication TCP / UDP pour communiquer avec le reste du monde 3. Source : https://www.grafikart.fr/tutoriels/docker/dockerfile-636, Source: https://docs.docker.com/engine/reference/builder/ c~Tchuenché Rodrigue Élève Ingénieur En Informatique 62 63 IAI Gabon ENTRYPOINT ["executable", "param1", "param2"] ou ENTRYPOINT command param1 param2 ENTRYPOINT : permet d'ajouter une commande qui sera exécutée par défaut, et ce, même si on choisit d'exécuter une commande différente de la commande standard. CMD ["executable","param1","param2"] ou CMD ["param1","param2"] ou CMD command param1 param2 CMD : détermine la commande qui sera exécutée lorsque le container démarrera. elle détermine les paramètres que vont prendre en compte le fichier bash de la commande ENTRY-POINT NB : Pour plus d'information ici Contenu docker-entrypoint.sh #!/bin/bash set -e set_listen_addresses() { sedEscapedValue="$(echo "$1" | sed 's/[\/&]/\\&/g')" sed -ri "s/^#?(listen_addresses\s*=\s*)\S+/\1'$sedEscapedValue'/" " $PGDATA/postgresql.conf" } if [ "$1" = 'postgres' ]; then mkdir -p "$PGDATA" chown -R postgres "$PGDATA" chmod g+s /run/postgresql chown -R postgres /run/postgresql # look specifically for PG_VERSION, as it is expected in the DB dir if [ ! -s "$PGDATA/PG_VERSION" ]; then gosu postgres initdb # check password first so we can output the warning before postgres # messes it up if [ "$POSTGRES_PASSWORD" ]; then pass="PASSWORD '$POSTGRES_PASSWORD'" authMethod=md5 else # The - option suppresses leading tabs but *not* spaces. :) cat >&2 <<-'EOWARN' **************************************************** WARNING: No password has been set for the database. This will allow anyone with access to the Postgres port to access your database. In Docker's default configuration, this is c~Tchuenché Rodrigue Élève Ingénieur En Informatique 63 64 IAI Gabon effectively any other container on the same system. Use "-e POSTGRES_PASSWORD=password" to set it in "docker run". **************************************************** EOWARN pass= authMethod=trust fi { echo; echo "host all all 0.0.0.0/0 $authMethod"; } >> " $PGDATA/pg_hba.conf" # internal start of server in order to allow set-up using psql- client # does not listen on TCP/IP and waits until start finishes gosu postgres pg_ctl -D "$PGDATA" \ -o "-c listen_addresses=''" \ -w start : ${POSTGRES_USER:=postgres} : ${POSTGRES_DB:=$POSTGRES_USER} export POSTGRES_USER POSTGRES_DB if [ "$POSTGRES_DB" != 'postgres' 1; then psql --username postgres <<-EOSQL CREATE DATABASE "$POSTGRES_DB" ; EOSQL echo fi if [ "$POSTGRES_USER" = 'postgres' 1; then op='ALTER' else op='CREATE' fi psql --username postgres <<-EOSQL $op USER "$POSTGRES_USER" WITH SUPERUSER $pass ; EOSQL echo echo for f in /docker-entrypoint-initdb.d/*; do case "$f" in *.sh) echo "$0: running $f"; . "$f" ;; *.sql) echo "$0: running $f"; psql --username " c~Tchuenché Rodrigue Élève Ingénieur En Informatique 64 65 IAI Gabon c~Tchuenché Rodrigue Élève Ingénieur En Informatique 65 $POSTGRES_USER" --dbname "$POSTGRES_DB" < "$f" && echo ;; *) echo "$0: ignoring $f" ;; esac echo done gosu postgres pg_ctl -D "$PGDATA" -m fast -w stop set_listen_addresses '*' echo echo 'PostgreSQL init process complete; ready for start up.' echo fi exec gosu postgres "$@" fi exec "$@" Après avoir créé le Dockerfile, on crée l'image avec la commande suivante : En supposant que notre Dockerfile et docker-entrypoint.sh sont dans un dossier dester/postgres, on a : $docker build -t postgresql dester/postgres FIGURE 8 - Fenêtre docker build L'option -t ici permet de donner un nom à l'image. Lorsque cette commande est validée, docker va d'abord chercher en local dans le dossier « dester/postgres » s'il trouve un Dockerfile. Si c'est le cas, il l'exécute sinon il cherche sur internet dans le site dépôt officiel Docker Hub. S'il ne trouve pas sur internet, alors une erreur sera généré. À la fin de création, voir l'image crée à l'aide de la commande docker image. Contenu Dockerfile Odoo FROM resin/rpi-raspbian:jessie MAINTAINER Rodrigue Dester < rodridest@gmail.com> 66 IAI Gabon c~Tchuenché Rodrigue Élève Ingénieur En Informatique 66 # Install some deps, lessc and less-plugin-clean-css, and wkhtmltopdf RUN set -x; \ apt-get update \ && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ node-less \ python-gevent \ python-pip \ python-pyinotify \ python-renderpm \ python-support \ && apt-get install wkhtmltopdf -y # Install Odoo ENV ODOO_VERSION 9.0 ENV ODOO_RELEASE 20161103 RUN set -x; \ curl -o odoo.deb -SL http://nightly.odoo.com/${ODOO_VERSION}/nightly/ deb/odoo_${ODOO_VERSION}c.${ODOO_RELEASE}_all.deb \ && echo 'b5f88c06d8ba3475fa5ef15d93e504891c648f8e odoo.deb' | sha1sum - c - \ && dpkg --force-depends -i odoo.deb \ && apt-get update \ && apt-get -y install -f --no-install-recommends \ && rm -rf /var/lib/apt/lists/* odoo.deb # Copy entrypoint script and Odoo configuration file COPY ./ docker-entrypoint.sh / RUN chmod +x / docker-entrypoint.sh COPY ./openerp-server.conf /etc/odoo/ RUN chown odoo /etc/odoo/openerp-server.conf # Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons RUN mkdir -p /mnt/extra-addons \ && chown -R odoo /mnt/extra-addons VOLUME ["/var/lib/odoo", "/mnt/extra-addons"] # Expose Odoo services EXPOSE 8069 8071 # Set the default config file ENV OPENERP_SERVER /etc/odoo/openerp-server.conf # Set default user when running the container #USER odoo ENTRYPOINT ["/ docker-entrypoint.sh"] CMD ["openerp-server"] 67 IAI Gabon Contenu openerp-server.conf A modifier selon les configuration du système : [options] addons_path = /mnt/extra-addons,/usr/lib/python2.7/dist-packages/openerp/ addons data_dir = /var/lib/odoo auto_reload = True ; admin_passwd = admin ; csv_internal_sep = , ; db_maxconn = 64 ; db_name = False ; db_template = template1 ; dbfilter = .* ; debug_mode = False ; email_from = False ; limit_memory_hard = 2684354560 ; limit_memory_soft = 2147483648 ; limit_request = 8192 ; limit_time_cpu = 60 ; limit_time_real = 120 ; list_db = True ; log_db = False ; log_handler = [':INFO'] ; log_level = info ; logfile = None ; longpolling_port = 8072 ; max_cron_threads = 2 ; osv_memory_age_limit = 1.0 ; osv_memory_count_limit = False ; smtp_password = False ; smtp_port = 25 ; smtp_server = localhost ; smtp_ssl = False ; smtp_user = False ; workers = 0 ; xmlrpc = True ; xmlrpc_interface = ; xmlrpc_port = 8069 ; xmlrpcs = True ; xmlrpcs_interface = ; xmlrpcs_port = 8071 Contenu du fichier docker-entrypoint.sh.sh: #!/bin/bash set -e # set the postgres database host, port, user and password : ${HOST:=${DB_PORT_5432_TCP_ADDR:='db'}} : ${PORT:=${DB_PORT_5432_TCP_PORT:=5432}} c~Tchuenché Rodrigue Élève Ingénieur En Informatique 67 68 IAI Gabon c~Tchuenché Rodrigue Élève Ingénieur En Informatique 68 : ${USER:=${DB_ENV_POSTGRES_USER:=${POSTGRES_USER:='odoo'}}} : ${PASSWORD:=${DB_ENV_POSTGRES_PASSWORD:=${POSTGRES_PASSWORD:='odoo'}}} # pass them as arguments to the odoo process DB_ARGS=("--db_user" $USER "--db_password" $PASSWORD "--db_host" $HOST "-- db_port" $PORT) case "$1" in -- | openerp-server) shift exec openerp-server "${DB_ARGS[@]}" "$@" -*) *) ;; exec openerp-server "${DB_ARGS[@]}" "$@" ;; exec "$@" esac exit 1 Après avoir créé le Dockerfile, on crée l'image avec la commande suivante : En supposant que notre Dockerfile et docker-entrypoint.sh sont dans un dossier dester/odoo, on a : $docker build -t odoo9.0 dester/odoo .6 Annexe 6 Exporter une image : <> (soit l'image odoo_c9) $docker save odoo_c9 > dester/odoo/odoo_c9.tar $docker load -i dester/odoo/odoo_c9.tar Pour voir les images créées, taper la commande suivante : $docker images REPOSITORY TAG IMAGE ID CREATED SIZE odoo9c latest 411ffb00ac5b 6 weeks ago 1.061 GB hypriot/rpi-swarm latest c298de062190 7 months ago 13.27 MB hypriot/rpi-busybox-httpd latest fbd9685c5ffc 16 months ago 2.156 MB .7 Annexe 7 Création Container Docker : Le container postgres au nom de db et le container odoo au nom de odoo-c-9.0 <> # container postgresql "db" 69 IAI Gabon FIGURE 9 - Fenêtre docker images docker run --name db -d --restart=always -v /var/lib/postgresql/data:/var/lib/ postgresql/data -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -p 5432:5432 postgresql #container Odoo avec lien "link" sur postgresql "db" docker run --name odoo_c_9.0 --restart=always -v /root/dester/:/etc/odoo -v / mnt/extra-addons:/mnt/extra-addons -v /var/lib/odoo:/var/lib/odoo -p 8069:8069 --link db:db -t odoo9.0 Explication de quelques attributs et paramètres de cette commande : -- --name permet de definir le nom du container Docker. Ici 'db' pour postgrqsql et 'odoo-c-9.0' pour Odoo -- --restart=always permet un démarrage automatique du docker à chaque redémarrage de la machine (noeud) -- -e POSTGRES_PASSWORD=odoo : permet d'initialiser la variable POSTGRES_PASSWO à postgres qui représente ici le mot de passe de connexion à la base de données à l'inté- rieur du docker. -- -d permet au docker de tourner en libérant la console. -- -p permet de faire correspondre le port de connexion à l'application dans le container au port de la machine physique (-p port-machinehote :port-dans-le-docker). remarquer que le port-dans-le-docker correspond au port EXPOSE dans le Dockerfile. -- postgresql ici correspond à l'image crée précédemment. -- -v : permet d'indiquer un dossier sur la machine physique pour persister les données du container. (-v dossier_machine_physique :dossier_dans_docker) Si la création (le docker run) se passe bien, la commande docker ps permet de voir les docker crée uniquement encours d'exécution dans la machine hôte. La commande docker ps -a permet de voir tous les containers (encours, suspendus,etc.) dans la machine hôte. $docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2009b2442c49 hypriot/rpi-dockerui "/dockerui -e http://" 6 weeks ago Up 6 hours 0.0.0.0:9000->9000/tcp tiny_saha a9f57b9e9ebf hypriot/rpi-swarm "/swarm manage -H :60" 6 weeks ago Up 6 hours 2375/tcp, 0.0.0.0:6000->6000/tcp naughty_hugle 86ee357572d3 hypriot/rpi-swarm "/swarm join -adverti" 6 weeks ago Up 6 hours 2375/tcp swarm-agent-2 c~Tchuenché Rodrigue Élève Ingénieur En Informatique 69 70 IAI Gabon c~Tchuenché Rodrigue Élève Ingénieur En Informatique 70 $docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c7b8e84ffb4e hypriot/rpi-busybox-httpd "/bin/busybox httpd -" 6 weeks ago Exited (137) 6 weeks ago 0.0.0.0:80->80/tcp busybox1 f58d0a4e0439 hypriot/rpi-consul "/consul agent -dev -" 6 weeks ago Up 6 hours consul 1550aec5185f hypriot/rpi-swarm "/swarm join -adverti" 7 weeks ago Up 6 hours 2375/tcp swarm-agent-1 On constate que pour un container Docker donné, on a : ~ CONTAINER ID : c'est un id permettant d'identifier un container de façon unique. ~ IMAGE : c'est l'image à partir de laquelle on a crée le container. ~ COMMAND : c'est la commande qui s'exécute au lancement du docker container. ~ CREATED : c'est la date de création du container Docker. ~ STATUS : c'est l'état du container à un moment donné. ~ NAME : c'est le nom du container. Ce nom est soit généré automatiquement par le moteur docker à la création du container soit donner par l'utilisateur. NB : Une fois le container docker créé et encours, on peut soit l'arrêter, le supprimer ou le relancer. Soit le Container odoo_9 : docker stop odoo_9; docker rm odoo_9; docker start odoo_9. La connexion au serveur postgresql ou à l'application odoo se fait normalement comme dans une machine ou un serveur standard à partir de l'adresse du noeud. Nous pouvons ainsi lancer autant de container à partie de la même image. Dans le cas d'Odoo, nous pouvons lancer autant d'instances odoo souhaitées selon la puissance du noeud. Il suffit dans notre cas de changer la correspondance de port sur la machine (noeud) physique en laissant le port du docker fixe puisqu'il correspond au port dans l'image et de changer aussi le nom du container docker. Exemple $docker run --name odoo_91 --restart=always -v /var/lib/postgresql/data:/var/ lib/postgresql/data -e POSTGRES_PASSWORD=postgres -d -p 8070:8069 -p 5433:5432 odoo_c9 $docker run --name odoo_92 --restart=always -v /var/lib/postgresql/data:/var/ lib/postgresql/data -e POSTGRES_PASSWORD=postgres -d -p 8071:8069 -p 5434:5432 odoo_c9 $docker run --name odoo_93 --restart=always -v /var/lib/postgresql/data:/var/ lib/postgresql/data -e POSTGRES_PASSWORD=postgres -d -p 8072:8069 -p 5435:5432 odoo_c9 .8 Annexe 8 Mise en oeuvre Docker swarm: <> 71 IAI Gabon c~Tchuenché Rodrigue Élève Ingénieur En Informatique 71 a) Sur chaque noeud du cluster, faire ceci
$systemctl restart docker b) Sur le noeud Consul, s'assurer que l'image rpi-consul existe et faire ceci
$docker run -d --restart=always --name=swarm-agent-1 hypriot/rpi-swarm join -advertise 172.16.0.51:2375 consul://172.16.0.51:8500 c) Sur le noeud master actif, faire ceci:
72 IAI Gabon c~Tchuenché Rodrigue Élève Ingénieur En Informatique 72 $docker network create --driver=overlay --subnet=172.16.0.0/16 cluster_network 5. container pour visualiser les informations du cluster en interface graphique sur le port 9000 (choix du port arbitraire) $docker run -d -p 9000:9000 --restart=always --privileged --env=" constraint:node==black-pearl2" hypriot/rpi-dockerui -e http ://172.16.0.52:6000 d) Sur le noeud master passif, faire ceci:
$docker run -d -p 9000:9000 --restart=always --privileged --env=" constraint:node==black-pearl6" hypriot/rpi-dockerui -e http ://172.16.0.56:6000 e) Sur le reste des noeuds esclaves, faire ceci: #l'adresse IP 172.16.0.53 est appliqué au noeud 3, la changer pour les autres noeuds esclaves. 1. Configuration du noeud esclave $docker run -d --restart=always --name=swarm-agent-3 hypriot/rpi-swarm join -advertise 172.16.0.53:2375 consul://172.16.0.51:8500 Après avoir fini, vérifier que le cluster est bien fonctionnel en vérifiant les résultats de ces commandes : 1. Information générale sur le cluster $ docker -H :6000 info Containers: 20 Running: 15 Paused: 0 Stopped: 5 Images: 20 Server Version: swarm/1.1.3 Role: replica Primary: 172.16.0.56:6000 73 IAI Gabon c~Tchuenché Rodrigue Élève Ingénieur En Informatique 73 Strategy: spread Filters: health, port, dependency, affinity, constraint Nodes: 9 black-pearl1: 172.16.0.51:2375 âStatus: Healthy âContainers: 3 âReserved CPUs: 0 / 4 âReserved Memory: 0 B / 971.8 MiB âLabels: executiondriver=native-0.2, kernelversion=4.1.17-hypriotos-v7 +, operatingsystem=Raspbian GNU/Linux 8 (jessie), storagedriver= overlay âError: (none) âUpdatedAt: 2016-10-24T10:29:52Z black-pearl2: 172.16.0.52:2375 âStatus: Healthy âContainers: 3 âReserved CPUs: 0 / 4 âReserved Memory: 0 B / 971.8 MiB âLabels: executiondriver=native-0.2, kernelversion=4.1.17-hypriotos-v7 +, operatingsystem=Raspbian GNU/Linux 8 (jessie), storagedriver= overlay âError: (none) âUpdatedAt: 2016-10-24T10:29:57Z black-pearl3: 172.16.0.53:2375 âStatus: Healthy âContainers: 1 âReserved CPUs: 0 / 4 âReserved Memory: 0 B / 971.8 MiB âLabels: executiondriver=native-0.2, kernelversion=4.1.17-hypriotos-v7 +, operatingsystem=Raspbian GNU/Linux 8 (jessie), storagedriver= overlay âError: (none) âUpdatedAt: 2016-10-24T10:30:39Z black-pearl4: 172.16.0.54:2375 âStatus: Healthy âContainers: 3 âReserved CPUs: 0 / 4 âReserved Memory: 0 B / 971.8 MiB âLabels: executiondriver=native-0.2, kernelversion=4.1.17-hypriotos-v7 +, operatingsystem=Raspbian GNU/Linux 8 (jessie), storagedriver= overlay âError: (none) âUpdatedAt: 2016-10-24T10:30:19Z black-pearl5: 172.16.0.55:2375 âStatus: Healthy âContainers: 3 âReserved CPUs: 0 / 4 âReserved Memory: 0 B / 971.8 MiB âLabels: executiondriver=native-0.2, kernelversion=4.1.17-hypriotos-v7 +, operatingsystem=Raspbian GNU/Linux 8 (jessie), storagedriver= 74 IAI Gabon c~Tchuenché Rodrigue Élève Ingénieur En Informatique 74 overlay âError: (none) âUpdatedAt: 2016-10-24T10:30:44Z black-pearl6: 172.16.0.56:2375 âStatus: Healthy âContainers: 2 âReserved CPUs: 0 / 4 âReserved Memory: 0 B / 971.8 MiB âLabels: executiondriver=native-0.2, kernelversion=4.1.17-hypriotos-v7 +, operatingsystem=Raspbian GNU/Linux 8 (jessie), storagedriver= overlay âError: (none) âUpdatedAt: 2016-10-24T10:30:01Z black-pearl7: 172.16.0.57:2375 âStatus: Healthy âContainers: 1 âReserved CPUs: 0 / 4 âReserved Memory: 0 B / 971.8 MiB âLabels: executiondriver=native-0.2, kernelversion=4.1.17-hypriotos-v7 +, operatingsystem=Raspbian GNU/Linux 8 (jessie), storagedriver= overlay âError: (none) âUpdatedAt: 2016-10-24T10:30:32Z black-pearl8: 172.16.0.58:2375 âStatus: Healthy âContainers: 1 âReserved CPUs: 0 / 4 âReserved Memory: 0 B / 971.8 MiB âLabels: executiondriver=native-0.2, kernelversion=4.1.17-hypriotos-v7 +, operatingsystem=Raspbian GNU/Linux 8 (jessie), storagedriver= overlay âError: (none) âUpdatedAt: 2016-10-24T10:30:29Z black-pearl9: 172.16.0.59:2375 âStatus: Healthy âContainers: 3 âReserved CPUs: 0 / 4 âReserved Memory: 0 B / 971.8 MiB âLabels: executiondriver=native-0.2, kernelversion=4.1.17-hypriotos-v7 +, operatingsystem=Raspbian GNU/Linux 8 (jessie), storagedriver= overlay âError: (none) âUpdatedAt: 2016-10-24T10:30:40Z Plugins: Volume: Network: Kernel Version: 4.1.17-hypriotos-v7+ Operating System: linux Architecture: arm CPUs: 36 75 IAI Gabon Total Memory: 8.541 GiB Name: a9f57b9e9ebf Dans ce résultat info, nous avons :
.9 Annexe 9 Répartition de charge : <> c~Tchuenché Rodrigue Élève Ingénieur En Informatique 75 76 IAI Gabon c~Tchuenché Rodrigue Élève Ingénieur En Informatique 76 FIGURE 11 - Fenêtre résultat docker ps sur cluster
Le fichier de configuration est le suivant /etc/haproxy/haproxy.cfg. Faites un backup du fichier de base au cas ou. Contenu du fichier dans notre cas. (en respectant l'indentation) global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private # Default ciphers to use on SSL-enabled listening sockets. # For more information, see ciphers(1SSL). This list is from: # https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers / ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+ AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES: RSA+3DES:!aNULL:!MD5:!DSS ssl-default-bind-options no-sslv3 defaults 77 IAI Gabon log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http listen stats :70 stats enable stats hide-version stats scope webfront stats scope webbackend stats uri / stats realm Haproxy\ Statistics stats auth haproxy:secret stats refresh 1s frontend webfront bind 172.16.0.50:8070 mode http option httplog default_backend webbackend backend webbackend mode http option forwardfor option httpchk balance roundrobin
option httpchk GET / http-check expect status 200 Explication de quelques terminologie: global : Dans cette section, on défini les paramètres globaux de haproxy, les logs (dans syslog), l'utilisateur et le groupe de fonctionnement du service. Il est possible aussi si le serveur héberge plusieurs services de chrooter haproxy. defaults: Dans cette section, on défini certains paramètres par défaut. Nous avons : -- mode : mode de fonctionnement par défaut du load-balancer : http donc load-balancing sur le niveau 7 du modèle OSI; -- maxconn : nombre de connexion maximum accepté sur le frontal, cette option permet de limiter les connexions vers les backend et donc les attaques de type c~Tchuenché Rodrigue Élève Ingénieur En Informatique 77 78 IAI Gabon c~Tchuenché Rodrigue Élève Ingénieur En Informatique 78 (D)DOS, si le nombre de connexion dépasse cette limite les nouvelles connexions seront refusées; -- timeout : différents timeout permettant de couper les connexions trop longues, ce qui permet par exemple de limiter les attaques de type slowloris; -- errorfile : il est possible de définir des pages d'erreur générique listen stats : Dans cette section, on défini les paramètres liés aux statistiques de charges. haproxy met à disposition une page de stats accessible, ici par exemple cette page sera accessible sur l'ip virtuelle 172.16.0.50 et le port 70 avec une authentification assez complexe!!! (voir figure) FIGURE 12 - Fenêtre statistique Haproxy Backend / Frontend : Le frontend est un bloc de configuration qui permet de définir toutes les règles qui s'appliqueront (domaines écoutés, limitations, etc). Un frontend peut s'appliquer à un ou plusieurs bind. Le backend est un autre bloc de configuration, que l'on place derrière un frontend. Si le frontend gère ce qui est public (à "l"avant" du serveur), le backend gère "l'arrière". C'est là que vous définirez les serveurs web vers lesquels envoyer les requêtes. Côté frontend, on écoute sur l'IP et sur un port et on fait référence au backend « webservers » : Dans ces deux sections, nous avons : -- bind : permet de dire sur quelle IP et quel port HAProxy doit écouter le réseau. Par exemple, 172.16.0.50 sur le port 8070. -- acl une "access control list" permet de définir des conditions dans un bloc, par exemple "si le domaine contient site1, alors faire cela, si la requête est en https, alors faire ceci". -- mode http : on définit que ce frontend va traiter uniquement le protocole HTTP (et donc aussi HTTPS). Cela permet déjà à haproxy d'analyser les requêtes, et de rejeter tout ce qui n'est pas formaté correctement vis à vis des RFC. -- option httplog : permet de logguer le détail des requêtes http. Cela permet d'avoir plus d'informations dans les logs haproxy (headers, session http, ...). 79 IAI Gabon -- option httpchk : le httpchk permet de faire en sorte que haproxy vérifie à tout moment l'état des serveurs web derrière lui. Il peut ainsi savoir si le serveur est prêt à recevoir des requêtes, basculer vers un serveur de secours, afficher une page d'erreur en cas de panne, etc. De base, c'est un simple check HTTP sur le / qui est effectué, mais il est possible par exemple de spécifier un script ou un chemin précis. -- forwardfor except 127.0.0.1 : cette option va permettre d'ajouter un en tête xfor-wardfor dans les requêtes qui passent par le backend, en tête contenant la véritable adresse IP du visiteur. En effet, les requêtes passant par le proxy, c'est son IP qui sera vu niveau réseau par le serveur web ce qui peut être gênant pour faire des statistiques de visites par exemple, car vous auriez l'impression que toutes les visites viennent du serveur proxy... Le except 127.0.0.1 permet d'éviter d'ajouter cet en tête si c'est 127.0.0.1 qui a généré la requête. -- server web01,web02,web03 : cette définition va permettre d'indiquer le serveur vers lequel transmettre les requêtes. 172.16.0.53, 172.16.0.54,172.16.0.56 sont bien sûr les adresses IP des serveurs web web01, web02,web03. :8069 permet d'indiquer le port ou transmettre. Il est possible d'indiquer plusieurs lignes pour définir plusieurs serveur web et faire de la répartition de charge. -- maxconn 32 : permet de limiter le nombre maximum de connexions gérées par ce serveur, ici 32. Cela permet d'éviter de surcharger le serveur web au dessus de sa capacité par exemple, et de mitiger directement et à peu de coût une attaque. -- balance roundrobin permet de choisir l'algorithme de répartition à utiliser. Il existe plusieurs façon de répartir les requêtes :
Quelques Paramètres ligne server dans backend:
$service haproxy restart #voir etat service $service haproxy status c~Tchuenché Rodrigue Élève Ingénieur En Informatique 79 80 IAI Gabon c~Tchuenché Rodrigue Élève Ingénieur En Informatique 80 FIGURE 13 - Fenêtre status Haproxy .10 Annexe 10 Haute disponibilité : <>
-- Le fichier /etc/ha.d/ ha.cf -- le fichier /etc/ha.d/haresources -- le fichier /etc/ha.d/authkeys (a) Le fichier /etc/ha.d/ ha.cf Ce fichier sert de configuration générale. Quand ce fichier n'existe pas il faut le créer et l'éditer. Dans notre cas, son contenu est le suivant : 4. Source : Site1 Site2 81 IAI Gabon $sudo nano /etc/ha.d/ ha.cf # Contenu ******************************************************** mcast eth0 239.0.0.10 694 1 0 baud 19200 serial /dev/ttyS0 debugfile /var/log/ha.debug logfile /var/log/ha.log logfacility local0 # temps avant d.avertir dans le log warntime 4 # temps nécessaire avant de déclarer un noeud comme mort deadtime 5 # valeur utilise pour le démarrage (au moins 2 fois le deadtime) initdead 15 # temps entre 2 battements (2 signifie 2s, sinon 2000ms) keepalive 2 #Re-balance les services sur le maitre primaire quand il revient en ligne auto_failback off #Serveurs du cluster node black-pearl2 node black-pearl6 NB : Attention! Pour que tout fonctionne bien il faut s'assurer que vous puissiez faire un ping vers black-pearl2 depuis black-pearl6 et vice-versa.
Ce fichier contient la méthode d'encryptage utilisée pour la communication des serveurs. Cela peut être un mot de passe, ou un simple mot. Quand ce fichier n'existe c~Tchuenché Rodrigue Élève Ingénieur En Informatique 81 82 IAI Gabon pas il faut le créer et l'éditer. Dans notre cas, son contenu est le suivant : $sudo nano /etc/ha.d/authkeys # Contenu ******************************************************** auth 1 1 md5 hypriot 2 crc 3 sha1 hypriot # ici nous avons defini 3 méthodes d'encryptage et nous avons utilisé la méthode 1 (au choix) Après avoir configuré ce fichier, toujours lui donner le droit rwx 600. $sudo chmod 600 /etc/ha.d/authkeys Après ces trois fichiers, dans le fichier /etc/hosts de chaque serveur , renseigner les valeurs suivantes si c'est pas déjà fait : $sudo nano /etc/hosts #adresse_ip_serveur1 nom_serveur1 172.16.0.52 black-pearl2 172.16.0.56 black-pearl6 Ensuite nous allons désactiver le démarrage automatique de HaProxy sur les serveurs : $insserv -r haproxy Enfin sur les deux serveur arrêtez haproxy : $sudo /etc/init.d/haproxy stop et démarrer le service heartbeat sur les deux serveurs en commençant par le serveurs maitres primaire $systemctl restart heartbeat.service c~Tchuenché Rodrigue Élève Ingénieur En Informatique 82 83 IAI Gabon RÉFÉRENCES BIBLIOGRAPHIQUES Articles et Livres [1 ] Tidiane Massouba,2013-2014, Etude et implémentation d'un cluster low-cost basé sur Raspberry pi,UNIVERSITE GASTON BERGER DE SAINT-LOUIS DU SÉNÉGAL, U.F.R DE SCIENCES APPLIQUÉES ET DE TECHNOLOGIE SECTION D'INFORMATIQUE, Mémoire de Maîtrise Informatique [2 ] Run Hypriot Docker BirthdayParty#3 app, http://textlab.io/doc/2310814/run-hypriot-do 233-app Documents web [1 ] Raspberry Pi, https://fr.wikipedia.org/wiki/Raspberry_Pi [2 ] Bien choisir vos accessoires pour les Raspberry Pi 3 et 2, http://raspbian-france. fr/acheter-raspberry-pi-3-accessoires/ [3 ] Dockerisez votre Raspberry Pi!, http://raspbian-france.fr/docker-raspberry-pi/ [4 ] Docker, https://docs.docker.com/ [5 ] Présentation de Docker, https://www.grafikart.fr/tutoriels/docker/docker-intro-634 [6 ] Comprendre Docker , https://www.wanadev.fr/23-tuto-docker-comprendre-docker-partie1 [7 ] How to get Docker running on your Raspberry Pi using Windows, http://blog. hypriot.com/getting-started-with-docker-and-windows-on-the-raspberry-pi/ [8 ] Docker swarm, https://docs.docker.com/swarm/ [9 ] Installer PostgreSQL 9.3 sur Raspberry Pi Raspbian, http://domoenergytics.com/ domo.energy/Installer-PostgreSQL-9-3-sur [10 ]Installer sur Raspberry, http://blog.hypriot.com/post/how-to-setup-rpi-docker-swarm/ [11 ] Docker en production : la bataille sanglante des orchestrateurs de conteneurs, http:// blog.octo.com/docker-en-production-la-bataille-sanglante-des-orchestrateurs-de-con [12 ] Configurer un reverse proxy avec haproxy, https://blog.victor-hery.com/index. php?article21/configurer-un-reverse-proxy-sous-haproxy [13 ] Load Balancing with HAProxy, https://serversforhackers.com/load-balancing-with-hapr [14 ] Mise en place haproxy Debian 8, http://www.hisyl.fr/mise-en-place-haproxy-debian-8/ [15 ] [Tuto]HA : Mettre en place deux serveurs HaProxy actif / passif avec Heartbeat, http: // denisrosenkranz.com/tutoha-mettre-en-place-deux-serveurs-haproxy-actif-passif-av #comment-409445 [16 ] CLUSTER HAUTE-DISPONIBILITÉ AVEC ÉQUILIBRAGE DE CHARGE, http: // connect.ed-diamond.com/GNU-Linux-Magazine/GLMF-097/Cluster-haute-disponibilite-a [17 ] A Raspberry Pi Docker Cluster, http://www.informaticslab.co.uk/infrastructure/ 2015/12/09/raspberry-pi-docker-cluster.html c~Tchuenché Rodrigue Élève Ingénieur En Informatique 83 |
|