Docker Swarm
Installation de l’environnement de Provision sous Docker Swarm s’effectue à l’aide d’un role Ansible
Prérequis
Ubuntu/Redhat/RockyLinux
En fonction des besoins en conteneur. Dans une architecture à 2 niveaux, la puissance réelle doit être donnée aux Workers
L’installation s’effectue à l’aide du role Ansible reemo-provision qui a besoin de dépendances pour fonctionner:
yum install ansible-core
ansible-galaxy collection install community.docker
ansible-galaxy collection install community.crypto
apt install ansible
apt install python3-docker
Fichier Inventaire
L’installation se base sur des groupes dans l’inventaire Ansible
provision_manager: Groupe regroupant les noeuds Managers
provision_worker: Groupe regroupant les noeuds Workers
Créer un fichier inventaire pour le role Ansible et déclarer les différents groupes en fonction de l’architecture que vous souhaitez
Voici quelques exemples:
provision:
children:
provision_manager:
hosts:
provision_manager1:
ansible_host: "10.10.0.1"
provision:
children:
provision_manager:
hosts:
provision_manager1:
ansible_host: "10.10.0.1"
provision_worker:
hosts:
provision_worker1:
ansible_host: "10.10.0.2"
Installation Docker
L’installation et l’initialisation de Docker Swarm peuvent être manuelles ou automatisées par le role Ansible reemo-provision
Manuel
apt install docker.io python3-docker -y
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl start docker
systemctl enable docker
yum install -y python3-pip
pip3 install docker
Une documentation sur le site de Docker permet d’avoir l’ensemble des options disponibles: Docker.
Auto
Le role Ansible reemo-provision embarque la possibilité d’installer et de configurer automatiquement un Docker Swarm, plusieurs options sont disponibles:
Par défaut le role Ansible effectue aucune opération sur l’installation ou l’initialisation de Docker Swarm. Pour l’activer vous pouvez ajouter cette option dans la ligne de commande:
ansible-playbook -i inventory.yml playbooks/reemo-provision.yml --extra-vars "PROVISION_INSTALL_DOCKER=true"
Warning
Il faut que les différents noeuds du cluster puissent joindre un repositorie pour installer Docker
Si vous souhaitez installer Docker de manière manuelle mais laisser le role Ansible éffectuer l’initialisation, il faut ajouter l’option SWARM_INIT dans la ligne de commande
ansible-playbook -i inventory.yml playbooks/reemo-provision.yml --extra-vars "SWARM_INIT=true"
Lors du déploiement sous Docker Swarm, plusieurs réseaux sont crées avec des plages d’adresses prises dans la plage d’adresses 10.0.0.0/8 de manière incrémental. vous pouvez définir une autre plage d’adresses si cela ne convient pas en utilisant la variable
PROVISION_SWARM_INIT_DEFAULT_ADDR_POOL
La plage d’adresses définie doit etre au minimum en /24. les réseaux nécessaires pour faire fonctionner Reemo seront pris dans cette nouvelle plage d’adresses
Warning
La plage d’adresses minimum doit être en /24
Il est possible dans le cadre d’un cluster à plusieurs noeuds de spécifier la carte réseau ou l’adresse IP qui sera transmise aux noeuds pour s’enregistrer et discuter entre eux
PROVISION_SWARM_ADVERTISE_ADDR
Cette option sera utilisée uniquement à l’initialisation d’un cluster elle peut etre spécifiée dans un fichier inventaire ou dans la ligne de commande
ansible-playbook -i inventory.yml playbooks/reemo-provision.yml --limit provision_manager --extra-vars "PROVISION_SWARM_ADVERTISE_ADDR=eth0"
ou
provision:
vars:
PROVISION_SWARM_ADVERTISE_ADDR: "eth0"
children:
provision_manager:
hosts:
provision_manager1:
ansible_host: "10.10.0.1"
provision_worker:
hosts:
provision_worker1:
ansible_host: "10.10.0.2"
Par défaut Docker Swarm utilise le port 4789 en UDP pour la communication des réseaux Overlay entre les différents noeuds d’un cluster.
PROVISION_SWARM_DATA_PATH_PORT
Warning
Le port par défaut peut rentrer en conflit dans un environnement Vmware NSX, il est alors souhaitable de le modifier à l’initialisation du Docker Swarm
Warning
Une fois que Docker Swarm a été initialisé, il ne faut plus modifier les options de sa configuration.
Installation Nginx
Un service Nginx doit être installé dans l’environnement Provision pour la communication avec l’environment Infra, il doit être installé sur l’ensemble des noeuds Managers
Manuel
apt install nginx
Ajouter l’utilisateur www-data au groupe docker
usermod -aG docker www-data
yum install nginx
Ajouter l’utilisateur nginx au groupe docker
usermod -aG docker nginx
Si SELinux est activé, taper la commande suivante pour autoriser Nginx à avoir accès à la socket Docker
semanage permissive -a httpd_t
Effectuer un restart du service Nginx
systemctl restart nginx
Si vous utilisez le filtrage par défaut de Redhat, il faut ouvrir les flux http et https
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
Ajouter une configuration de site à Nginx qui redirige vers la socket Docker, voici un exemple
server {
listen 80;
server_tokens off;
default_type text/html;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://unix:/var/run/docker.sock:/;
}
}
Vous pouvez y ajouter toute configuration personnelle comme le SSL
Warning
Pour une mise en production du serveur Provision il est indispensable d’implémenter un système de filtrage IP avec le serveur infra couplé à une vérification SSL
Auto
Le role Ansible reemo-provision est capable d’installer et de configurer automatiquement le service Nginx, plusieurs sont disponibles
Par défaut le port d’écoute du service Nginx est le 8443. Pour le modifier vous pouvez utiliser l’option
PROVISION_NGINX_PORT
Par défaut le service Nginx vérifie la validité du certificat SSL client
PROVISION_NGINX_SSL_VERIFY_CLIENT: on/off
Par défaut le subject du certification client est vérifié:
PROVISION_NGINX_SSL_CLIENT_S_DN: "CN=reemo_proapi"
Vous pouvez passer à l’étape Installation des images conteneurs
Certificats SSL
Pour une sécurité renforcée, il est préférable de mettre en place un certificat SSL sur le serveur Nginx. Il doit être issue de la même pki que celui qui sera renseigné dans l’interface Reemo
L’ensemble des micro-services discute entre eux en mTLS imposant une gestion des certificats. Vous avez 3 choix possibles
Dans le role Ansible reemo-provision est disponible un bi-clé issue de la pki par défaut contenu dans le role Ansible reemo-infra permettant de déployer automatiquement un système prêt à l’emploi, avec des communications chiffrées et authentifiées
Il est possible d’utiliser la pki qui a été automatiquement générée au moment du lancement du role reemo-infra. Rien à faire au niveau du fichier inventaire, le certificat a déjà été crée par le role reemo-infra et est déjà disponible dans le répertoire crée
Il faut générer les bi-clés SSL pour l’url:
reemo_provision
Il faut ensuite renseigner dans le fichier inventaire les chemins locaux sur la machine Ansible de la clé et du certificat qui seront ensuite copiés vers le Cluster Docker Swarm par le role Ansible
Exemple:
.. code-block::
:emphasize-lines: 4,5,6
provision:
vars:
PROVISION_SWARM_ADVERTISE_ADDR: "eth0"
CA_SSL_CRT_LOCALPATH: "/local/path/ca.crt"
PROVISION_SSL_CRT_LOCALPATH: "/local/path/reemo_provision.crt"
PROVISION_SSL_KEY_LOCALPATH: "/local/path/reemo_provision.key"
children:
provision_manager:
hosts:
provision_manager1:
ansible_host: "10.10.0.1"
provision_worker:
hosts:
provision_worker1:
ansible_host: "10.10.0.2"
Installation des images Conteneurs
Il faut prévoir l’importation des images ReemoContainers dans l’environnement Provision
Toutes les machines doivent pouvoir joindre l’url registry.reemo.io sur le port 443. Il faut récupérer au niveau du support reemo vos identifiants pour vous authentifiez
Il faut ensuite renseigner ces informations dans votre fichier inventaire
REGISTRY_URL: l'url du registre
REGISTRY_ENV: le préfix des images docker pour constituer des noms d'images **REGISTRY_URL/REGISTRY_ENV**chrome
REGISTRY_USERNAME: "l'utilisateur pour le registre"
REGISTRY_PASSWORD: "le mot de passe pour le registre"
Exemple:
all:
vars:
API_LICENSE: "ewogICAg ... Uw5NXhGVDF0NFU2TkxOdjQvZU53PT0iCiAgICC9Cn0="
REGISTRY_URL: "registry.reemo.io"
REGISTRY_ENV: "reemoinfra"
REGISTRY_USERNAME: "user"
REGISTRY_PASSWORD: "password"
infra_manager:
hosts:
infra_manager1:
ansible_host: "10.0.0.1"
infra_manager2:
ansible_host: "10.0.0.2"
infra_manager3:
ansible_host: "10.0.0.3"
Si pour accéder au registre reemo, les machines doivent utiliser un proxy, utiliser la même configuration que le mode Online et rajouter la configuration d’un proxy dans vos machines
Rajouter la ligne suivante dans la section [Service] du fichier /usr/lib/systemd/system/docker.service
EnvironmentFile=/etc/default/docker
Créer le fichier /etc/default/docker et renseigner les infos suivantes:
http_proxy="http://< IP du serveur Proxy >:< Port du service Proxy >"
https_proxy="http://< IP du serveur Proxy >:< Port du service Proxy >"
Récupération des images par la commande Docker
Avoir un compte sur registry.reemo.io obtenu auprès du support Reemo
Depuis une machine ayant accès à l’url registry.reemo.io sur le port 443 en HTTPS, taper la commande suivante:
docker login registry.reemo.io
Récupérer une image par exemple chrome
docker pull registry.reemo.io/reemosbchrome
Créer une archive
docker save registry.reemo.io/reemosbchrome > reemosbchrome.tar
Copier l’archive sur l’ensemble des Workers du Cluster Swarm et taper la commande suivante pour la charger dans l’environnement Docker
docker load < reemosbchrome.tar
Si vous souhaitez récupérer les images directement sur notre registry et les précharger vous mêmes, il faut avoir une machine avec l’authentification qui effectuera les docker pull des différentes images, créer des tarball pour ensuite les précharger dans vos machines ou dans un registre intermédiaire
Vous pouvez suivre le guide de démarrage ReemoContainers Guide de démarrage ReemoContainers