Prise en main de Rancher pour le déploiement d’applications Docker

rancher + docker

Rancher est une plateforme open source permettant de gérer l'exécution de conteneurs. Il intègre l'orchestration de votre infrastructure en contrôlant un ensemble d'hôtes Linux, qu'ils soient dans un cloud privé ou public, qu'ils s'agissent de machines virtuelles ou physiques. Les outils d'orchestration de conteneurs comme Swarm, Kubernetes, ou Mesos sont également de la partie, tout comme Cattle, qui est sa propre solution d'orchestration. Enfin, il dispose d'une interface graphique pour effectuer vos actions mais aussi pour visualiser rapidement l'état de votre infrastructure et de vos applications.

Dans cet article, je vais vous donner un petit aperçu en vous montrant une manière d'installer et de configurer Rancher pour finalement déployer une application dockerisée, en utilisant l'API de Rancher.

Prérequis

Il sera plus facile de suivre le contenu de cet article si vous êtes déjà familier avec Docker et pourquoi pas, Docker Compose. Je suppose que vous l'êtes, sinon je vous avoue que je ne sais pas pourquoi vous lisez cet article 😉

Il vous faudra deux machines linux avec 1 Go de RAM minimum et accessibles publiquement par leur IP. Dans mon cas, j'ai utilisé des droplets DigitalOcean sous Ubuntu 16.04 x64. La première machine accueillera le serveur Rancher tandis que la deuxième hébergera les applications à déployer. Je les nommerai rancher-server et host1.

Dans mon exemple, les machines ont les IP suivantes :
rancher-server : 138.68.70.113
host1 : 138.68.78.150

Sur les deux machines, il vous faudra installer Docker.

Sur la machine rancher-server il faudra également installer Docker Compose. A vrai dire, ça n'est pas une obligation, mais j'ai envie d'utiliser ça pour installer Rancher Server donc suivez mes conseils mes petits soldats.

Installation de Rancher

Rancher doit être installé comme un service Docker. Dans notre exemple (totalement non officiel), nous allons exploiter les images Docker jwilder/nginx-proxy et jrcs/letsencrypt-nginx-proxy-companion pour déployer ce service en HTTPS. Puisque Let's Encrypt nécessite un nom de domaine qui pointe sur notre machine pour établir un certificat, et que nous n'avons pas envie d'en créer un véritable dans le cadre de cet article (en tout cas moi je n'en ai pas envie), nous allons utiliser le service de DNS dynamique (et magique) nip.io. Comment ça marche ? en gros vous prenez l'IP de la machine concernée, vous la suffixez par "nip.io" et bim, vous avez un nom de domaine. Dans mon cas, cela va me permettre d'avoir un domaine 138.68.70.113.nip.io.

Sur votre machine rancher-server, on va utiliser le fichier docker-compose.yml suivant pour lancer tous les services :

nginx-proxy:
    image: jwilder/nginx-proxy
    ports: 
    - 80:80
    - 443:443
    volumes:
    - /etc/nginx/certs:/etc/nginx/certs:ro
    - /var/run/docker.sock:/tmp/docker.sock:ro
    - /etc/nginx/vhost.d
    - /usr/share/nginx/html
    restart: always
letsencrypt-nginx:
    image: jrcs/letsencrypt-nginx-proxy-companion
    volumes:
    - /etc/nginx/certs:/etc/nginx/certs:rw
    - /var/run/docker.sock:/var/run/docker.sock:ro
    volumes_from:
    - nginx-proxy
    restart: always
rancher-server:
    image: rancher/server
    environment:
    - VIRTUAL_HOST=138.68.70.113.nip.io
    - LETSENCRYPT_HOST=138.68.70.113.nip.io
    - LETSENCRYPT_EMAIL=soren.ohnmeiss@netapsys.fr
    - VIRTUAL_PROTO=https
    - VIRTUAL_PORT=8080
    restart: always

Puisque toutes ces infos sont centralisées dans un fichier, vous n'avez pas à vous en souvenir, ce qui aurait été le cas si nous avions lancé les commandes Docker équivalentes. Donc vous voyez, vous avez bien fait de suivre mon conseil en installant docker-compose (gloire à moi 😀 ).

Si vous voulez savoir en détail comment fonctionnent ces images et à quoi servent toutes ces infos, je vous invite à aller voir les dépôts Github des projets jwilder/nginx-proxy et jrcs/letsencrypt-nginx-proxy-companion.

Bref, pour démarrer tout ça il n'y a plus qu'à lancer la commande qui va bien :

docker-compose up -d

Le premier démarrage peut prendre quelques minutes donc soyez patients. Lorsque docker-compose a finit de démarrer tous les services, il faut encore laisser un peu de temps au serveur Rancher de s'installer. Au bout d'un moment, lorsque vous accédez à votre domaine (dans mon exemple https://138.68.70.113.nip.io), vous devriez voir apparaître l'interface de Rancher.

rancher_welcome

Configuration de Rancher

Restrictions d'accès

Comme vous pouvez le constater, par défaut Rancher vous donne accès à toute l'interface sans restriction. Nous allons donc commencer par créer un compte administrateur. Pour cela, rendez-vous dans le menu Admin > Access Control. Vous verrez qu'il est possible d'utiliser plusieurs types d'authentifications (LDAP, Active Directory, Github...). Dans notre cas, nous allons nous contenter du type "Local". Renseignez un identifiant et un mot de passe puis cliquez sur "Enable Local Auth". Vous verrez que, si vous vous déconnectez, on vous demandera cette fois-ci vos identifiants pour accéder à l'interface.

Environnements

Par défaut, Rancher crée un environnement "Default" qui sera la cible de toutes vos opérations. Qu'est-ce qu'un environnement ? Voyez cela comme un conteneur (pas au sens Docker hein) disposant de ses propres ressources et utilisateurs pour vos déploiements. Vous aurez par exemple envie d'avoir un environnement d'intégration, séparé de votre environnement de production. Tous les services que vous déployez sont hébergés par des hôtes qui appartiennent à un environnement précis.

Pour vous familiariser avec ce concept, je vais vous demander de créer un nouvel environnement. Survolez le premier élément du menu (qui affiche le nom de l'environnement courant, donc "Default") et cliquez sur l'entrée "Manage Environments" qui apparaît. Vous vous retrouvez alors sur la liste des environnements. Cliquez sur "Add Environment".

On vous demande alors de renseigner le nom de votre environnement, éventuellement une description et surtout l'outil d'orchestration de conteneurs qui sera utilisé par l'environnement. Rancher est compatible avec les principaux outils d'orchestration (Kubernetes, Swarm...). Nous, nous allons rester corporate et utiliser Cattle, la solution maison de Rancher Labs. Comme nom d'environnement, prenez par exemple "Dev". Il vous est possible également de restreindre l'accès à l'environnement à certains utilisateurs, chose que nous n'allons pas faire ici. On finit en cliquant sur "Create". Nous disposons maintenant de deux environnements, "Default" et "Dev". Nous n'allons exploiter uniquement l'environnement "Dev" fraîchement créé donc je vous invite à supprimer l'environnement "Default" en cliquant sur les petits points puis "Desactivate". Là vous voyez que "Dev" est devenu notre environnement par défaut et "Default" a été désactivé. Pour supprimer complètement l'environnement, cliquez à nouveau sur les petits points et choisissez "Delete".

Ajout d'un hôte à l'environnement

Dans Rancher, les hôtes sont les ressources vers lesquelles vont être déployées vos applications. Vous devez donc au minimum ajouter un hôte à Rancher pour effectuer un déploiement. C'est que que nous allons faire. Allez dans le menu Infrastructure > Hosts puis cliquez sur "Add Host".

On vous demande alors quelle URL devra être utilisée par les hôtes pour communiquer avec l'API de Rancher. Laissez cochée la case "This site's address" qui dans mon cas indique "https://138.68.70.113.nip.io". Cliquez sur "Save".

Sur l'écran qui suit, apparaît ensuite la commande que vous devrez utiliser sur votre hôte pour qu'il puisse s'enregistrer auprès du serveur Rancher. Elle ressemble à ceci (avec votre URL):

sudo docker run -d --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.0.2 https://138.68.70.113.nip.io/v1/scripts/FF05CD8748C60F72F016:1477393200000:UQDEGmJ7a0VADOqwdbUGc68TLj8

Connectez-vous à votre hôte (celui que j'avais appelé host1 plus haut) et lancez la commande.

Si vous retournez sur la page Infrastructure > Hosts, après un léger délai vous devriez voir apparaître votre hôte.

rancher_new_host

Par la suite vous n'aurez plus besoin de vous connecter directement à cette machine, tout se fera via Rancher.

Création d'une clef d'API

Utiliser l'interface graphique de Rancher c'est bien, mais là où les choses peuvent devenir réellement intéressantes (et automatisables), c'est en exploitant son API. Nous allons justement utiliser l'API un peu plus tard, via l'outil rancher-compose dont je parlerai tout à l'heure. Avant ça, il va nous falloir créer une clef qui nous donnera accès à l'API.

Dans Rancher, vous pouvez créer deux types de clef d'API. Les clefs d'utilisateur et les clefs d'environnement. Une clef d'utilisateur permettra d'effectuer une action en utilisant l'identité du compte utilisateur associé. Une clef d'environnement vous permet d'effectuer n'importe quelle action liée à un environnement. C'est cette dernière option que nous allons exploiter.

Pour créer une clef associée à l'environnement "Dev", cliquez sur l'entrée "API" du menu. Vous vous trouverez sur la liste des clefs, qui est vide actuellement. Au niveau de la section "Environment API Keys", cliquez sur le bouton "Add Environment API Key". Là, on vous demande un nom et une description facultative. Nous allons mettre un nom simple, à trois lettres, pour ne pas fatiguer votre mémoire (car j'en aurai besoin dans quelques instants), comme "dev" puis cliquez sur "Create".

Attention, là votre mémoire doit se mettre en route, on vous donne une clef d'accès et une clef secrète que vous devez mémoriser car elle n’apparaîtra plus une fois la fenêtre fermée ! Si, comme moi, vous êtes incapables de retenir des suites de caractères aléatoires de longueur conséquente, mettez ces informations à l'abri quelque part dans un fichier auquel vous seul pouvez accéder (et la NSA bien sûr).

Notre clef apparaît désormais dans la liste dans l'état "Active".

Déploiement d'une application avec Rancher Compose

Vous vous en doutez, nous allons utiliser l'API de Rancher pour déployer une application dockerisée. Mais pour le moment le procédé vous est inconnu. Puisque je n'aime pas vous laisser seul dans l'obscurité, laissez-moi vous éclairer de ma lanterne.

Vous connaissez Docker Compose ? Pitié dites-moi que oui. Voici la doc. Docker Compose vous permet de décrire tous les services d'une application dans un fichier docker-compose.yml et de lancer ces services via une seule commande "docker-compose up". Ok, super, vous connaissez Docker Compose.

Maintenant, je vais vous présenter notre outil de déploiement : Rancher Compose. Cet outil peut lire votre fichier docker-compose.yml et utiliser l'API de Rancher pour déployer votre application, en une commande. C'est Rancher qui s'occupe de puller les images et de démarrer les services sur les hôtes disponibles et compatibles.

Alors c'est bien beau tout ça mais à quoi ça ressemble en vrai ? Tout d'abord, je vais piocher, dans le Docker Hub, une image qui pourrait servir d'exemple. garywiz/docker-grav me semble être un bon exemple. Elle contient le CMS Grav prêt à l'emploi, pile ce qu'il nous faut.

La documentation de cette image nous indique comment l'utiliser :

docker pull garywiz/docker-grav
docker run -d -p 8080:8080 garywiz/docker-grav

Nous allons nous appuyer sur ces informations pour constituer un fichier docker-compose.yml.

grav:
    image: garywiz/docker-grav
    ports: 
    - 80:8080

Vous remarquerez que j'en ai profité pour mapper le port 8080 du conteneur vers le port 80 de l'hôte pour éviter d'avoir à taper le port dans le navigateur par la suite, quand l'application sera déployée.

Il est temps de récupérer l'outil Rancher Compose. Le plus simple, c'est en suivant le lien, en bas de page de votre interface Rancher : "Download CLI". Cela va vous télécharger un fichier nommé "rancher-compose-linux-amd64-v0.8.6.tar.gz" ou équivalent. Décompressez le contenu et placez l'exécutable où bon vous semble. Dans le cadre de cet article je le place dans le dossier où se trouve le docker-compose.yml. Vous pouvez aussi faire en sorte que l'exécutable soit accessible de manière globale (en le copiant par exemple dans /usr/local/bin/).

Exécutez rancher-compose et vous devriez voir la version et la liste des commandes disponibles :

$ ./rancher-compose
Usage: rancher-compose [OPTIONS] COMMAND [arg...]

Docker-compose to Rancher

Version: v0.8.6

Author:
Rancher Labs, Inc.

Options:
--verbose, --debug
--file, -f [--file option --file option] Specify one or more alternate compose files (default: docker-compose.yml) [$COMPOSE_FILE]
--project-name, -p Specify an alternate project name (default: directory name)
--url Specify the Rancher API endpoint URL [$RANCHER_URL]
--access-key Specify Rancher API access key [$RANCHER_ACCESS_KEY]
--secret-key Specify Rancher API secret key [$RANCHER_SECRET_KEY]
--rancher-file, -r Specify an alternate Rancher compose file (default: rancher-compose.yml)
--env-file, -e Specify a file from which to read environment variables
--help, -h show help
--version, -v print the version

Commands:
create Create all services but do not start
up Bring all services up
start Start services
logs Get service logs
restart Restart services
stop, down Stop services
scale Scale services
rm Delete services
pull Pulls images for services
upgrade Perform rolling upgrade between services
help, h Shows a list of commands or help for one command

Run 'rancher-compose COMMAND --help' for more information on a command.

Je ne vais pas détailler toutes les commandes, je vous laisserai explorer. Je vais simplement vous donner le nécessaire pour lancer le service décrit dans notre fichier docker-compose.yml. Il s'agira de la commande suivante :

./rancher-compose --project-name="projet1" --access-key="E825B45F5A8BD558C605" --secret-key="YARrkRXnm8h8Fwj8aqxUxAHRdVrRJBHrWayhiJkB" --url="https://138.68.70.113.nip.io/" up -d

Jetons d'abord un œil aux options. La première, `--project-name` permet de définir le nom du projet, tel qu'il apparaîtra dans Rancher. Le définir n'est pas une obligation, mais par défaut c'est le nom de votre répertoire courant qui est pris, ce qui n'est pas forcément souhaitable. Ensuite, `--access-key` et `--secret-key` font partie de la fameuse clef d'API que nous avons créée plus tôt. Enfin, `--url` permet d'indiquer l'URL de votre serveur Rancher. Pour le reste, la commande `up` permet de créer et démarrer les services de votre fichier docker-compose.yml. En lui passant l'option `-d`, on indique qu'une fois l'opération terminée, la commande doit nous rendre la main et ne pas afficher les logs.

Après avoir lancé la commande, vous devriez avoir la sortie suivante :

INFO[0000] Creating stack projet1
INFO[0000] Creating service grav
INFO[0001] [0/1] [grav]: Starting
INFO[0058] [1/1] [grav]: Started

Rendez-vous dans l'interface de Rancher, vous devriez voir votre projet.

rancher_deploy_project

En cliquant sur le projet, vous pouvez voir les services qui le composent. Dans notre cas, il y a un service avec un conteneur qui écoute sur le port 80.

rancher_deploy_stack

Vous pouvez également allez voir la vue infrastructure. Cliquez sur le menu Infrastructure > Hosts. Vous pouvez voir que votre hôte host1 est actuellement en train de faire tourner le conteneur du projet que nous avons déployé.

rancher_deploy_host

Pour voir l'application en question, il nous faut nous munir de l'IP de l'hôte host1 et y accéder par le navigateur (dans mon cas http://138.68.78.150).

rancher_deployed_app

L'application est bien là, Rancher ne nous a pas menti 🙂

Conclusion

Vous avez eu une brève présentation de Rancher et de ses possibilités. Pour aller plus loin, vous pouvez ajouter des hôtes à votre environnement ou créer de nouveaux environnements. Vous comprendrez qu'il devient (plus) facile de déployer des applications dockerisées sur des environnements différents, de manière homogène. J'espère vous avoir donné envie d'en savoir un peu plus et je ne doute pas que vous allez expérimenter quelques commandes rancher-compose dans les minutes qui suivent, si ce n'est déjà fait 🙂

Un commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.