Les 10 meilleures erreurs de journalisation Dockerque chaque utilisateur Docker devrait savoir

L’une des premières commandes que les utilisateurs Docker apprennent après « docker run » est « docker logs » — mais saviez-vous que la commande « docker logs » ne fonctionne pas toujours? Cela peut sembler incroyable, mais c’est vrai. Nous en apprendrons plus sur les raisons plus tard.

Docker a modifié non seulement la façon dont les applications sont déployées, mais également le flux de travail pour la gestion des journaux. Au lieu d’écrire des journaux dans des fichiers, les conteneurs écrivent des journaux dans la console (stdout / stderr) et les pilotes de journalisation Docker transfèrent les journaux vers leur destination. Une vérification des problèmes de Docker Github montre rapidement que les utilisateurs rencontrent divers problèmes lors de la gestion des journaux Docker.

Aperçu des pilotes de journalisation Docker

La gestion des journaux avec Docker semble être délicate et nécessite une connaissance plus approfondie des implémentations et des alternatives de pilotes de journalisation Docker pour surmonter les problèmes signalés par les utilisateurs. Alors, quels sont les 10 principaux pièges de journalisation Docker que chaque utilisateur de Docker devrait connaître?

Commençons par un aperçu des pilotes de journalisation Docker et des options pour expédier les journaux vers des solutions de gestion centralisée des journaux telles que Elastic Stack (ancienne pile ELK) ou Sematext Cloud.

Dans les premiers jours de Docker, les journaux de conteneurs n’étaient disponibles que via l’API distante Docker, c’est-à-dire via la commande « docker logs » et quelques expéditeurs de journaux avancés. Plus tard, Docker a introduit les pilotes de journalisation en tant que plugins, pour ouvrir Docker pour des intégrations avec divers outils de gestion des journaux. Ces pilotes de journalisation sont implémentés en tant que plugins binaires dans le démon docker. Récemment, l’architecture des plugins a été étendue pour exécuter des plugins de journalisation en tant que processus externes, qui pouvaient s’enregistrer en tant que plugins et récupérer des journaux via des fichiers FIFO Linux. Actuellement, les pilotes de journalisation livrés avec les binaires docker sont des plugins binaires, mais cela pourrait changer dans un proche avenir.

Les pilotes de journalisation Docker reçoivent les journaux de conteneur et les transfèrent vers des destinations ou des fichiers distants. Le pilote de journalisation par défaut est « fichier json ». Il stocke les journaux de conteneur au format JSON sur le disque local. Docker a une architecture de plugin pour les pilotes de journalisation, il existe donc des plugins pour les outils open source et les outils commerciaux disponibles:

  • Journald – stockage des journaux de conteneur dans le journal système
  • Pilote Syslog – prise en charge UDP, TCP, TLS
  • Fluentd – prise en charge des connexions TCP ou Unix à fluentd
  • Splunk – transfert HTTP/HTTPS vers le serveur Splunk
  • Transfert de journal Gelf–UDP vers Graylog2

Pour une solution complète de gestion des journaux, des outils supplémentaires doivent être impliqués:

  • Analyseur de journaux pour structurer les journaux, généralement une partie des expéditeurs de journaux (fluentd, rsyslog, logstash, logagent, …)
  • Indexation, visualisation et alerte des journaux:
    • Elasticsearch et Kibana (Pile élastique, également appelée pile ELK),
    • Splunk,
    • Logentries,
    • Loggly,
    • Sumologic,
    • Graylog OSS/Enterprise
    • Sematext Cloud / Enterprise
    • et bien d’autres encore …

Pour expédier les journaux à l’un des moteurs, vous devrez peut-être sélectionner un pilote de journalisation ou un outil de journalisation prenant en charge la solution de gestion des journaux de votre choix. Si votre outil a besoin d’une entrée Syslog, vous pouvez choisir le pilote Syslog.

1.La commande Docker logs fonctionne uniquement avec le pilote de journalisation de fichier json

Le pilote de journalisation par défaut « fichier json » écrit des journaux sur le disque local, et le pilote de fichier json est le seul qui fonctionne en parallèle à la commande « docker logs ». Dès que l’on utilise d’autres pilotes de journalisation, tels que Syslog, Gelf ou Splunk, les appels d’API Docker logs commencent à échouer et la commande « docker logs » affiche une erreur signalant les limitations au lieu d’afficher les journaux sur la console. Non seulement la commande docker log échoue, mais de nombreux autres outils utilisant l’API Docker pour les journaux, tels que les interfaces utilisateur Docker comme Portainer ou les conteneurs de collecte de journaux comme Logspout ne peuvent pas afficher les journaux du conteneur dans cette situation.

Voir ce problème.

Le pilote Docker Syslog peut bloquer le déploiement de conteneurs et perdre des journaux lorsque le serveur Syslog n’est pas accessible

L’utilisation du pilote Docker Syslog avec TCP ou TLS est un moyen fiable de fournir des journaux. Cependant, le pilote de journalisation Syslog nécessite une connexion TCP établie au serveur Syslog au démarrage d’un conteneur. Si cette connexion ne peut pas être établie au démarrage du conteneur, le démarrage du conteneur échoue avec un message d’erreur du type

docker : Réponse d’erreur du démon : Échec de l’initialisation de la journalisation pilote : composez tcp

Cela signifie qu’un problème de réseau temporaire ou une latence réseau élevée pourrait bloquer le déploiement des conteneurs. De plus, un redémarrage du serveur Syslog pourrait détruire tous les conteneurs se connectant via TCP / TS à un serveur Syslog central, ce qui est certainement la situation à éviter.

Voir ce problème.

3. Le pilote Docker syslog perd des journaux lorsque la destination est en panne

Similaire au problème ci-dessus, la perte de journaux est due à la capacité manquante des pilotes de journalisation Docker de mettre en mémoire tampon les journaux sur le disque lorsqu’ils ne peuvent pas être livrés à des destinations distantes. Voici une question intéressante à regarder.

4. Les pilotes de journalisation Docker ne prennent pas en charge les journaux multi-lignes comme les traces de pile d’erreurs

Lorsque nous parlons de journaux, la plupart des gens pensent à de simples journaux à une seule ligne, par exemple comme les journaux Nginx ou Apache. Cependant, les journaux peuvent également s’étendre sur plusieurs lignes. Par exemple, les traces d’exception couvrent généralement plusieurs lignes, donc pour aider les utilisateurs de Logstash, nous avons partagé comment gérer les traces de pile avec Logstash.

Les choses ne sont pas meilleures dans le monde des conteneurs, où les choses deviennent encore plus compliquées car les journaux de toutes les applications exécutées dans des conteneurs sont émis vers la même sortie – sortie standard. Pas étonnant de voir le numéro 22920 fermé par « Fermé. Je m’en fiche. »déçu tant de gens. Heureusement, il existe des outils tels que Sematext Docker Agent qui peuvent analyser les journaux multi-lignes dès la sortie de la boîte, ainsi que d’appliquer des modèles multi-lignes personnalisés.

La commande Docker service logs se bloque avec le pilote de journalisation non json

Bien que le pilote json-files semble robuste, d’autres pilotes de journal peuvent malheureusement encore causer des problèmes avec le mode Docker Swarm. Voir ce problème GitHub.

Le démon Docker se bloque si le démon fluentd a disparu et que le tampon est plein

Un autre scénario où un pilote de journalisation provoque des problèmes lorsque la destination distante n’est pas accessible — dans ce cas particulier, les pilotes de journalisation lèvent des exceptions qui provoquent le blocage du démon Docker.

Le conteneur Docker est bloqué dans l’état créé en cas d’échec du pilote Splunk

Si le serveur Splunk renvoie un 504 au démarrage du conteneur, le conteneur est réellement démarré, mais docker signale que le conteneur n’a pas pu démarrer. Une fois dans cet état, le conteneur n’apparaît plus sous docker ps et le processus de conteneur ne peut pas être arrêté avec docker kill. La seule façon d’arrêter le processus est de le tuer manuellement.

Voir ce problème.

Journaux Docker ignorant / manquant les journaux d’application (pilote journalier)

Il s’avère que ce problème est dû aux limites de débit journalier, qui doivent être augmentées car Docker crée des journaux pour toutes les applications en cours d’exécution et journald peut ignorer certains journaux en raison de ses paramètres de limitation de débit. Soyez donc conscient de vos paramètres journaliers lorsque vous y connectez Docker.

Problèmes du pilote Gelf

Il manque une option TCP ou TLS au pilote de journalisation Gelf et ne prend en charge que l’UDP, ce qui pourrait être risqué de perdre des messages de journalisation lorsque des paquets UDP sont largués. Certains problèmes signalent un problème de résolution DNS / mise en cache avec les pilotes GELF, de sorte que les journaux peuvent être envoyés à « Nirvana » lorsque l’IP de votre serveur Graylog change — et cela peut se produire rapidement en utilisant des déploiements de conteneurs.

Docker ne prend pas en charge plusieurs pilotes de journal

Il serait bien d’avoir des journaux stockés localement sur le serveur et la possibilité de les expédier vers des serveurs distants. Actuellement, Docker ne prend pas en charge plusieurs pilotes de journal, les utilisateurs sont donc obligés de choisir un seul pilote de journal. Pas une décision facile connaissant les divers problèmes énumérés dans cet article.

C’est tout! Ce sont mes 10 meilleurs pièges de journalisation Docker!

VOIR AUSSI: Livraison continue avec Jenkins & Sécurité Docker: Les avantages, les inconvénients et une mise à jour de statut

Alternatives aux pilotes de journal Docker

Avec tant de problèmes autour des pilotes de journal Docker, existe-t-il des alternatives? Il s’avère qu’il existe des expéditeurs de journaux basés sur l’API Docker à la rescousse!à la rescousse.

Voici quelques bonnes raisons d’envisager de telles alternatives:

  1. Le pilote de fichier Json est le pilote par défaut et fiable, une copie locale des journaux est toujours disponible et les appels de l’API Docker ET Docker pour les journaux fonctionnent.
  2. Possibilité de filtrer les journaux selon divers critères dynamiques tels que le nom d’image ou les étiquettes
  3. Meilleures métadonnées, ayant un accès complet à l’API Docker
  4. Aucun risque de planter le démon Docker car de tels expéditeurs de journaux pourraient s’exécuter dans un conteneur avec une utilisation limitée des ressources et une consommation d’espace disque (par exemple placez le répertoire tampon dans un volume et définissez des limites utiles)

Examinons deux outils de collecte de journaux basés sur l’API Docker recommandés: Logspout et Sematext Docker Agent. Les deux sont open source.

Veuillez noter qu’un troisième outil, qui s’inscrit plus ou moins dans cette catégorie est le Filebeat élastique. Filebeat collecte les fichiers journaux à partir desquels, générés par le pilote de journal de fichiers json, seul l’enrichissement des métadonnées du conteneur se fait via des appels d’API Docker.

Logspout fournit plusieurs sorties et peut acheminer les journaux de différents conteneurs vers différentes destinations sans modifier les paramètres de journalisation des conteneurs d’application. Il gère les séquences d’échappement ANSI (comme les codes de couleur dans les journaux), ce qui pourrait être problématique pour la recherche en texte intégral dans Elasticsearch.

Comme Logspout, Sematext Docker Agent (SDA) est basé sur une API, prend en charge le routage des journaux et gère les séquences d’échappement ANSI pour la recherche en texte intégral. Cependant, Sematext Docker Agent est en fait plus qu’un simple expéditeur de journaux.

SDA prend en charge de nombreux problèmes soulevés par les utilisateurs de Docker tels que les journaux multi-lignes, la détection du format de journal et l’analyse des journaux, les conteneurs d’enrichissement de métadonnées complets (étiquettes, métadonnées spécifiques geoip, Swarm et Kubernetes), la mise en mémoire tampon du disque et l’expédition fiable via TLS. Il est open source sur Github, peut être utilisé avec Elastic Stack ou Sematext Cloud et peut collecter non seulement des journaux de conteneur, mais également des événements de conteneur, ainsi que des métriques d’hôte et de conteneur Docker.

Différences entre trois solutions de journalisation qui fonctionnent bien avec le pilote de fichier json et l’API distante Docker

Recommandation

La recommandation claire pour les enregistreurs basés sur des API pourrait changer à l’avenir à mesure que les pilotes de journal Docker s’amélioreront au fil du temps et que le nouveau mécanisme de plug-in via un socket Unix permettra aux nouvelles implémentations de pilotes de journalisation de s’exécuter en tant que processus séparés. Cette fonctionnalité améliore vraiment l’architecture du plugin de journalisation des Dockers et est un bon signe que Docker prend les problèmes de journalisation au sérieux.

En attendant, envisagez des collecteurs de journaux basés sur l’API Docker tels que Sematext Docker Agent et Logspout pour éviter de rencontrer des problèmes avec les journaux Docker, comme les 10 pièges décrits ici.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.