GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Déployer une pile EFK avec Docker

La surveillance et l'analyse des journaux sont devenues critiques de nos jours, que ce soit pour les applications ou l'infrastructure de serveurs/conteneurs. L'une des piles logicielles les plus populaires pour l'analyse et la surveillance des journaux que vous pouvez choisir est Elasticsearch, Fluentd et Kibana (pile EFK).

EFK stack est un moteur de recherche distribué et évolutif qui permet une recherche et une analyse structurées. Et dans ce didacticiel, vous apprendrez à configurer la surveillance des journaux de pile EFK avec Docker et à centraliser les journaux de conteneurs dans la pile EFK.

Prêt? Continuez à lire et facilitez votre analyse de log !

Prérequis

Ce didacticiel comprend des démonstrations pratiques. Pour suivre, assurez-vous d'avoir les éléments suivants :

  • Un hôte Linux :cet exemple utilise le serveur Debian 11 Bullseye avec une capacité de mémoire de 6 Go.
  • Un Docker CE (Community Edition) et Docker Compose installés sur votre hôte Linux.

Configuration d'un projet EFK Stack

EFK Stack est une infrastructure d'agrégation et d'analyse de journaux prête pour l'entreprise pour les infrastructures bare metal et de conteneurs. Mais avant de déployer une pile EFK, vous devez d'abord configurer un répertoire de projet et créer une configuration Docker pour déployer EFK Stack sur votre hôte Docker.

Pour cet exemple, vous utiliserez des images Docker avec les spécifications suivantes :

  • Elasticsearch 7.17.0 – Capable de stocker des données avec des fonctionnalités de recherche rapides basées sur Apache Lucene
  • Kibana 7.17.0 :agrégation et collecteur de données open source prenant en charge les données JSON, et
  • Image personnalisée Fluentd basée sur la version 1.14.1 – Logiciel de visualisation de données pour Elasticsearch.

Pour configurer votre projet de pile EFK :

1. Ouvrez un terminal et connectez-vous à votre serveur.

2. Exécutez les commandes ci-dessous pour vérifier que Docker et Docker Compose sont installés sur votre système.

# Checking Docker version
docker --version

# Checking docker-compose version
docker-compose version

Comme vous le voyez ci-dessous, les versions installées de Docker CE (Community Edition) v20.10.12 et Docker Compose v1.29.2.

3. Exécutez la commande suivante pour créer un nouveau répertoire de projet (mkdir ) et définissez-le comme répertoire de travail (cd ).

Vous pouvez nommer le répertoire comme vous le souhaitez, mais dans ce didacticiel, le répertoire est nommé efk. Ce répertoire stockera tous les fichiers de configuration EFK Stack de ce didacticiel.

mkdir -p ~/efk; cd ~/efk

4. Maintenant, créez un nouveau fichier de configuration (docker-compose.yml ) à l'aide de votre éditeur préféré et remplissez les configurations suivantes.

La configuration ci-dessous utilise le script Docker Compose v3 et définit tous les conteneurs de pile EFK.

version: "3"

# Define the Docker volume named esdata for the Elasticsearch container.
volumes:
  esdata:

# Deploying three container services (fluentd, elasticsearch, and kibana)
services:
	# Deploy using the custom image automatically be created during the build process.
  fluentd: 
    build: ./fluentd
    links: # Sends incoming logs to the elasticsearch container.
      - elasticsearch
    depends_on:
      - elasticsearch
    ports: # Exposes the port 24224 on both TCP and UDP protocol for log aggregation
      - 24224:24224
      - 24224:24224/udp

	# Created using the Docker image elasticsearch:7.17.0
  elasticsearch:
    image: elasticsearch:7.17.0
    expose: # Exposes the default port 9200
      - 9200
    environment:
      - discovery.type=single-node # Runs as a single-node
    volumes: # Stores elasticsearch data locally on the esdata Docker volume
      - esdata:/usr/share/elasticsearch/data

	# Created using the Docker image kibana:7.17.0
  kibana:
    image: kibana:7.17.0
    links: # Links kibana service to the elasticsearch container
      - elasticsearch
    depends_on:
      - elasticsearch
    ports: # Runs kibana service on default port 5601
      - 5601:5601
    environment: # Defined host configuration
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200

5. Exécutez la commande ci-dessous pour créer un nouveau répertoire fluentd et accédez à ce répertoire. Le fluentd répertoire stockera fluentd configuration des services.

mkdir -p fluentd/; cd fluentd/

6. Dans ~/efk/fluentd répertoire, créez un nouveau Dockerfile en utilisant votre éditeur préféré et remplissez la configuration suivante.

Cette configuration crée l'image personnalisée fluentd contenant le pilote client elasticsearch et le fluentd-plugin-elasticsearch.

Assurez-vous d'utiliser la même version entre elasticsearch et le pilote client elasticsearch — ce tutoriel utilise la version 7.17.0.

# image based on fluentd v1.14-1
FROM fluentd:v1.14-1

# Use root account to use apk
USER root

# below RUN includes plugin as examples elasticsearch is not required# you may customize including plugins as you wish
RUN apk add --no-cache --update --virtual .build-deps \
        sudo build-base ruby-dev \
&& gem uninstall -I elasticsearch \
&& gem install elasticsearch -v 7.17.0 \
&& sudo gem install fluent-plugin-elasticsearch \
&& sudo gem sources --clear-all \
&& apk del .build-deps \
&& rm -rf /tmp/* /var/tmp/* /usr/lib/ruby/gems/*/cache/*.gem

# copy fluentd configuration from host image
COPY ./conf/fluent.conf /fluentd/etc/
# copy binary start file
COPY entrypoint.sh /bin/

RUN chmod +x /bin/entrypoint.sh

USER fluent

7. Ensuite, créez un autre fichier de configuration (entrypoint.sh ) à l'aide de votre éditeur préféré et remplissez la configuration suivante. Ce script s'exécute lorsque le fluentd le service de conteneur démarre.

Vous trouverez ci-dessous le script de démarrage du service de conteneur fluentd, qui exécute la commande de base fluentd –config /fluentd/etc/fluentd.conf –plugin /etc/fluentd/plugins.

#!/bin/sh

#source vars if file exists
DEFAULT=/etc/default/fluentd

if [ -r $DEFAULT ]; then
    set -o allexport
    . $DEFAULT
    set +o allexport
fi

# If the user has supplied only arguments append them to `fluentd` commandif [ "${1#-}" != "$1" ]; then
    set -- fluentd "[email protected]"
fi

# If user does not supply config file or plugins, use the defaultif [ "$1" = "fluentd" ]; then
    if ! echo [email protected] | grep -e ' \-c' -e ' \-\-config' ; then
      set -- "[email protected]" --config /fluentd/etc/${FLUENTD_CONF}
    fi

    if ! echo [email protected] | grep -e ' \-p' -e ' \-\-plugin' ; then
      set -- "[email protected]" --plugin /fluentd/plugins
    fi
fi

8. Exécutez la commande ci-dessous pour créer un nouveau répertoire conf sous ~/efk/fluentd annuaire.

mkdir -p conf

9. Maintenant, créez une configuration fluentd (conf/fluentd.conf ) à l'aide de votre éditeur préféré et remplissez la configuration suivante.

Cette configuration permet au service de conteneur fluentd de recevoir des messages de journal et de les transmettre au service de conteneur elasticsearch.

# bind fluentd on IP 0.0.0.0
# port 24224
<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

# sendlog to the elasticsearch
# the host must match to the elasticsearch
# container service
<match *.**>
  @type copy
  <store>
    @type elasticsearch
    host elasticsearch
    port 9200
    logstash_format true
    logstash_prefix fluentd
    logstash_dateformat %Y%m%d
    include_tag_key true
    type_name access_log
    tag_key @log_name
    flush_interval 300s
  </store>
  <store>
    @type stdout
  </store>
</match>

10. Enfin, exécutez les commandes ci-dessous pour vérifier la structure du répertoire du projet EFK Stack.

Si vous n'avez pas la commande tree, installez-la à l'aide de la commande suivante :apt install tree -y

# Checking list of files and directory
ls

# Checking directory structure
tree

Vous trouverez ci-dessous la structure complète du répertoire du projet EFK Stack.

Déployer la pile EFK avec Docker

Vous avez maintenant créé tous les fichiers de configuration pour déployer EFK Stack à l'aide de Docker et Docker Compose. L'étape suivante consiste à déployer la pile EFK à l'aide de docker-compose commande, et le déploiement se fera dans votre répertoire de projet (~/efk ).

1. Tout d'abord, exécutez la commande ci-dessous pour changer le répertoire de travail en efk répertoire du projet.

cd ~/efk/

2. Ensuite, exécutez le docker-compose commande ci-dessous pour déployer (up ) le système d'analyse et de surveillance des journaux EFK Stack.

Cette commande télécharge automatiquement les images Docker Elasticsearch et Kibana. Et l'image Fluentd Docker se construit automatiquement à l'aide du Dockerfile dans le fluentd répertoire.

Le déploiement peut prendre un certain temps, selon les spécifications de l'hôte Docker.

docker-compose up -d

Vous trouverez ci-dessous la capture d'écran du processus de génération de l'image Fluentd Docker.

Et ci-dessous, la capture d'écran montrant que le déploiement est terminé et que le service de conteneur Kibana est en cours d'exécution.

3. Exécutez chaque commande ci-dessous pour vérifier les journaux du processus de génération de la pile EFK. Exécutez toujours ces commandes chaque fois que vous obtenez une erreur dans le processus de déploiement.

# Checking logs for service fluentd
docker-compose logs fluentd

# Checking logs for service kibana
docker-compose logs kibana

Vous trouverez ci-dessous le message du journal lorsque le service de conteneur fluentd est en cours d'exécution.

Et ci-dessous se trouve le journal du conteneur kibana.

4. Maintenant, exécutez la commande ci-dessous pour vérifier l'état de tous les services de conteneur (ps ).

docker-compose ps

Comme vous le voyez ci-dessous, le service de conteneur EFK Stack est Up. Notez le nom du conteneur elasticsearch (efk_elasticsearch_1) pour vérifier davantage que le conteneur fonctionne correctement à l'étape suivante.

5. De plus, exécutez la commande ci-dessous pour vérifier le service de conteneur elasticsearch. Cette commande imprime les paramètres détaillés du efk_elasticsearch_1 récipient.

docker inspect efk_elasticsearch_1

Comme vous pouvez le voir ci-dessous, le conteneur efk_elasticsearch_1 obtient une adresse IP de 172.18.0.2.

6. Enfin, exécutez la commande ci-dessous pour accéder et vérifier le conteneur elasticsearch par adresse IP (172.18.0.2 ). Port 9200 est le port par défaut du conteneur elasticsearch.

curl 172.18.0.2:9200

Vous verrez une sortie similaire à celle ci-dessous si le conteneur elasticsearch sur votre machine est en cours d'exécution.

Configuration du modèle d'index Kibana

Maintenant que vous avez terminé le déploiement de la pile EFK dans l'environnement Docker, vous allez ouvrir Kibana à partir de votre navigateur Web. Vous allez configurer un modèle d'index pour la surveillance et l'analyse des journaux.

1. Ouvrez votre navigateur Web préféré et accédez à l'adresse IP du serveur suivie du port de service Kibana 5601 (c'est-à-dire http://172.16.1.10:5601).

2. Ensuite, cliquez sur Explorer par moi-même sur la page d'accueil ci-dessous.

3. Cliquez sur Gestion de la pile option pour configurer le modèle d'index Kibana dans la section Gestion.

4. Sur le Kibana section de menu de gauche, cliquez sur le menu Modèles d'index et cliquez sur Créer un modèle d'index bouton pour créer un nouveau modèle d'index.

5. Maintenant, saisissez le modèle d'index Nom comme fluentd- *, définissez le champ Horodatage à @timestamp , puis cliquez sur Créer un modèle d'index pour confirmer les réglages du modèle d'index.

Sur le côté droit, vous pouvez voir les modèles d'index disponibles à partir de fluentd tels que fluentd-%Y%m%d. Le format de date %Y%m%d est basé sur la configuration de fluentd (fluentd.conf ).

6. Enfin, cliquez sur le menu en haut à gauche (points de suspension), puis cliquez sur Découvrir menu pour afficher la surveillance des journaux.

Vous trouverez ci-dessous la capture d'écran du tableau de bord de surveillance et d'analyse des journaux Kibana. Tous les journaux répertoriés sont extraits d'Elasticsearch et expédiés par l'agrégation de journaux Fluentd.

Exécuter un conteneur Docker avec le pilote de journal Fluentd

Après avoir configuré le modèle d'index Kibana, vous exécuterez un conteneur Docker avec le lecteur de journaux Fluentd, envoyant automatiquement les journaux à la pile EFK.

1. Exécutez la commande ci-dessous pour télécharger l'image NGINX. L'alpine version est plus petite que les images normales basées sur Ubuntu, CentOS ou Fedora.

docker pull nginx:alpine

2. Ensuite, exécutez la commande ci-dessous pour démarrer un nouveau conteneur NGINX (nginx_container ) en mode détaché (-d ).

La commande définit également le lecteur de journal sur Fluentd (–log-driver=fluentd) et expose le port 8080 sur la machine hôte Docker pour le conteneur (nginx_container).

docker run --name nginx_container -d --log-driver=fluentd -p 8080:80 nginx:alpine

3. Après avoir exécuté le conteneur, exécutez le docker commande ci-dessous pour vérifier tous les conteneurs en cours d'exécution.

docker ps

Vous devriez voir que le nginx_container est opérationnel sur le port hôte 8080.

4. Maintenant, exécutez la commande ci-dessous pour accéder au nginx_container et générer des journaux d'accès.

curl localhost:8080

Vous pouvez également ouvrir un nouvel onglet sur votre navigateur Web et saisir l'adresse IP du serveur suivie du port 8080 (c'est-à-dire http://172.168.1.10:8080).

Si tout se passe bien, vous verrez la valeur par défaut index.html page du nginx_container.

5. Enfin, revenez au tableau de bord Kibana et cliquez sur Découvrir menu sur le côté gauche.

Cliquez sur la requête container_name :nginx_container dans le champ KQL (Kibana Query Language) et vous verrez les journaux de nginx_container, comme indiqué ci-dessous.

Conclusion

Vous avez appris à déployer EFK Stack (Elasticsearch, Fluentd et Kibana) tout au long de ce didacticiel pour la surveillance et l'analyse des journaux à l'aide de Docker. Vous avez également appris à configurer la journalisation pour le conteneur Docker à l'aide du pilote de journal Fluentd. Et à ce stade, vous disposez maintenant d'une surveillance des journaux entièrement fonctionnelle pour les applications et les services.

Pour la prochaine étape, vous pourriez être intéressé par l'utilisation de KQL (Kibana Query Language) pour visualiser la surveillance et l'analyse des journaux.


Docker
  1. Installer ModSecurity avec Apache dans un conteneur Docker

  2. Installer le serveur VPN Wireguard avec Docker

  3. Configurer Nextcloud avec Redis à l'aide de Docker

  4. Comment installer Jenkins avec Docker

  5. Comment déployer des microservices avec Docker

Comment remplacer Docker par Podman sur un Mac

Installer Portainer avec Docker sur Ubuntu

Utilisez Docker avec cette solution de didacticiel MERN Stack

Déployer une pile EFK avec Docker

Déploiement de Talkyard Forum sous Nginx avec Docker

Déploiement du système de commentaires Isso sous Nginx avec Docker