Comment résoudre les problèmes courants avec vos serveurs CoreOS

introduction

CoreOS introduit un certain nombre de technologies intéressantes facilitant la création de systèmes distribués. Cependant, ces outils peuvent ne pas être familiers aux nouveaux utilisateurs et avoir leurs propres excentricités. L’un des principaux problèmes est qu’il existe de nombreuses couches d’abstraction au travail et qu’il peut être difficile d’identifier le problème.

Dans ce guide, nous allons passer en revue certaines procédures de dépannage de base pour travailler avec les hôtes CoreOS, les conteneurs Docker qu’ils exécutent et les outils de gestion de services qui rassemblent certaines des pièces disparates.

Débogage de votre fichier Cloud-Config

L’un des problèmes les plus courants rencontrés par les utilisateurs nouveaux et expérimentés de CoreOS lorsqu’un cluster ne parvient pas à apparaître correctement est un fichier cloud-config non valide.

CoreOS nécessite qu’un fichier de configuration cloud soit transmis à votre serveur lors de sa création. Il utilise les informations contenues dans ce fichier pour s’amorcer et initier ou rejoindre un cluster existant. Il démarre également les services essentiels et peut configurer les bases du système, telles que les utilisateurs et les groupes.

Quelques points à vérifier avec votre fichier cloud-config:

  • * Commence-t-il par “# cloud-config”? *: Chaque fichier de configuration de cloud transmis doit commencer par “# cloud-config” en tant que tel sur la première ligne. S’il s’agit généralement d’un commentaire ignoré dans YAML, dans ce cas, cette ligne est utilisée pour signaler au système d’initiation au cloud que celle-ci contient des données de configuration.

  • * Votre fichier contient-il un fichier YAML valide? *: Les fichiers de configuration de cloud sont écrits au format YAML, un format de sérialisation des données axé sur la lisibilité. Si vous rencontrez des problèmes, collez votre configuration cloud dans un validateur en ligne YAML. Votre fichier ne doit contenir aucune erreur. CoreOS fournit un outil utile permettant de vérifier la syntaxe de votre fichier cloud-config, Cloud-Config Validator.

  • * Utilisez-vous un nouveau jeton de découverte? *: L’adresse de découverte garde la trace des données de vos machines même si le cluster est en panne. L’enregistrement de découverte échouera lorsque vous démarrez avec un ancien jeton, surtout si vous aviez déjà enregistré la même adresse IP auparavant. Utilisez un nouveau jeton de découverte chaque fois que vous démarrez un cluster afin d’éviter ce problème.

  • * Est-ce que vous démarrez les services de flotte et etcd? *: Deux services qui doivent être démarrés pour que votre cluster fonctionne correctement sont + flotte + et + etcd +. Vous devriez consulter notre guide sur avoir un cluster CoreOS fonctionnant sous DigitalOcean pour une analyse de base. fichier cloud-config qui répond à ces exigences minimales.

Vous pouvez uniquement transmettre le fichier cloud-config lors de la création de la machine. Si vous vous êtes trompé, détruisez l’instance du serveur et recommencez (avec un nouveau jeton, dans la plupart des cas).

Une fois que vous êtes à peu près certain que le fichier cloud-config est correct, vous devez ensuite vous connecter à l’hôte pour vous assurer que le fichier a été traité correctement.

Cela devrait être facile dans la plupart des cas car, sur DigitalOcean, vous devez ajouter des clés ssh au serveur lors de la création. Cela signifie que vous pouvez généralement SSH sur le serveur pour résoudre les problèmes sans problème.

Connexion via le panneau de configuration DigitalOcean

Cependant, à certains moments, votre configuration de cloud peut avoir réellement affecté la disponibilité du réseau de votre serveur une fois lancé. Dans ce cas, vous devrez vous connecter via le panneau de commande DigitalOcean. Cela pose un problème, car aucun mot de passe n’est défini par défaut sur l’image CoreOS pour des raisons de sécurité.

Pour contourner ce problème, vous devez recréer le serveur avec un nouveau fichier cloud-config contenant une entrée de mot de passe pour l’utilisateur + core +. En raison des besoins en loisirs, cela ne sera probablement utile que si vous voyez constamment ce problème et souhaitez obtenir plus d’informations. Vous voudrez peut-être ajouter les informations de mot de passe à tous vos fichiers cloud-config en tant que pratique générale afin de pouvoir résoudre les problèmes. Vous pouvez manuellement supprimer le mot de passe après avoir vérifié votre connexion.

Le mot de passe doit être sous la forme d’un hachage. Vous pouvez générer ces différentes manières en fonction du logiciel dont vous disposez. N’importe lequel des éléments suivants fonctionnera, utilisez donc l’option qui vous convient le mieux:

mkpasswd --method=SHA-512 --rounds=4096
openssl passwd -1
python -c "import crypt, getpass, pwd; print crypt.crypt('password', '\$6\$SALT\$')"
perl -e 'print crypt("password","\$6\$SALT\$") . "\n"'

Une fois que vous avez un hachage, vous pouvez ajouter une nouvelle section à votre configuration de cloud (en dehors de la section «coreos»), appelée + utilisateurs + pour placer cette information:

#cloud-config
users:
 - name: core
   passwd:
coreos:
 . . .

Validate votre syntaxe YAML, puis utilisez cette nouvelle configuration en nuage lors de la création du serveur. Vous devriez alors pouvoir utiliser le mot de passe que vous avez sélectionné pour vous connecter via le panneau de commande DigitalOcean.

Vérification de l’hôte individuel

Une fois que vous êtes connecté, vous devez vérifier si votre cloud-config a été traité correctement.

Vérifier les erreurs dans les services essentiels

Une façon simple de commencer est de demander à + ​​fleetctl + quelles machines il connaît. Si cela retourne sans erreur, cela signifie que + flotte + et + etcd + ont été démarrés correctement et qu’ils communiquent avec d’autres hôtes.

fleetctl list-machines

Si vous obtenez une erreur ici, vous devriez regarder un certain nombre de choses. Une erreur commune ressemble à ceci:

2014/09/18 17:10:50 INFO client.go:278: Failed getting response from http://127.0.0.1:4001/: dial tcp 127.0.0.1:4001: connection refused
2014/09/18 17:10:50 ERROR client.go:200: Unable to get result for {Get /_coreos.com/fleet/machines}, retrying in 100ms
2014/09/18 17:10:50 INFO client.go:278: Failed getting response from http://127.0.0.1:4001/: dial tcp 127.0.0.1:4001: connection refused
2014/09/18 17:10:50 ERROR client.go:200: Unable to get result for {Get /_coreos.com/fleet/machines}, retrying in 200ms

Puisque cela représente une pile de différents composants les uns sur les autres, commençons par le haut et descendons. Vérifiez le service + flotte + pour voir quelles erreurs il nous donne:

systemctl status -l fleet
● fleet.service - fleet daemon
  Loaded: loaded (/usr/lib64/systemd/system/fleet.service; static)
 Drop-In: /run/systemd/system/fleet.service.d
          └─20-cloudinit.conf
  Active: active (running) since Thu 2014-09-18 17:10:50 UTC; 2min 26s ago
Main PID: 634 (fleetd)
  CGroup: /system.slice/fleet.service
          └─634 /usr/bin/fleetd

Sep 18 17:13:07 dumb1 fleetd[634]: INFO client.go:278: Failed getting response from http://localhost:4001/: dial tcp 127.0.0.1:4001: connection refused
Sep 18 17:13:07 dumb1 fleetd[634]: ERROR client.go:200: Unable to get result for {Update /_coreos.com/fleet/machines/795de101bcd24a3a96aa698f770f0074/object}, retrying in 800ms
Sep 18 17:13:08 dumb1 fleetd[634]: INFO client.go:278: Failed getting response from http://localhost:4001/: dial tcp 127.0.0.1:4001: connection refused

Comme vous pouvez le constater, le service est en cours d’exécution, mais il ne peut pas se connecter au port + 4001 +, qui est le port + etcd +. Cela indique que le problème pourrait être avec + etcd +.

Pour chacun de nos services essentiels, nous devrions vérifier l’état et les journaux. La manière générale de faire ceci est:

systemctl status -l
journalctl -b -u

La commande “status” nous donne l’état du service et les dernières lignes de journal. La commande journal nous donne accès à tous les journaux.

Si nous essayons ceci avec + etcd + next, nous pouvons voir que le service + etcd + ne fonctionne pas dans notre cas:

systemctl status -l etcd
● etcd.service - etcd
  Loaded: loaded (/usr/lib64/systemd/system/etcd.service; static)
 Drop-In: /run/systemd/system/etcd.service.d
          └─20-cloudinit.conf
  Active: activating (auto-restart) (Result: exit-code) since Thu 2014-09-18 17:17:03 UTC; 9s ago
 Process: 938 ExecStart=/usr/bin/etcd (code=exited, status=1/FAILURE)
Main PID: 938 (code=exited, status=1/FAILURE)

Sep 18 17:17:03 dumb1 systemd[1]: etcd.service: main process exited, code=exited, status=1/FAILURE
Sep 18 17:17:03 dumb1 systemd[1]: Unit etcd.service entered failed state.

Si nous vérifions les journaux + etcd +, nous verrons quelque chose comme ceci:

journalctl -b -u etcd
Sep 18 17:21:27 dumb1 systemd[1]: Starting etcd...
Sep 18 17:21:27 dumb1 systemd[1]: Started etcd.
Sep 18 17:21:27 dumb1 etcd[1160]: [etcd] Sep 18 17:21:27.966 INFO      | The path /var/lib/etcd/log is in btrfs
Sep 18 17:21:27 dumb1 etcd[1160]: [etcd] Sep 18 17:21:27.967 INFO      | Set NOCOW to path /var/lib/etcd/log succeeded
Sep 18 17:21:27 dumb1 etcd[1160]: [etcd] Sep 18 17:21:27.967 INFO      |
Sep 18 17:21:28 dumb1 etcd[1160]: [etcd] Sep 18 17:21:28.422 WARNING   | Discovery encountered an error: invalid character 'p' after top-level value
Sep 18 17:21:28 dumb1 etcd[1160]: [etcd] Sep 18 17:21:28.423 WARNING   | 795de101bcd24a3a96aa698f770f0074 failed to connect discovery service[https://discovery.etcd.io/]: invalid character 'p' after top-level value
Sep 18 17:21:28 dumb1 etcd[1160]: [etcd] Sep 18 17:21:28.423 CRITICAL  | 795de101bcd24a3a96aa698f770f0074, the new instance, must register itself to discovery service as required
Sep 18 17:21:28 dumb1 systemd[1]: etcd.service: main process exited, code=exited, status=1/FAILURE
Sep 18 17:21:28 dumb1 systemd[1]: Unit etcd.service entered failed state.

La ligne en surbrillance montre que cette instance particulière n’avait pas de jeton de découverte.

Vérifiez le système de fichiers pour voir les fichiers de configuration générés par Cloud-Config

La prochaine chose à vérifier est quels fichiers de service ont été générés par le cloud-config.

Lorsque votre machine CoreOS traite le fichier cloud-config, elle génère les fichiers unité stub + systemd + utilisés pour démarrer + flotte + et + etcd +. Pour voir les fichiers de configuration + systemd + créés et utilisés pour démarrer vos services, allez dans le répertoire où ils ont été déposés:

cd /run/systemd/system
ls -F
etcd.service.d/  fleet.service.d/  oem-cloudinit.service

Vous pouvez voir le fichier généralisé + oem-cloudinit.service +, qui est traité automatiquement par CoreOS, ainsi que les répertoires contenant des informations de service. Nous pouvons voir quelles informations notre service + etcd + est en train de démarrer en tapant:

cat etcd.servicd.d/20-cloudinit.conf
[Service]
Environment="ETCD_ADDR=10.132.247.162:4001"
Environment="ETCD_DISCOVERY=https://discovery.etcd.io/"
Environment="ETCD_NAME=795de101bcd24a3a96aa698f770f0074"
Environment="ETCD_PEER_ADDR=10.132.247.162:7001"

Il s’agit d’un fichier d’unité + systemd + de module utilisé pour ajouter des informations supplémentaires au service lors de son démarrage. Comme vous pouvez le voir ici, l’adresse + ETCD_DISCOVERY + correspond à l’erreur trouvée dans les journaux: il n’y a pas de jeton de découverte ajouté à la fin. Nous devons refaire nos machines en utilisant une configuration en nuage avec un jeton de découverte valide.

Vous pouvez obtenir des informations similaires sur + flotte + en tapant:

cat fleet.service.d/20-cloudinit.conf
[Service]
Environment="FLEET_METADATA=region=nyc,public_ip=104.131.1.89"
Environment="FLEET_PUBLIC_IP=10.132.247.162"

Ici, nous pouvons voir que + flotte + a reçu des informations de métadonnées dans le cloud-config. Cela peut être utilisé pour la planification lorsque vous créez des fichiers d’unité de service.

Vérification de l’accès au service de métadonnées

Le fichier de configuration cloud fourni lors de la création du serveur CoreOS avec DigitalOcean est stocké à l’aide d’un service de métadonnées. Si vous n’avez trouvé aucune preuve de votre configuration cloud sur votre serveur, il est possible qu’il ne soit pas en mesure d’extraire les informations du service de métadonnées DigitalOcean.

Dans votre ordinateur hôte, tapez:

curl -L 169.254.169.254/metadata/v1
id
hostname
user-data
vendor-data
public-keys
region
interfaces/
dns/

Vous devez inclure le + -L + pour suivre les redirections. L’adresse + 169.254.169.254 + sera utilisée pour le serveur every, vous ne devez donc pas modifier cette adresse. Cela vous montre les champs de métadonnées et les répertoires contenant des informations sur votre serveur. Si vous ne parvenez pas à y accéder depuis votre serveur DigitalOcean CoreOS, vous devrez peut-être ouvrir un ticket de support.

Vous pouvez interroger cette URL pour obtenir des informations sur votre serveur. Vous pouvez explorer chacune des entrées ici avec des commandes curl supplémentaires, mais celle qui contient le fichier cloud-config est le champ + user-data +:

curl -L 169.254.169.254/metadata/v1/user-data
#cloud-config
users:
 - name: core
   passwd: $6$CeKTMyfClO/CPSHB$02scg00.FnwlEYdq/oXiXoohzvvlY6ykUck1enMod7VKJrzyGRAtZGziZh48LNcECu/mtgPZpY6aGCoj.h4bV1
coreos:
 etcd:
   # generated token from https://discovery.etcd.io/new
   discovery: https://discovery.etcd.io/
   # multi-region and multi-cloud deployments need to use $public_ipv4
   addr: $private_ipv4:4001
   peer-addr: $private_ipv4:7001
 fleet:
   public-ip: $private_ipv4
   metadata: region=nyc,public_ip=$public_ipv4
 units:
   - name: etcd.service
     command: start
   - name: fleet.service
     command: start

Si vous pouvez lire votre configuration de cloud à partir de cet emplacement, cela signifie que votre serveur a la capacité de lire les données de configuration de cloud et qu’il doit appliquer ses instructions lors du démarrage du serveur.

Dépannage d’autres problèmes liés à un ordinateur hôte CoreOS

Si vous devez poursuivre le débogage, vous découvrirez rapidement que CoreOS contient une installation de base très minimale. Comme tous les logiciels doivent être exécutés dans des conteneurs, il n’inclut même pas certains des programmes utilitaires les plus élémentaires.

Heureusement, les développeurs CoreOS apportent une solution élégante à ce problème. En utilisant le script «toolbox» inclus dans chaque hôte, vous pouvez démarrer un conteneur Fedora avec un accès aux systèmes hôte. À l’intérieur de ce conteneur, vous pouvez installer tous les utilitaires nécessaires au débogage de l’hôte.

Pour le démarrer, utilisez simplement la commande + toolbox +:

toolbox

Cela va extraire la dernière image de Fedora et vous déposer dans une ligne de commande dans le conteneur. Si vous effectuez quelques vérifications rapides, vous réaliserez que vous avez accès au réseau du système hôte:

ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host
      valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
   link/ether 04:01:28:7c:39:01 brd ff:ff:ff:ff:ff:ff
   inet 169.254.180.43/16 brd 169.254.255.255 scope link eth0
      valid_lft forever preferred_lft forever
   . . .

Vous avez également un accès complet aux processus de l’hôte:

ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 106024  4912 ?        Ss   17:10   0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 19
root         2  0.0  0.0      0     0 ?        S    17:10   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    17:10   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   17:10   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    17:10   0:00 [kworker/u4:0]
root         7  0.0  0.0      0     0 ?        S    17:10   0:00 [rcu_sched]
root         8  0.0  0.0      0     0 ?        S    17:10   0:00 [rcu_bh]
. . .

Vous pouvez installer tous les outils dont vous avez besoin dans cet environnement. Par exemple, nous pouvons installer + htop +, un clone supérieur avec des fonctionnalités supplémentaires, en utilisant le gestionnaire de paquets Fedora:

yum install htop -y && htop

Ceci affichera le moniteur de processus avec tous les processus de l’hôte chargés.

Pour quitter l’environnement du conteneur, tapez «exit» ou appuyez sur + CTRL -] + trois fois plus vite. Vous serez replacé dans la session shell de l’hôte.

Dépannage des services de n’importe quel hôte

Les services que vous exécutez sont un autre domaine que vous devrez peut-être résoudre. Parce que nous disposons de + flotte + et + flottectl + pour gérer nos services à l’échelle du cluster, nos premières étapes peuvent être effectuées sur n’importe lequel des serveurs de notre cluster.

Nous devrions commencer par nous faire une idée de la santé de vos services, à la fois du point de vue de + flotte +, et des hôtes individuels affectés à l’exécution de chaque service. L’outil + flottectl + nous donne des commandes pour obtenir facilement ces informations.

Tout d’abord, voyez comment + flotte + voit l’état du service en tapant:

fleetctl list-unit-files
UNIT                HASH    DSTATE      STATE       TARGET
[email protected]   06d78fb loaded      loaded      04856ec4.../10.132.249.212
[email protected]   06d78fb loaded      loaded      197a1662.../10.132.249.206
[email protected]   06d78fb loaded      loaded      e3ca8fd3.../10.132.252.37
[email protected]     0f7f53b launched    launched    04856ec4.../10.132.249.212
[email protected]     0f7f53b launched    launched    197a1662.../10.132.249.206
[email protected]     0f7f53b launched    launched    e3ca8fd3.../10.132.252.37
nginx_lb.service        c8541af launched    launched    96ec72cf.../10.132.248.177

Cela vous donnera un aperçu de tous les services que + flotte + connaît. Cette sortie contient des informations très importantes. Nous allons jeter un coup d’oeil.

  • * UNIT *: Ceci est le nom de l’unité. Dans notre cas, les six principaux services sont tous des unités d’instance (pour en savoir plus sur https://www.digitalocean.com/community/tutorials/how-to-create-flexible-services-for-a-corecore-cluster-with- flotte-unit-files [templates and instances] here) et le bas semble être une instance statique. Ce sont les noms que nous pouvons utiliser pour émettre des commandes affectant chacun de ces services.

  • * HASH *: c’est le hachage du fichier d’unité utilisé pour contrôler ce service. Comme vous pouvez le constater, toutes les instances + apache-discovery + sont générées à partir du même fichier de modèle. Les instances + apache sont toutes générées à partir d’une autre. Cela peut être utile pour voir si l’un de vos services présente un comportement étrange en utilisant un fichier d’unité obsolète.

  • * DSTATE *: C’est l’état souhaité de l’unité. Lorsque vous lancez une commande sur + fleetctl + pour modifier l’état d’une unité, cette colonne change pour refléter l’état souhaité pour cette unité.

  • * STATE *: Il s’agit de l’état actual de l’unité, connu sous le nom de + flotte +. Si cela diffère de DSTATE, cela peut signifier qu’une opération a échoué.

  • * TARGET *: La machine qui a été programmée pour exécuter ce service. Ce sera disponible quand une unité est lancée ou chargée. Il contient l’ID de l’ordinateur et l’adresse IP de l’appareil.

Comme vous pouvez le constater, de nombreuses informations peuvent vous aider à résoudre un problème.

Cependant, ce n’est pas le seul endroit important à vérifier. Il est important de réaliser qu’il arrive parfois que + flotte + ne soit pas d’accord avec l’instance locale + systemd + de la machine concernant l’état d’un service. Cela peut se produire pour diverses raisons, par exemple si une unité démarre ou arrête une autre unité en interne.

Pour obtenir des informations sur l’état de chaque service, issues de l’instance + systemd + de l’hôte qui exécute ce service, utilisez plutôt la commande + list-units +:

fleetctl list-units
UNIT                MACHINE             ACTIVE  SUB
[email protected]   04856ec4.../10.132.249.212  active  running
[email protected]   197a1662.../10.132.249.206  active  running
[email protected]   e3ca8fd3.../10.132.252.37   active  running
[email protected]     04856ec4.../10.132.249.212  active  running
[email protected]     197a1662.../10.132.249.206  active  running
[email protected]     e3ca8fd3.../10.132.252.37   active  running
nginx_lb.service        96ec72cf.../10.132.248.177  active  running

Ici, nous pouvons voir que tous les services sont répertoriés comme étant en cours d’exécution. Ceci est en désaccord avec les informations affichées par + list-unit-files. En effet, chacun des services + apache lance le service` + apache-discovery` associé sans informer + flotte +. Ce n’est pas une erreur, mais peut créer une confusion sur l’état actuel d’un service.

Pour obtenir des informations complémentaires sur l’un des services, vous pouvez utiliser + flottectl + pour accéder aux informations + systemctl status + et + journalctl -u + du système hôte. Il suffit de taper:

fleetctl status
[email protected] - Apache web server service on port 4444
  Loaded: loaded (/run/fleet/units/[email protected]; linked-runtime)
  Active: active (running) since Thu 2014-09-18 18:50:00 UTC; 7min ago
 Process: 3535 ExecStartPre=/usr/bin/docker pull imchairmanm/apache (code=exited, status=0/SUCCESS)
 Process: 3526 ExecStartPre=/usr/bin/docker rm apache.%i (code=exited, status=0/SUCCESS)
 Process: 3518 ExecStartPre=/usr/bin/docker kill apache.%i (code=exited, status=0/SUCCESS)
Main PID: 3543 (docker)
  CGroup: /system.slice/system-apache.slice/[email protected]
          └─3543 /usr/bin/docker run -t --name apache.4444 -p 10.132.249.212:4444:80 imchairmanm/apache /usr/sbin/apache2ctl -D FOREGROUND

Ou lisez le journal en tapant:

fleetctl journal
-- Logs begin at Mon 2014-09-15 14:54:12 UTC, end at Thu 2014-09-18 18:57:51 UTC. --
Sep 17 14:33:20 lala2 systemd[1]: Started Apache web server service on port 4444.
Sep 17 14:33:20 lala2 docker[21045]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.10. Set the 'ServerName' directive globally to suppress this message
Sep 18 18:49:29 lala2 systemd[1]: Stopping Apache web server service on port 4444...
Sep 18 18:49:39 lala2 docker[3500]: apache.4444
Sep 18 18:49:39 lala2 systemd[1]: Stopped Apache web server service on port 4444.
Sep 18 18:49:58 lala2 systemd[1]: Starting Apache web server service on port 4444...
Sep 18 18:49:58 lala2 docker[3518]: apache.4444
Sep 18 18:49:58 lala2 docker[3526]: apache.4444
Sep 18 18:49:58 lala2 docker[3535]: Pulling repository imchairmanm/apache
Sep 18 18:50:00 lala2 systemd[1]: Started Apache web server service on port 4444.

Cela peut fournir de bonnes informations sur la raison pour laquelle vos services échouent. Par exemple, si votre fichier d’unité a déclaré une dépendance indisponible, cela s’afficherait ici (cela peut se produire si la dépendance n’a pas encore été chargée dans + flotte +).

Une erreur que vous pouvez rencontrer lorsque vous exécutez certaines de ces commandes est la suivante:

Error running remote command: SSH_ AUTH _SOCK environment variable is not set. Verify ssh-agent is running. See https://github.com/coreos/fleet/blob/master/Documentation/using-the-client.md for help.

Cela indique que vous n’avez pas transféré votre agent utilisateur ssh lorsque vous vous êtes connecté à cet hôte. Afin que + flotte + obtienne des informations sur les autres machines du cluster, il se connecte à l’aide des informations d’identification SSH que vous conservez sur votre ordinateur local.

Pour ce faire, vous devez exécuter un agent ssh sur votre ordinateur local et ajouter votre clé privée. Vous pouvez le faire sur votre ordinateur local en tapant:

eval $(ssh-agent)
ssh-add
Identity added: /home//.ssh/id_rsa (/home//.ssh/id_rsa)

Une fois que votre agent ssh a eu accès à votre clé privée, vous devez vous connecter à votre hôte CoreOS avec l’option + -A + pour forward cette information:

ssh -A core@

Cela permettra à la machine sur laquelle vous êtes en mode SSH d’utiliser vos informations d’identification pour établir des connexions avec les autres machines du cluster. C’est ce qui vous permet de lire les informations + systemd + des membres du cluster distant. Il vous permet également de ssh directement aux autres membres.

Dépannage des conteneurs de l’hôte exécutant le service

Bien que vous puissiez obtenir de nombreux éléments d’information de grande qualité en n’utilisant que + fleetctl +, vous devez parfois vous adresser à l’hôte responsable de l’exécution du service pour résoudre les problèmes.

Comme nous l’avons indiqué ci-dessus, cela est facile lorsque vous avez transféré vos informations SSH lors de la connexion. Depuis l’hôte auquel vous vous êtes connecté, vous pouvez “sauter” vers d’autres machines en utilisant + fleetctl +. Vous pouvez spécifier un ID d’ordinateur ou simplement le nom du service. Le processus + flottectl + est suffisamment intelligent pour savoir à quel hôte vous faites référence:

fleetctl ssh

Cela vous donnera une connexion ssh à l’hôte affecté à l’exécution de ce service. Un service doit être à l’état «chargé» ou «lancé» pour que cela fonctionne.

À partir de là, vous aurez accès à tous les outils de dépannage locaux. Par exemple, vous pouvez accéder à l’ensemble plus complet d’indicateurs + journalctl + qui ne sont peut-être pas disponibles via la commande + fleetctl journal +:

journalctl -b --no-pager -u apache@4444

À ce stade, vous souhaiterez peut-être résoudre les problèmes liés à Docker. Pour voir la liste des conteneurs en cours d’exécution, tapez:

docker ps
CONTAINER ID        IMAGE                       COMMAND                CREATED             STATUS              PORTS                         NAMES
       imchairmanm/apache:latest   "/usr/sbin/apache2ct   30 minutes ago      Up 30 minutes       10.132.249.212:4444->80/tcp   apache.4444

Nous pouvons voir qu’un seul conteneur est en cours d’exécution. L’ID de conteneur en surbrillance est utile pour de nombreuses autres opérations Docker.

Si votre service ne parvient pas à démarrer, votre conteneur ne sera pas en cours d’exécution. Pour voir une liste de tous les conteneurs, y compris ceux qui ont quitté / échoué, passez l’indicateur + -a +:

docker ps -a
CONTAINER ID        IMAGE                       COMMAND                CREATED             STATUS                     PORTS                         NAMES
b68139630337        imchairmanm/apache:latest   "/usr/sbin/apache2ct   31 minutes ago      Up 31 minutes              10.132.249.212:4444->80/tcp   apache.4444
4389108bff1a        imchairmanm/apache:latest   "/usr/sbin/apache2ct   28 hours ago        Exited (-1) 28 hours ago                                 apache.8888
5af6e4f95642        imchairmanm/lalala:latest   "/usr/sbin/apache2ct   3 days ago          Exited (-1) 3 days ago                                   apache.7777

Pour voir le conteneur last qui a été démarré, quel que soit son état, vous pouvez utiliser l’indicateur + -l + à la place:

docker ps -l
CONTAINER ID        IMAGE                       COMMAND                CREATED             STATUS              PORTS                         NAMES
b68139630337        imchairmanm/apache:latest   "/usr/sbin/apache2ct   33 minutes ago      Up 33 minutes       10.132.249.212:4444->80/tcp   apache.4444

Une fois que vous avez l’ID de conteneur du conteneur que vous recherchez, vous pouvez commencer à enquêter au niveau de Docker. Tout d’abord, vous pouvez afficher les journaux:

docker logs

Cela vous donnera les informations de journal pouvant être collectées à partir du conteneur. Cela devrait fonctionner que le conteneur soit en cours d’exécution ou non. Si le conteneur a été exécuté de manière interactive (avec les indicateurs + -i + et + -t + et une session shell), l’intégralité de la session sera disponible dans les journaux.

Vous pouvez obtenir une liste des processus en cours pour tout conteneur actif en tapant:

docker top

Génération d’une session shell dans un conteneur

Une des étapes les plus utiles consiste à ouvrir une session shell sur un conteneur en cours d’exécution pour voir ce qui se passe de l’intérieur. Pour ce faire, CoreOS est fourni avec un utilitaire appelé + nsenter +.

Les conteneurs Docker fonctionnent en configurant des espaces de noms de noyau et cet outil peut démarrer une session dans ces environnements. La première étape consiste à obtenir le PID du conteneur que vous souhaitez entrer:

PID=$(docker inspect --format {{.State.Pid}} )

Maintenant, vous pouvez ouvrir une session shell dans cet environnement conteneur en tapant:

sudo nsenter -t $PID -m -u -i -n -p

Vous recevrez une session shell dans l’environnement du conteneur. À partir de là, vous pouvez afficher les journaux ou effectuer tout autre dépannage nécessaire.

Selon la manière dont le conteneur a été construit, vous pouvez recevoir un message indiquant que + bash + n’a pas été trouvé. Dans ce cas, vous devrez utiliser le shell générique + sh + en l’ajoutant à la fin de votre commande:

sudo nsenter -t $PID -m -u -i -n -p /bin/sh

Conclusion

Voici quelques-unes des procédures que vous pouvez utiliser pour résoudre les problèmes liés à vos clusters CoreOS. Celles-ci devraient vous aider à localiser les problèmes que vous pourriez rencontrer avec votre fichier de configuration en cloud et à dépanner la capacité de vos machines à mettre en cluster et à démarrer les services correctement. La détection des problèmes liés aux conteneurs et services Docker est un autre domaine que nous avons abordé.

Une des choses les plus importantes à garder à l’esprit est que le débogage devient beaucoup plus facile à mesure que vous avez plus d’informations sur votre système. Il est utile de bien comprendre le rôle de chaque composant et la manière dont ils interagissent pour aider le système à fonctionner. Si vous vous retrouvez perdu en essayant de dépister un problème, il peut être utile de vous rappeler les bases de CoreOS.