Docker Swarm
Installation de l’environnement de Relayws sous Docker Swarm s’effectue à l’aide d’un role Ansible. ll’environnement Relayws se compose de 3 éléments:
Nginx: Service permettant la communication avec l’environnement Infra
Traefik: Service accueillant les communications venant des ReemoAgent et des utilisateurs
ws-relay-server: Micro-service Docker permettant le relaying entre les ReemoAgent et les utilisateurs
Prérequis
Ubuntu/Redhat/RockyLinux
En fonction des besoins en connexion simultanée, chaque connexion prend 30 Mo de RAM
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 un groupe dans l’inventaire Ansible : relayws_manager à rajouter dans le fichier inventaire
relayws_manager:
hosts:
relayws_manager1:
ansible_host: "10.20.0.1"
relayws_manager:
hosts:
relayws_manager1:
ansible_host: "10.20.0.1"
relayws_manager2:
ansible_host: "10.20.0.2"
relayws_manager3:
ansible_host: "10.20.0.3"
Installation Docker
L’installation et l’initialisation de Docker Swarm peuvent être manuelles ou automatisées par le role Ansible reemo-relayws
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-relayws 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-relayws.yml --extra-vars "RELAYWS_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-relayws.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
RELAYWS_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
RELAYWS_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-relayws.yml --limit relayws_manager --extra-vars "RELAYWS_SWARM_ADVERTISE_ADDR=eth0"
ou
relayws_manager:
vars:
RELAYWS_SWARM_ADVERTISE_ADDR: "eth0"
hosts:
relayws_manager1:
ansible_host: "10.20.0.1"
relayws_manager2:
ansible_host: "10.20.0.2"
relayws_manager3:
ansible_host: "10.20.0.3"
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.
RELAYWS_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 Relayws pour la communication avec l’environment Infra, il doit être installé sur l’ensemble des noeuds
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-relayws 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
RELAYWS_NGINX_PORT
Par défaut le service Nginx vérifie la validité du certificat SSL client
RELAYWS_NGINX_SSL_VERIFY_CLIENT: on/off
Par défaut le subject du certification client est vérifié:
RELAYWS_NGINX_SSL_CLIENT_S_DN: "CN=reemo_proapi"
Certificats SSL
Nginx
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-relayws 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_relayws
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
relayws_manager:
vars:
RELAYWS_SWARM_ADVERTISE_ADDR: "eth0"
CA_SSL_CRT_LOCALPATH: "/local/path/ca.crt"
RELAYWS_SSL_CRT_LOCALPATH: "/local/path/reemo_relayws.crt"
RELAYWS_SSL_KEY_LOCALPATH: "/local/path/reemo_relayws.key"
hosts:
relayws_manager1:
ansible_host: "10.20.0.1"
relayws_manager2:
ansible_host: "10.20.0.2"
relayws_manager3:
ansible_host: "10.20.0.3"
Traefik
Toute entrée utilisateur s’effectue par un service Traefik où il est possible de lui spécifier une certificat pour l’accès utilisateur
Par défaut un certificat autosigné est crée automatiquement à la création du conteneur Traefik
Vous pouvez spécifier le chemin d’un certificat local au role Ansible pour ensuite être déployé sur les différents serveurs où Traefik sera déployé.
Rajouter les options suivantes dans votre fichier inventaire:
TRAEFIK_SSL_CERTS:
- cert_file: "/localpath/to/cert.crt"
key_file: "/localpath/to/key.key"
Vous pouvez spécifier le chemin du certificat qui est déjà présent sur le serveur où sera déployé Traefik, il sera ensuite monter dans le conteneur traefik.
TRAEFIK_SSL_CERTS_REMOTE:
- cert_file_remotepath: "/remotepath/to/cert.crt"
key_file_remotepath: "/remotepath/to/key.key"
Optimisation avec Ansible
Dans le cas d’un cluster relayws avec 3 serveurs minimum il est possible d’optimiser la connexion entre le navigateur de l’utilisateur, le conteneur relayws et le conteneur applicatif pour que l’ensemble se connecte directement sur le même worker et ainsi optimiser le flux de pixels
Il faut au préalable déterminer une url par node relayws ainsi qu’un certificat pour chaque URL ou un certificat Wildcard pour l’ensemble du domaine ou un certificat ayant les alternatives Names suffisant pour répondre à l’ensemble des URL
Dans le fichier inventaire Ansible il faut rajouter à chaque host les variables suivantes:
relayws_manager:
vars:
TRAEFIK_SSL_CERTS:
- cert_file: "/localpath/to/relayws1_cert_domain.tld.crt"
key_file: "/localpath/to/relayws1_key_domain.tld.key"
- cert_file: "/localpath/to/relayws2_cert_domain.tld.crt"
key_file: "/localpath/to/relayws2_key_domain.tld.key"
- cert_file: "/localpath/to/relayws3_cert_domain.tld.crt"
key_file: "/localpath/to/relayws3_key_domain.tld.key"
hosts:
relayws_manager1:
ansible_host: "< IP du serveur relayws1 pour la connexion ssh et la configuration ansible >"
REEMO_SWARM_NODE_HOSTNAME: "< Hostname dans le cluster Swarm >"
REEMO_RELAYWS_PRIVATE_IP: "< adresse IP que devront contacter les conteneurs pour se connecter sur ce serveur >"
REEMO_RELAYWS_PUBLIC_URL: "< URL Public >"
relayws_manager2:
ansible_host: "< IP du serveur relayws2 pour la connexion ssh et la configuration ansible >"
REEMO_SWARM_NODE_HOSTNAME: "< Hostname dans le cluster Swarm >"
REEMO_RELAYWS_PRIVATE_IP: "< adresse IP que devront contacter les conteneurs pour se connecter sur ce serveur >"
REEMO_RELAYWS_PUBLIC_URL: "< URL Public >"
relayws_manager3:
ansible_host: "< IP du serveur relayws3 pour la connexion ssh et la configuration ansible >"
REEMO_SWARM_NODE_HOSTNAME: "< Hostname dans le cluster Swarm >"
REEMO_RELAYWS_PRIVATE_IP: "< adresse IP que devront contacter les conteneurs pour se connecter sur ce serveur >"
REEMO_RELAYWS_PUBLIC_URL: "< URL Public >"