Introduction à l’utilisation de Consul, un système de découverte de services, sous Ubuntu 14.04

introduction

Consul est un système de découverte et de configuration de services distribué, hautement disponible et compatible avec les centres de données. Il peut être utilisé pour présenter les services et les nœuds dans une interface flexible et puissante qui permet aux clients de toujours avoir une vue à jour de l’infrastructure dont ils font partie.

Consul fournit de nombreuses fonctionnalités différentes qui sont utilisées pour fournir des informations cohérentes et disponibles sur votre infrastructure. Cela inclut des mécanismes de découverte de services et de nœuds, un système de marquage, des vérifications de l'état, des routines d'élection basées sur un consensus, un stockage clé / valeur à l'échelle du système, etc. En tirant parti de consul au sein de votre organisation, vous pouvez facilement créer un niveau sophistiqué de sensibilisation dans vos applications et services.

Dans ce guide, nous allons vous présenter les bases de l’utilisation de consul. Nous couvrirons les procédures générales nécessaires pour que consul fonctionne sur vos serveurs afin de le tester. Dans le prochain guide, nous nous concentrerons sur l’installation de consul dans un environnement de production.

Prérequis et objectifs

Dans ce guide, nous allons nous familiariser avec l'utilisation de consul pour créer un système de découverte et de configuration de services pour votre infrastructure.

Pour notre démonstration, nous allons configurer trois serveurs et un client. Les serveurs sont utilisés pour traiter les requêtes et maintenir une vue cohérente du système. Le client est également membre du système et peut se connecter aux serveurs pour obtenir des informations sur l'infrastructure. Les clients peuvent également contenir des services qui seront surveillés par consul.

Pour les besoins de ce guide et de cette série dans son ensemble, nous allons configurer 4 ordinateurs. Les trois premiers serontconsul servers comme décrit ci-dessus. Le dernier sera unconsul agent qui agit comme un client et peut être utilisé pour demander des informations sur le système.

Pour pouvoir implémenter ultérieurement certains des mécanismes de sécurité, nous devons nommer toutes nos machines au sein d'un même domaine. Cela nous permettra de tirer parti à l'avenir d'un certificat SSL générique.

Les détails de nos machines sont ici:

Nom d'hôte Adresse IP Role

server1.example.com

192.0.2.1

serveur consul bootstrap

server2.example.com

192.0.2.2

serveur consul

server3.example.com

192.0.2.3

serveur consul

agent1.example.com

192.0.2.50

client consul

Nous allons utiliser des serveurs Ubuntu 14.04 64 bits pour cette démonstration, mais tout serveur Linux moderne devrait fonctionner de la même manière.

Téléchargement et installation de Consul

La première étape consiste à télécharger et à installer le logiciel Consul sur chacune de nos machines. Les étapes suivantes doivent être effectuées sureach des machines répertoriées ci-dessus. Vous devriez être connecté en tant que root.

Avant d'examiner l'application consul, nous devons obtenirunzip pour extraire l'exécutable. Nous utiliserons également l'applicationscreen pour nous permettre d'avoir facilement plusieurs sessions dans une seule fenêtre de terminal. Ceci est utile pour notre introduction, car consul occupe généralement tout l'écran lorsqu'il n'est pas exécuté en tant que service.

Mettez à jour le cache du package des systèmes locaux, puis installez le package à l'aide deapt:

apt-get update
apt-get install unzip screen

Donc, nous n'oublions pas de le faire plus tard, démarrez votre session d'écran maintenant:

screen

Appuyez sur Entrée si vous recevez un message de copyright. Vous serez replacé dans une fenêtre de terminal, mais vous êtes maintenant dans une session d'écran.

Nous pouvons maintenant obtenir le programme de consul. Leconsul project’s page fournit des liens de téléchargement vers des packages binaires pour Windows, OS X et Linux.

Accédez à la page ci-dessus et cliquez avec le bouton droit de la souris sur le système d'exploitation et l'architecture qui représente vos serveurs. Dans ce guide, comme nous utilisons des serveurs 64 bits, nous utiliserons le lien «amd64» sous «linux». Sélectionnez «Copier l'emplacement du lien» ou toute autre option similaire fournie par votre navigateur.

Dans votre terminal, rendez-vous dans le répertoire/usr/local/bin, où nous garderons l'exécutable. Tapezwget et un espace, puis collez l'URL que vous avez copiée à partir du site:

cd /usr/local/bin
wget https://dl.bintray.com/mitchellh/consul/0.3.0_linux_amd64.zip

Maintenant, nous pouvons extraire le paquet binaire en utilisant la commandeunzip que nous avons installée précédemment. Nous pouvons ensuite supprimer le fichier compressé:

unzip *.zip
rm *.zip

Vous devriez maintenant avoir la commandeconsul disponible sur tous vos serveurs.

Démarrer le serveur d'amorçage

Pour commencer à travailler avec consul, nous devons mettre nos serveurs en service. Lors de la configuration dans l'environnement multi-serveur recommandé, cette étape devra être effectuée par étapes.

La première chose que nous devons faire est de démarrer le programme consul sur l'un de nos serveurs en modeserver etbootstrap. Le mode serveur signifie que le consul démarrera en tant qu’instance de serveur et non en tant que client. L'option d'amorçage est utilisée pour le premier serveur. Cela lui permet de se désigner comme le «leader» du cluster sans élection (puisqu'il s'agira du seul serveur disponible).

Dans le tableau qui spécifie nos hôtes, nous avons désigné nosserver1 comme serveur d'amorçage. Sur server1, démarrez l'instance d'amorçage en tapant:

consul agent -server -bootstrap -data-dir /tmp/consul

Le serveur démarrera dans le terminal actuel et les données du journal seront éditées à mesure que des événements se produisent. Vers la fin des données du journal, vous verrez ces lignes:

. . .
2014/07/07 14:32:15 [ERR] agent: failed to sync remote state: No cluster leader
2014/07/07 14:32:17 [WARN] raft: Heartbeat timeout reached, starting election
2014/07/07 14:32:17 [INFO] raft: Node at 192.0.2.1:8300 [Candidate] entering Candidate state
2014/07/07 14:32:17 [INFO] raft: Election won. Tally: 1
2014/07/07 14:32:17 [INFO] raft: Node at 192.0.2.1:8300 [Leader] entering Leader state
2014/07/07 14:32:17 [INFO] consul: cluster leadership acquired
2014/07/07 14:32:17 [INFO] consul: New leader elected: server1.example.com
2014/07/07 14:32:17 [INFO] consul: member 'server1.example.com' joined, marking health alive

Comme vous pouvez le constater, aucun chef de cluster n'a été trouvé puisqu'il s'agit du nœud initial. Cependant, depuis que nous avons activé l'option d'amorçage, ce serveur a pu entrer lui-même dans l'état de leader afin d'initier un cluster avec un seul hôte.

Démarrer les autres serveurs

Surserver2 etserver3, nous pouvons maintenant démarrer le service consulwithout l'option bootstrap en tapant:

consul agent -server -data-dir /tmp/consul

Pour ces serveurs, vous verrez également les entrées du journal. Vers la fin, vous verrez des messages comme celui-ci:

. . .
2014/07/07 14:37:25 [ERR] agent: failed to sync remote state: No cluster leader
2014/07/07 14:37:27 [WARN] raft: EnableSingleNode disabled, and no known peers. Aborting election.
2014/07/07 14:37:53 [ERR] agent: failed to sync remote state: No cluster leader

Cela se produit car il ne peut pas trouver de responsable de cluster et n'est pas autorisé à devenir le leader lui-même. Cet état se produit car nos deuxième et troisième serveurs sont activés, mais aucun de nos serveurs n'est encore connecté entre eux.

Pour nous connecter les uns aux autres, nous devons joindre ces serveurs les uns aux autres. Cela peut être fait dans n'importe quelle direction, mais le plus simple est à partir de notre machineserver1.

Puisque nous exécutons le serveur consul dans la fenêtre de terminal actuelle deserver1, nous devrons créer un autre terminal avecscreen afin de faire un travail supplémentaire. Créez une nouvelle fenêtre de terminal dans la session d'écran existante deserver1 en tapant:

CTRL-A C

Cela ouvrira une nouvelle instance de terminal tout en maintenant notre session précédente en cours. Vous pouvez parcourir chacune des sessions de terminal existantes en tapant:

CTRL-A N

De retour dans votre nouveau terminal, rejoignez les deux autres instances en référençant leurs adresses IP de la manière suivante:

consul join 192.0.2.2 192.0.2.3

Cela devrait instantanément joindre les trois serveurs au même cluster. Vous pouvez vérifier cela en tapant:

consul members
Node                 Address             Status  Type    Build  Protocol
server1.example.com  192.0.2.1:8301  alive   server  0.3.0  2
server2.example.com  192.0.2.2:8301  alive   server  0.3.0  2
server3.example.com  192.0.2.3:8301  alive   server  0.3.0  2

Vous pouvez également obtenir ces informations auprès d’un autre serveur en créant une nouvelle session de terminal à l’écran, comme indiqué ci-dessus, et en émettant la même commande.

Suppression du serveur d'amorçage et réinscription en tant que serveur standard

Nous avons les trois serveurs connectés dans un cluster, mais nous n'avons pas encore terminé.

Actuellement, puisqueserver1 a été démarré en mode bootstrap, il a le pouvoir de prendre des décisions sans consulter les autres serveurs. Comme ils sont supposés fonctionner en égaux et prendre des décisions par quorum, nous souhaitons supprimer ce privilège une fois le cluster démarré.

Pour ce faire, nous devons arrêter le service consul surserver1. Cela permettra aux machines restantes de sélectionner un nouveau chef. Nous pouvons ensuite redémarrer le service consul surserver1 sans l'option bootstrap et rejoindre le cluster.

Sur le serveur1, revenez au terminal sur lequel consul est exécuté:

CTRL-A N

Arrêtez le service en tapant:

CTRL-C

Maintenant, redémarrez le service sans l'option d'amorçage:

consul agent -server -data-dir /tmp/consul

Revenez sur votre terminal ouvert et rejoignez le cluster en vous connectant à l'un des deux serveurs du cluster:

CTRL-A N
consul join 192.0.2.2

Vous devriez maintenant avoir vos trois serveurs disponibles à égalité. Ils se répliqueront les informations et géreront les situations dans lesquelles un seul serveur devient indisponible. Des serveurs supplémentaires peuvent désormais rejoindre le cluster en le démarrant simplement sans amorçage et en rejoignant le cluster.

Rejoindre le cluster en tant que client et servir l'interface utilisateur Web

Maintenant que le cluster de serveurs est disponible, nous pouvons continuer et nous connecter à l'aide de la machine cliente.

Nous allons placer l'interface Web Web de consul sur notre ordinateur client afin de pouvoir interagir avec le cluster et surveiller son intégrité. Pour ce faire,visit the download page for the web UI. Cliquez avec le bouton droit de la souris sur le bouton de téléchargement et sélectionnez «Copier l'emplacement du lien» ou une option similaire disponible.

Sur votre ordinateur client, accédez au répertoire de base. Tapezwget et un espace, puis collez l'URL que vous avez copiée à partir de la page:

cd ~
wget https://dl.bintray.com/mitchellh/consul/0.3.0_web_ui.zip

Une fois le téléchargement terminé, décompressez et supprimez l'archive:

unzip *.zip
rm *.zip

Il y aura un répertoire appelédist qui contient tous les fichiers nécessaires pour rendre l'interface utilisateur Web du consul. Nous avons juste besoin de spécifier ce répertoire lorsque nous nous connectons au cluster.

Pour vous connecter au cluster, nous utiliserons un appel similaire à l'agent consul que nous avons utilisé pour les serveurs. Nous utiliserons cependant des drapeaux différents.

Nous n'utiliserons pas le drapeauserver, car nous voulons fonctionner en mode client. Par défaut, l’interface client de chaque nœud est accessible à l’aide de l’interface de bouclage local. Puisque nous voulons accéder à l’interface utilisateur Web à distance, nous devrons plutôt spécifier l’adresse IP publique du client.

Nous devrons indiquer à consul le répertoire hébergeant l’interface utilisateur Web afin de diffuser ce contenu. De plus, nous allons rejoindre le cluster immédiatement en transmettant l'adresse IP de l'un des serveurs du cluster. Cela nous permettra d’éviter de devoir nous rejoindre par la suite. Nous aurions pu le faire plus tôt avec les exemples de serveur également.

En fin de compte, notre commande de connexion est assez longue. Il ressemblera à ceci:

consul agent -data-dir /tmp/consul -client 192.0.2.50 -ui-dir /home/your_user/dir -join 192.0.2.1

Cela connectera notre machine cliente au cluster en tant qu'agent standard, non serveur. Cet agent répondra aux requêtes sur son adresse IP publique au lieu de l'interface habituelle de127.0.0.1. Pour cette raison, vous devrez ajouter un indicateur supplémentaire à toutes les commandes consul spécifiant lesrpc-addr.

Par exemple, si vous souhaitez interroger la liste des membres du client, vous devrez le faire en transmettant l'interface et le port alternatifs que vous avez sélectionnés:

consul members -rpc-addr=192.0.2.50:8400
Node     Address             Status  Type    Build  Protocol
agent1   192.0.2.50:8301    alive   client  0.3.0  2
server2  192.0.2.2:8301  alive   server  0.3.0  2
server1  192.0.2.1:8301  alive   server  0.3.0  2
server3  192.0.2.3:8301  alive   server  0.3.0  2

Cela peut sembler fastidieux, mais cela nous donne la possibilité d'accéder à l'interface Web du consul. Vous pouvez accéder à l'interface Web en visitant l'adresse IP de votre client, suivie de:8500/ui dans votre navigateur Web:

http://192.0.2.50:8500/ui

L'interface principale ressemblera à ceci:

Consul web UI landing page

Vous pouvez cliquer sur différents menus et explorer l'interface. Cela vous fournit un bon moyen de visualiser votre cluster et la santé de vos machines et services.

Ajout de services et de contrôles

Nous souhaitons maintenant ajouter des services à consul, qui constitue le principal cas d'utilisation de cette configuration. Vous pouvez ajouter des services de différentes manières, mais le plus simple consiste à créer un répertoire de configuration pour stocker vos définitions de service.

Un service est associé au nœud contenant la définition de service. Donc, si nous avons un serveur Web, nous devrions installer l'agent consul sur ce serveur et créer un fichier de définition de service à cet endroit.

Pour nos besoins, nous allons installer Nginx sur notre client pour le démontrer. Tuez la session client en cours en tapant:

CTRL-C

Installez Nginx sur le client en tapant:

apt-get install nginx

Maintenant, nous pouvons créer un répertoire de configuration pour stocker nos définitions de service:

mkdir ~/services

Dans ce répertoire, nous allons créer un fichier JSON décrivant notre service Web. Nous appellerons celaweb.json:

nano ~/services/web.json

Dans ce fichier, nous devons inclure une structure pour notre définition de service. Au sein de cette structure, nous définirons une sous-structure pour un bilan de santé du service afin que nous puissions savoir de manière fiable s’il fonctionne ou non.

Le contour de base ressemble à ceci:

{
    "service": {
        . . .
        "check": {
            . . .
        }
    }
}

Pour le service, nous devons définir un nom pour le service et indiquer à consul le port à vérifier. De plus, nous pouvons lui donner une liste de balises que nous pouvons utiliser pour catégoriser le service de manière arbitraire à nos propres fins de tri.

Pour notre exemple, cela ressemble à ceci:

{
    "service": {
        "name": "web server",
        "port": 80,
        "tags": ["nginx", "demonstration"],
        "check": {
            . . .
        }
    }
}

C'est tout ce dont nous avons besoin pour définir le service lui-même. Cependant, nous souhaitons également définir une méthode permettant au consul de vérifier la santé du service. Cela est généralement assez simple et reproduira les vérifications manuelles normales d’un administrateur système.

Pour notre service, nous implémenterons une simple requête web aveccurl comme liste de projet consul dansits own documentation. Nous n'avons pas réellement besoin de savoir ce que curl est capable de récupérer, nous nous soucions seulement de savoir si la commande a pu être exécutée sans erreur. De ce fait, nous pouvons jeter n'importe quelle sortie.

Nous devons également définir l'intervalle auquel la vérification sera exécutée. Il s’agit toujours d’un compromis entre performances et informations actualisées. Nous allons utiliser 10 secondes, car nous voulons savoir assez rapidement si quelque chose ne va pas:

{
    "service": {
        "name": "web server",
        "port": 80,
        "tags": ["nginx", "demonstration"],
        "check": {
            "script": "curl localhost:80 > /dev/null 2>&1",
            "interval": "10s"
        }
    }
}

Enregistrez et fermez le fichier lorsque vous avez terminé.

Maintenant, nous pouvons simplement redémarrer la session client consul, et pointer vers ce répertoire comme ayant des définitions de service:

consul agent -data-dir /tmp/consul -client 192.0.2.50 -ui-dir /home/your_user/dist -join 192.0.2.1 -config-dir /home/your_user/services

Cela va redémarrer le nœud et le connecter au cluster. Si vous revenez à l'interface Web, vous devriez maintenant voir un service:

Consul intro service

De retour sur votre client, vous pouvez créer un nouveau terminal et arrêter temporairement le serveur Web:

CTRL-A C
service nginx stop

Lorsque vous actualisez l'interface utilisateur Web, vous pouvez constater que la vérification du service Web échoue désormais, comme prévu:

Consul intro failed service

Cela montre que notre bilan de santé fonctionne comme prévu.

Conclusion

Vous devriez maintenant avoir une idée de base du fonctionnement du consul. La démonstration que nous avons fournie dans ce guide n'est pas exactement la meilleure façon de gérer consul en production, mais a été utilisée pour vous permettre de visualiser rapidement les fonctionnalités utiles du logiciel.

Dans lesnext guide, nous verrons comment utiliser consul dans un environnement de production. Nous allons mettre tous nos détails de configuration dans des fichiers pour pouvoir les consulter facilement et créer des scripts de démarrage pour démarrer le service au démarrage.

Related