Découvrir et apprendre à exploiter Rancher : un orchestrateur, pour Docker, léger mais puissant

Antoine CARON

Mon expérience en tant que stagiaire chez Zenika m'a amené à utiliser Rancher pour orchestrer mes conteneurs Docker. Je vous présente ici un condensé de mon expérience avec cet outil, de son intérêt et de ses points forts, par le biais d'un petit « How to » sur comment déployer son application.

On constate que de plus en plus d'utilisateurs Docker cherchent à manipuler plus facilement leurs conteneurs et à mettre en place du déploiement continu. L'environnement technique autour de la problématique d'orchestration des modèles CaaS (Container as a Service) est très large et il est parfois difficile de s'y retrouver.

Un espace de dialogue vous est proposé sur le forum. Merci de partager vos remarques.

Commentez

- Titre : Découvrir et apprendre à exploiter Rancher : un orchestrateur, pour Docker, léger mais puissant

- Auteur : Antoine CARON

- Parution : 29 mai 2017

- Public visé :

- Licence : Copyright ® 2017 Antoine CARON. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Qu'en est-il de Rancher ?

- I-A. Késako

- I-B. Une installation assez simple

- I-C. Déployer une application simple avec Rancher

- I-C-1. Ajouter des hosts sur lesquels déployer

- I-C-2. Créer son service

- I-C-3. Scaler et Loadbalancer

- I-D. Un « blue/green deployement » et une « rolling upgrade » en cinq minutes

- I-D-1. La rolling upgrade (remplacement d'un service par un autre)

- I-D-2. Le blue/green deployement

- I-E. Un service DNS et Network overlay

- I-F. Un catalogue qui s'enrichit

- II. Notes de la rédaction Developpez.com

I - Qu'en est-il de Rancher ?

I-A - Késako

Rancher, projet open source créé par la société Rancher Labs est un outil gratuit d'orchestration de conteneurs Docker. Il permet de facilement déployer des conteneurs Docker sur des machines possédant Docker. Grâce à une configuration simple et complète, il permet de lier ses conteneurs afin de composer des architectures de services aisément. Il peut déployer des containers sur des services cloud comme AWS, Azure, DigitalOcean, mais aussi sur des machines personnalisées possédant Docker tout en s'appuyant sur docker-machine.

I-B - Une installation assez simple

Pour installer Rancher, à ce jour il suffit de posséder une machine Linux 64 bits avec au moins 1 GB de mémoire vive.

$ sudo docker run -d --restart=always -p 8080:8080 rancher/server

Après quelques minutes d'installation, le server Rancher est disponible sur le port 8080 de votre machine (l'image contient une base MySQL, un Zookeeper, Redis, et le serveur rancher). Vous pouvez vous y connecter, car l'accès est par défaut ouvert à tous. Par la suite, vous pourrez activer l'authentification,et ainsi facilement configurer des comptes pour vos utilisateurs.

I-C - Déployer une application simple avec Rancher

Après l'IaaS, le SaaS, le PaaS, le DaaS et Patricia Kaas, voilà maintenant venue l'ère du Caas (Container as a Service). L'objectif ici est de conteneuriser les services de son(ses) application(s) et de les faire interagir. Pour montrer simplement la mécanique de Rancher, j'ai choisi de vous présenter le déploiement d'une application web très simple nommée whoami, disponible sur le Docker Hub (développé en Go par Emile Vauge).

Pour ce faire, je vais vous expliquer la méthode de création de services par l'interface graphique. Sachez que l'on peut interagir avec Rancher par l'intermédiaire d'un outil en ligne de commande (rancher-cli, encore très limité pour l'instant) ou d'API REST.

I-C-1 - Ajouter des hosts sur lesquels déployer

Dans un premier temps, il faut définir des machines sur lesquelles déployer votre application.

Rancher propose des connecteurs à plusieurs services cloud du web comme Amazon EC2, Azure, Digital Ocean, mais vous pouvez également ajouter n'importe quelle machine disposant de docker comme « host » Rancher (« Custom »).

Pour l'exemple, j'ai ajouté deux machines au cluster nommées node1 et node2, et j'ai ajouté l'hôte Rancher lui-même self (c'est possible, mais non recommandé).

I-C-2 - Créer son service

Il faut maintenant créer une stack pour accueillir notre service whoami. Dans la logique Rancher, une stack est un ensemble de services.

On peut remarquer que pour l'ajout d'une stack, on peut importer un fichier docker-compose.yml et un fichier rancher-compose.yml.

Le fichier docker-compose.yml définit la structure de la stack, l'ensemble de ses services ainsi que leurs configurations. Ce fichier est natif de l'api Docker Compose.`

Le fichier rancher-compose est un « add-on » au docker compose, il permet de configurer des paramètres Rancher comme la configuration des loadbalancer (HA-Proxy) et la scalabilité horizontale des services. Ces deux fichiers sont exportables à tout moment, cela peut-être très pratique pour une réinstallation (par exemple, voici la configuration de la stack qui est installée dans cette partie).

Une fois la stack créée en lui donnant uniquement un nom, il faut ajouter notre service whoami. Pour cela il suffit de cliquer sur « Add service » et de le définir comme ceci :

On remarque que seuls le nom du service, l'image docker et le « port map » ont été définis (i.e. : c'est un exemple simple, vous pouvez voir par les onglets du bas que la configuration peut être beaucoup plus poussée, gestion des volumes, du network du service, des HealthCheck).

Après cette simple configuration, il suffira de cliquer sur « Create » et informagiquement votre service sera déployé sur un host choisi par Cattle.

Vous allez me dire, « qu'est-ce que Cattle ? », et vous aurez raison. Cattle est l'orchestrateur par défaut utilisé par Rancher. Il est maintenu par l'équipe de Rancher et le projet est open source et disponible sur Github.

Sachez que Rancher fonctionne également avec Kubernetes, Swarm et Mesos, mais pour cet article, je me suis limité à l'utilisation de Cattle.

I-C-3 - Scaler et Loadbalancer

Après quelque temps de démarrage, votre service whoami devrait être disponible.

Si vous cliquez sur le « 80 », vous devez accéder au service whoami. Il vous donnera plusieurs informations sur lui-même, notamment son nom.

Le but maintenant est de scaler notre service, afin de le distribuer sur plusieurs machines.

Dans le détail du service, on peut voir que la scale est actuellement définie à 1. Il suffirait donc de l'augmenter ? Eh bien non, le service que nous venons de définir occupe le port 80 de la machine. Il ne pourrait donc pas être disponible plus d'une fois par machine. Et c'est là l'une des problématiques des microservices : l'allocation dynamique de port et la « connaissance » des services par le loadbalancer. Rancher offre une solution simple à ce problème, il ne faut plus réserver de port pour son application, le loadbalancer va connaître les services par l'orchestrateur.

Il faut donc supprimer la configuration du port statique du service.

Une fois le port libéré , il faut donc créer un loadbalancer qui distribue la charge entre les instances de whoami. Dans la stack, cliquez sur « Add Load Balancer » :

Une fois le loadbalancer créé, on peut donc augmenter la scale de son application sans avoir de problème d'allocation de port. Si vous cliquez le « 80 » du loadbalancer, vous devez atteindre votre service, et s'il est scalé, l'hostname devrait changer au refresh.

À ce stade du déploiement, on peut se demander, ce qu'il en est de l'infrastructure des machines créées plus tôt.

Rancher a déployé les containers docker de façon équilibrée entre les différentes machines. On peut définir nos propres règles de déploiement par l'utilisation de labels sur les machines.

Par exemple, on peut ajouter le label « name = frontend », et pour chaque service que l'on crée, définir s'il peut démarrer ou non sur la machine dont le name est frontend.

Sur chacun des conteneurs, rancher nous permet d'accéder à un shell et une vue des logs, ce qui est très pratique pour le débogage.

Certes cet exemple était simple, mais on peut facilement déployer des architectures plus complexes grâce à Rancher, et c'est là tout son intérêt. Voici l'architecture des services de l'un des projets que j'ai déployés grâce à lui.

I-D - Un « blue/green deployement » et une « rolling upgrade » en cinq minutes

Dans la plupart des cas, une mise en production est souvent un passage difficile pour le développeur. Les outils DevOps ont bien évidemment permis de simplifier cette étape cruciale de la vie d'un projet.

Rancher permet d'utiliser plusieurs méthodes pour mettre à jour un service déjà en production tout en garantissant la continuité des services.

I-D-1 - La rolling upgrade (remplacement d'un service par un autre)

I-D-2 - Le blue/green deployement

Ces deux méthodes ont été présentées par Christophe Furmaniak et Youcef Yekhlef (deux consultants architectes de Zenika) lors de leur intervention pendant la Devoxx 2016. Je ne peux que vous conseiller de la regarder :

Animation en format "youtube" non supportée.
Contenu uniquement consultable en ligne à cette adresse :
https://www.youtube.com/watch?v=QFqt8xMTChY

I-E - Un service DNS et Network overlay

Pour ceux qui ont déjà bien pratiqué Docker, faire communiquer deux containers entre eux sans avoir d'outil d'orchestration n'est pas très aisé. Bien sûr, il y a la publication de port sur le Host, mais on arrive vite aux limites. Rancher apporte nativement une fonctionnalité d'overlay network via un tunnel ipsec permettant à deux containers sur deux machines différentes d'être sur le même réseau virtuel. Rancher va plus loin puisqu'il possède son service DNS dans lequel il enregistre chaque nouveau container qu'il crée. Cela a plusieurs avantages :

- deux services d'une même Stack se connaissent par leur nom ;

- un service peut connaître un service d'une autre stack par nomService.nomStack.

I-F - Un catalogue qui s'enrichit

Rancher possède son propre catalogue d'applications, ces applications sont sous la forme de groupes de stacks préconfigurées qui s'appuient sur les images du Docker Hub :

- la stack Elastic ;

- Janitor, un service basé sur docker-cleanup, pour nettoyer les images et containers non utilisés ;

- Traefik, un load balancer développé en Go par Emile Vauge de la Zstartup Containous ;

- Gluster, un gestionnaire de volumes partagés ;

- Odoo, le célèbre ERP open source ;

- etc.

Il est aussi possible d'ajouter son propre catalogue de stacks d'entreprise.

Je vous ai présenté ici les principales features de Rancher, je ne peux que vous conseiller de le tester pour faire joujou avec vos containers Docker. Cependant, la question qu'on peut encore se poser aujourd'hui reste la suivante : Rancher ne restera-t-il qu'un joujou pour orchestrer des services ? On sait déjà que des entreprises comme Orange et Sony commencent à l'utiliser pour des besoins internes (cf. : Sony et le playstation Network https://www.youtube.com/watch?v=hwhxXwT6zlw).

N'hésitez surtout pas à partager vos expériences avec Rancher.

Merci encore à Youcef Yekhlef, Christophe Furmaniak et à mon tuteur de stage Christophe Tardella pour l'aide apportée à la rédaction de cet article.

II - Notes de la rédaction Developpez.com

Nous remercions Zenika, et plus particulièrement Antoine Caron, pour l'autorisation à publier ce tutoriel sur Developpez.com.

Nos remerciements également à Winjerome pour la mise au gabarit et Maxy35 pour la relecture orthographique.