Comment utiliser Fleetctl pour gérer votre cluster CoreOS

introduction

CoreOS fournit un excellent environnement pour la gestion des conteneurs Docker dans des environnements multi-serveurs. L’un des composants les plus essentiels pour rendre cette gestion de cluster simple est un service appelé * flotte *.

Fleet permet aux utilisateurs de gérer les conteneurs Docker en tant que services pour l’ensemble de leur cluster. Il fonctionne comme une interface et un niveau d’abstraction sur le système systemd init de chaque membre du cluster. Les utilisateurs peuvent définir des contraintes qui affectent les conditions dans lesquelles un service est exécuté. Cela permet aux administrateurs de définir l’apparence de leur infrastructure en indiquant à certaines applications de s’exécuter sur des hôtes identiques ou distincts en fonction des critères fournis.

Dans ce guide, nous explorerons flotte et l’utilitaire + fleetctl + qui vous permet de contrôler le démon.

Conditions préalables

Pour suivre ce guide, vous devez disposer d’un cluster CoreOS.

Le cluster que nous utilisons dans ce guide peut être créé en suivant notre guide à l’adresse https://www.digitalocean.com/community/tutorials/how-to-set-up-a-coreos-cluster-on-digitalocean créer un cluster CoreOS sur DigitalOcean]. Nous supposerons que vous avez la configuration de cluster décrite dans ce guide.

Le cluster configuré a trois nœuds. Ils sont configurés pour communiquer entre eux à l’aide de l’interface réseau privée. L’interface publique est disponible sur chacun de ces nœuds pour l’exécution de services publics. Les noms de nœud sont:

  • coreos-1

  • coreos-2

  • coreos-3

Lorsque votre cluster est prêt, continuez pour en savoir plus sur la flotte.

Utilisation des fichiers d’unité de service

Avant d’entrer dans l’outil + flottectl +, nous devrions parler un peu des fichiers d’unité de service.

Les fichiers d’unité sont utilisés par le système init + systemd + pour décrire chaque service disponible, définir les commandes nécessaires à sa gestion et définir les informations de dépendance afin de garantir le bon fonctionnement du système au démarrage de chaque service. Le démon + flotte + est construit sur + systemd + afin de gérer les services au niveau du cluster. Pour cette raison, il utilise des versions légèrement modifiées des fichiers unitaires standard + systemd +.

Pour un examen approfondi des fichiers d’unités + flotte + ', suivez notre https://www.digitalocean.com/community/tutorials/how-to-create-flexible-services-for-a-corecore-cluster-with -fleet-unit-files [plongée profonde] sur le sujet. Pour ce guide, nous allons simplement donner un aperçu approximatif du format de ces fichiers. Nous fournirons également un exemple de fichier d’unité que vous pouvez utiliser pour en savoir plus sur `+ flottectl +.

Sections de fichier d’unité de flotte

Les sections de base de la plupart des fichiers d’unité sont les suivantes:

  • * Unité *: Cette section est utilisée pour fournir des informations génériques sur l’unité qui ne dépendent pas du «type» d’unité. Cela inclura des informations de métadonnées et des informations de dépendance. Ceci est principalement utilisé dans + flotte + pour fournir des descriptions et spécifier cette position d’unités par rapport à d’autres unités de service.

  • * Section Type d’unité *: Le démon + flotte + peut prendre des unités de types différents, notamment:

  • Un service

  • Prise

  • Dispositif

  • Monter

  • Automount

  • Minuteur

  • Path

Si le type a des options spécifiques, une section du type associé est autorisée. Le type de section + Service + est de loin le plus courant. Cette section est utilisée pour définir des attributs spécifiques au type. Pour les unités + Service +, cela implique généralement de définir les commandes de démarrage et d’arrêt, ainsi que les commandes de pré et post-démarrage ou d’arrêt pouvant effectuer les actions associées.

  • * X-Fleet *: cette section fournit des options de configuration spécifiques à la flotte. Cela signifie principalement que vous pouvez spécifier qu’un service doit ou ne doit pas être planifié d’une certaine manière en fonction de critères tels que l’ID d’ordinateur, les services en cours d’exécution, les informations de métadonnées, etc.

Le format général d’un fichier unité sera:

[Unit]



[Service]



[X-Fleet]

Exemple de fichier d’unité de service

Pour débuter avec ce tutoriel, nous vous donnerons un fichier unité à utiliser. Ceci est extrait de la page CoreOS à titre d’exemple. Sur l’une de vos machines CoreOS, tapez:

vim hello.service

A l’intérieur, tapez notre exemple de fichier de service:

[Unit]
Description=My Service
After=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill hello
ExecStartPre=-/usr/bin/docker rm hello
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name hello busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=/usr/bin/docker stop hello

Voyons rapidement ce que cela fait.

Dans la section + [Unit] +, une description est définie et nous indiquons + systemd + que ce service ne peut être exécuté qu’après le démarrage de l’unité + docker.service +. En effet, notre unité dépend de Docker pour fonctionner.

Dans la section + [Service] +, nous désactivons le délai d’attente de démarrage, puis nous configurons certaines actions à exécuter avant de démarrer le service. + ExecStartPre + est exécuté avant l’action principale + ExecStart +. Si ceux-ci sont appelés avec + = - +, cela signifie que l’action peut échouer et ne pas affecter l’achèvement du service. Cela est nécessaire car nos actions de pré-démarrage suppriment essentiellement tout service en cours d’exécution. Cela échouera si aucun ne peut être trouvé et nous ne voulons pas que cela empêche notre service de démarrer car il s’agit simplement d’une procédure de nettoyage.

La dernière action de pré-démarrage extrait l’image de base busybox qui sera utilisée pour exécuter nos commandes. Comme cela est nécessaire, nous n’utilisons pas la syntaxe + = - +. Nous commençons ensuite un conteneur avec cette image avec une boucle infinie qui affiche «Hello World» une fois par seconde. L’action stop arrête simplement ce conteneur.

Ce sera juste assez pour vous permettre de démarrer. Si vous souhaitez plus d’informations sur la manière de développer des fichiers de flotte, consultez https://www.digitalocean.com/community/tutorials/how-to-create-flexible-services-for-a-corecore-cluster-with-fleet- unit-files [notre guide sur les fichiers d’unités de flotte].

Commandes de base de la gestion des machines

La première chose que nous ferons est de vous présenter l’utilitaire + fleetctl +. En tant qu’administrateur de cluster, cet outil sera votre interface principale pour gérer votre parc de machines. Une grande partie de la syntaxe a été reprise de + systemctl +, l’outil de gestion de systemd.

Pour commencer, nous pouvons obtenir une liste de tous les membres du cluster en tapant:

fleetctl list-machines
MACHINE     IP      METADATA
14ffe4c3... 10.132.249.212  -
1af37f7c... 10.132.249.206  -
9e389e93... 10.132.248.177  -

Comme vous pouvez le constater, chacune de vos machines est répertoriée ici comme disponible. Lorsque chaque membre s’amorce à l’aide du fichier cloud-config, il génère un ID d’ordinateur unique, utilisé pour identifier chaque nœud. Ceci est écrit dans un fichier dans + / etc / machine-id.

Par défaut, Fleet utilisera l’adresse IPv4 publique de la machine pour communiquer avec les autres membres. Cependant, dans notre fichier de configuration en nuage, nous avons dit à Fleet d’utiliser nos interfaces privées pour la communication. Ce sont les adresses IP indiquées dans la sortie ci-dessus.

La colonne «METADATA» est actuellement vide dans l’exemple ci-dessus. Cependant, nous aurions pu ajouter des paires clé-valeur arbitraires sous l’attribut + métadonnées + pour la flotte dans le cloud-config. Cela pourrait ressembler à ceci:

#cloud-config
. . .
coreos:
 fleet:
   public-ip: $private_ipv4
   metadata: region=europe,public_ip=$public_ipv4

Si vous configurez ceci dans votre configuration de cloud pour amorcer toutes vos machines, votre sortie ressemblera davantage à ceci:

MACHINE     IP      METADATA
14ffe4c3... 10.132.249.212  public_ip=104.131.36.200,region=europe
1af37f7c... 10.132.249.206  public_ip=104.131.15.192,region=europe
9e389e93... 10.132.248.177  public_ip=104.131.15.192,region=europe

Ces données supplémentaires sont utiles pour obtenir rapidement des informations sur un nœud du point de vue de la gestion, mais elles peuvent également être utilisées dans les définitions de service pour cibler des hôtes spécifiques.

Pour vous connecter à une machine spécifique du cluster, vous pouvez utiliser la commande + fleetctl ssh +. Cela vous permettra d’identifier une machine à laquelle vous connecter en fonction de son ID d’ordinateur ou d’une machine associée au nom d’unité fourni.

Par exemple, si vous avez une unité appelée + nginx.service +, vous pouvez vous connecter à l’hôte qui exécute ce service en tapant:

fleetctl ssh nginx

Vous serez déposé dans une session shell sur l’hôte associé. Vous pouvez également exécuter une seule commande sur un hôte distant, comme vous le feriez avec un exécutable normal + ssh +. Par exemple, pour obtenir les valeurs des variables + COREOS_PRIVATE_IPV4 + et + COREOS_PUBLIC_IPV4 + que CoreOS définit dans un fichier nommé '+ / etc / environment + `(en fonction des paramètres de la configuration en nuage et des interfaces réseau disponibles), vous pouvez taper:

fleetctl ssh nginx cat /etc/environment
COREOS_PRIVATE_IPV4=10.132.249.212
COREOS_PUBLIC_IPV4=104.131.29.80

La gestion des services

La plupart des autres commandes disponibles via + fleetctl + sont basées sur la gestion des services.

Commencer un service

Le démarrage d’un service comporte plusieurs étapes. Le fichier de service doit être chargé dans + flotte + pour qu’il soit au courant de l’unité. Il doit ensuite être programmé sur une machine spécifique en dehors du cluster. Il peut alors être démarré. Il existe des commandes pour chacune d’elles avec + fleetctl +, les commandes responsables des dernières étapes effectuant également les précédentes si nécessaire.

Vous pouvez utiliser la commande + submit + pour soumettre votre fichier d’unité dans + flotte +. Cela fera simplement que + flotte + lira le contenu du fichier en mémoire, le rendant disponible pour d’autres actions.

fleetctl submit hello.service

Votre fichier + hello.service + est maintenant connu sous le nom + flotte +. Pour voir les fichiers d’unité qui ont été soumis, vous pouvez taper:

fleetctl list-unit-files
UNIT        HASH    DSTATE      STATE       TMACHINE
hello.service   0d1c468 inactive    inactive    -

Comme vous pouvez le constater, le fichier d’unité est présent, mais n’a pas été planifié sur aucun hôte ni démarré.

Pour voir le contenu d’un fichier d’unité que + flotte + connaît, vous pouvez taper:

fleetctl cat hello.service
[Unit]
Description=My Service
After=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill hello
ExecStartPre=-/usr/bin/docker rm hello
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name hello busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=/usr/bin/docker stop hello

Cela vous permettra de voir le fichier actuel que + flotte + connaît.

  • Remarque *: La commande de soumission est idempotente, ce qui signifie que + flotte + ne mettra pas _ jour_ le fichier d’unité en mémoire si vous le soumettez à nouveau. Si vous devez mettre à jour votre fichier d’unité, vous devez le supprimer complètement, puis le soumettre à nouveau. Nous verrons comment faire cela plus tard.

Une fois votre unité soumise, l’étape suivante consiste à la planifier sur une machine. La planification de l’unité implique le moteur + flotte + qui examine l’unité pour décider de la meilleure machine du cluster à laquelle transmettre l’unité. Cela dépendra des conditions de la section + [X-Fleet] + de l’unité, ainsi que du volume de travail actuel de chaque machine du cluster. Une fois l’unité programmée, elle a été transmise à la machine spécifique et chargée dans l’instance locale + systemd +.

Utilisez la commande + load + pour charger et planifier l’unité:

fleetctl load hello.service
Unit hello.service loaded on 14ffe4c3.../10.132.249.212

Si vous n’aviez pas chargé manuellement votre appareil auparavant, il sera automatiquement chargé dans le cadre de ce processus en recherchant le nom de fichier approprié dans le répertoire actuel.

Maintenant, si nous vérifions nos fichiers d’unités, nous pouvons voir qu’ils ont été chargés. Nous pouvons même voir sur quelle machine il est programmé:

fleetctl list-unit-files
UNIT        HASH    DSTATE  STATE   TMACHINE
hello.service   0d1c468 loaded  loaded  14ffe4c3.../10.132.249.212

C’est aussi notre première occasion d’extraire la commande + list-units +. Cette commande est utilisée pour afficher toutes les unités en cours ou programmées et leurs statuts:

fleetctl list-units
UNIT        MACHINE             ACTIVE      SUB
hello.service   14ffe4c3.../10.132.249.212  inactive    dead

Pour réellement démarrer une unité, vous pouvez utiliser la commande + start +. Ceci démarrera l’unité sur la machine sur laquelle elle a été chargée en exécutant les commandes de démarrage définies dans le fichier d’unité:

fleetctl start hello.service
Unit hello.service launched on 14ffe4c3.../10.132.249.212

Une fois encore, nous devrions vérifier le + list-unit-files:

fleetctl list-unit-files
UNIT        HASH    DSTATE      STATE       TMACHINE
hello.service   0d1c468 launched    launched    14ffe4c3.../10.132.249.212

Dans la sortie ci-dessus, nous pouvons voir que le service a été lancé. La colonne + DSTATE + indique «l’état souhaité» et la colonne «+ STATE +» indique l’état actuel. Si ces deux éléments correspondent, cela signifie généralement que l’action a abouti.

Nous devrions également regarder à nouveau «+ list-units +»:

fleetctl list-units
UNIT        MACHINE             ACTIVE  SUB
hello.service   14ffe4c3.../10.132.249.212  active  running

Cela nous donne des informations sur l’état + systemd +. Il est collecté directement à partir du démon local. Il s’agit donc d’une meilleure image de la façon dont le système local voit l’état du service. La colonne + ACTIVE + est un état généralisé de l’unité, tandis que + SUB + est une description plus détaillée.

Arrêter un service

Chacune des commandes ci-dessus a une commande compagnon qui inverse l’état.

Par exemple, pour arrêter l’exécution d’un service, utilisez la commande + stop +. Cela fera que l’instance + systemd + de la machine locale exécutera les commandes d’arrêt définies dans l’unité:

fleetctl stop hello.service
Unit hello.service loaded on 14ffe4c3.../10.132.249.212

Comme vous pouvez le constater, le service est revenu à l’état + chargé +. Cela signifie qu’il est toujours chargé dans + systemd + de la machine, mais qu’il n’est pas en cours d’exécution. Nous pouvons confirmer que ici:

fleetctl list-unit-files
UNIT        HASH    DSTATE  STATE   TMACHINE
hello.service   0d1c468 loaded  loaded  14ffe4c3.../10.132.249.212

Pour retirer l’unité du système de cette machine, tout en la gardant disponible dans + flotte +, vous pouvez + décharger + l’unité. Si l’unité est actuellement active, elle sera arrêtée avant d’être déchargée:

fleetctl unload hello.service

Si nous vérifions l’état, nous pouvons voir qu’il est maintenant marqué comme inactif. De plus, aucune machine cible n’est répertoriée:

fleetctl list-unit-files
UNIT        HASH    DSTATE      STATE       TMACHINE
hello.service   0d1c468 inactive    inactive    -

Si nous voulons supprimer complètement l’unité de + flotte + , nous pouvons utiliser la commande + destroy + . Cela arrêtera et déchargera l’unité si nécessaire, puis supprimera l’unité de `+ flotte +:

fleetctl destroy hello.service

Si vous modifiez un fichier d’unité, vous devez détruire l’unité actuelle dans + flotte + avant de le soumettre / de le redémarrer.

Obtenir les statuts d’unité

Vous avez déjà vu certaines des méthodes pour obtenir des informations sur le statut des unités.

Par exemple, nous avons expliqué comment + list-units + listera toutes les unités actuellement programmées sur une machine:

fleetctl list-units
UNIT        MACHINE             ACTIVE  SUB
hello.service   14ffe4c3.../10.132.249.212  active  running

Le + list-unit-files s fournit une liste de all unités que` + flotte + `connaît. Il donne également des informations sur l’état souhaité et réel:

fleetctl list-unit-files
UNIT        HASH    DSTATE      STATE       TMACHINE
hello.service   0d1c468 launched    launched    14ffe4c3.../10.132.249.212

Pour des informations plus spécifiques sur une unité démarrée, il existe quelques autres commandes. La commande + status + renvoie le résultat + systemctl status + pour le service sur l’hôte qui exécute l’unité:

fleetctl status hello.service
● hello.service - My Service
  Loaded: loaded (/run/fleet/units/hello.service; linked-runtime)
  Active: active (running) since Mon 2014-09-08 21:51:22 UTC; 3min 57s ago
 Process: 7630 ExecStartPre=/usr/bin/docker pull busybox (code=exited, status=0/SUCCESS)
 Process: 7618 ExecStartPre=/usr/bin/docker rm hello (code=exited, status=0/SUCCESS)
 Process: 7609 ExecStartPre=/usr/bin/docker kill hello (code=exited, status=0/SUCCESS)
Main PID: 7638 (docker)
  CGroup: /system.slice/hello.service
          └─7638 /usr/bin/docker run --name hello busybox /bin/sh -c while true; do echo Hello World; sleep 1; done

Sep 08 21:55:11 coreos-3 docker[7638]: Hello World
Sep 08 21:55:12 coreos-3 docker[7638]: Hello World
Sep 08 21:55:13 coreos-3 docker[7638]: Hello World
Sep 08 21:55:14 coreos-3 docker[7638]: Hello World
Sep 08 21:55:15 coreos-3 docker[7638]: Hello World
Sep 08 21:55:16 coreos-3 docker[7638]: Hello World
Sep 08 21:55:17 coreos-3 docker[7638]: Hello World
Sep 08 21:55:18 coreos-3 docker[7638]: Hello World
Sep 08 21:55:19 coreos-3 docker[7638]: Hello World
Sep 08 21:55:20 coreos-3 docker[7638]: Hello World

Comme vous pouvez le constater, nous devons enfin vérifier que la sortie de notre unité est en cours de production.

De même, si vous souhaitez voir l’entrée de journal du service disponible sur la machine associée, vous pouvez utiliser la commande + journal +:

fleetctl journal hello.service
-- Logs begin at Mon 2014-09-08 14:22:14 UTC, end at Mon 2014-09-08 21:55:47 UTC. --
Sep 08 21:55:38 coreos-3 docker[7638]: Hello World
Sep 08 21:55:39 coreos-3 docker[7638]: Hello World
Sep 08 21:55:40 coreos-3 docker[7638]: Hello World
Sep 08 21:55:41 coreos-3 docker[7638]: Hello World
Sep 08 21:55:42 coreos-3 docker[7638]: Hello World
Sep 08 21:55:43 coreos-3 docker[7638]: Hello World
Sep 08 21:55:44 coreos-3 docker[7638]: Hello World
Sep 08 21:55:45 coreos-3 docker[7638]: Hello World
Sep 08 21:55:46 coreos-3 docker[7638]: Hello World
Sep 08 21:55:47 coreos-3 docker[7638]: Hello World

Par défaut, cela affichera les 10 dernières lignes. Vous pouvez ajuster ceci en ajoutant un paramètre + - lines +, comme ceci:

fleetctl journal --lines 20 hello.service

Vous pouvez également utiliser le paramètre + -f +, qui signifie «suivre». Cela se comporte de la même manière que + tail -f + en ce sens qu’il continuera à transmettre les dernières entrées du journal:

fleetctl journal -f hello.service

Conclusion

En apprenant à utiliser efficacement + flotte + et + flottectl +, vous pouvez facilement contrôler votre cluster CoreOS. Vos services et conteneurs peuvent être déplacés vers différentes machines sans trop de problème.

Dans un guide ultérieur, nous aborderons plus en détail https://www.digitalocean.com/community/tutorials/how-to-create-flexible-services-for-a-coreos-cluster-with-fleet-unit -files [comment créer des fichiers d’unité de flotte]. Cela vous permettra de créer des services flexibles et puissants qui tirent parti de l’architecture CoreOS.