Technique

Monitorer Kubernetes à la manière d'Elastic à l'aide de Filebeat et de Metricbeat

Dans mon précédent article de blog, je montrais comment utiliser Prometheus et Fluentd avec Elastic Stack pour monitorer Kubernetes. C'est une solution pertinente si vous employez déjà ces outils de monitoring open source dans votre organisation. Si, à l'inverse, vous découvrez tout juste le monitoring de Kubernetes, ou si vous souhaitez exploiter pleinement Elastic Observability, il existe un moyen plus simple et complet. Dans le présent article, nous verrons comment monitorer Kubernetes à la manière d'Elastic, c'est-à-dire à l'aide de Filebeat et de Metricbeat.

À l'aide de Filebeat et de Metricbeat

Comme vous le savez, Beats est une plate-forme ouverte et gratuite, dédiée au transfert de données. Beats vous permet de transférer des centaines, voire des milliers de machines et de systèmes vers Logstash et Elasticsearch.

Filebeat, un agent de transfert de log léger, prend aussi en charge une architecture conteneurisée. Filebeat peut également être déployé dans des environnements Docker, Kubernetes et cloud, collectant alors tous les flux de données et récupérant des métadonnées telles que des conteneurs, des pods, des nœuds et des environnements virtuels. Cet outil les héberge et les met automatiquement en corrélation avec les événements de log. [Metricbeat] (https://www.elastic.co/fr/beats/metricbeat) est un agent de transfert d'indicateur léger qui, à l'instar de Filebeat, prend en charge des environnements conteneurisés. Dans un environnement Kubernetes, les conteneurs sont déployés de manière dynamique comme pods sur des nœuds de travail. Cette "dynamique" est la clé, et Filebeat ainsi que Metricbeat sont dotés d'une fonctionnalité bien pratique, Autodiscover. Quand vous exécutez des applications dans des conteneurs, elles deviennent des cibles en mouvement pour les systèmes de monitoring. Les Kubernetes Autodiscover Providers de Filebeat et de Metricbeat monitorent le lancement, la mise à jour et l'arrêt et des nœuds, pods et services Kubernetes. Quand Filebeat ou Metricbeat détectent ces événements, ils rendent les métadonnées associées disponibles concernant chaque événement. De plus, en fonction des annotations des pods Kubernetes lancés, ils appliquent les paramètres adéquats aux logs et indicateurs cibles. Autodiscover, basé sur les indices, est expliqué en détail dans notre article de blog précédent Fonction Autodiscover fondée sur les indices, compatible avec Docker et Kubernetes, dans Beats.

Architecture de monitoring

Comme dans l'article précédent, nous déploierons une application simple et multi-conteneurs, appelée Cloud-Voting-App, dans un cluster Kubernetes et monitorerons l'environnement Kubernetes comprenant cette application. Cette fois-ci, j'expliquerai la procédure de collecte de logs à l'aide de Filebeat, de collecte d'indicateurs à l'aide de Metricbeat, de leur ingestion directe dans Elasticsearch et de leur monitoring à l'aide de Kibana. J'aborderai aussi la manière d'obtenir des indicateurs Prometheus personnalisés à l'aide de l'APM Elastic. L'architecture globale est illustrée ci-dessous. Et le code pour ce tutoriel est disponible dans mon référentiel GitHub : merci de vous y reporter pour connaître l'intégralité de la procédure.

saisir la description de l'image ici

Voyons maintenant chacune des étapes.

Déploiement de Filebeat comme un DaemonSet

Il convient de déployer une seule instance de Filebeat par nœud Kubernetes. Le manifeste du DaemonSet est déjà défini dans le fichier "elastic/filebeat-kubernetes.yaml", mais examinons les paramètres pertinents.

D'abord, utilisez le Kubernetes Autodiscover Provider pour configurer les paramètres d'annotation du pod d'application en vue de traiter les logs. Comme vous pouvez le voir, les paramètres Autodiscover sont définis dans la section "filebeat.autodiscover". J'ai activé les indices et réglé le chemin par défaut pour les logs de conteneur. Merci de vous reporter à la documentation Filebeat pour plus d'informations sur la configuration d'Autodiscover pour Filebeat.

...
    # To enable hints based autodiscover, remove `filebeat.inputs` configuration and uncomment this:
    filebeat.autodiscover:
      providers:
        - type: kubernetes
          node: ${NODE_NAME}
          hints.enabled: true
          hints.default_config:
            type: container
            paths:
              - /fr/var/log/containers/*${data.kubernetes.container.id}.log
...

En plus des étapes ci-dessus, tout ce que vous devez faire consiste essentiellement à ajouter l'URL et les identifiants pour votre cluster Elasticsearch.

...
     containers:
      - name: filebeat
        image: docker.elastic.co/beats/filebeat:7.13.0
        args: [
          "-c", "/fr/etc/filebeat.yml",
          "-e",
        ]
        env:
        - name: ELASTICSEARCH_HOST
          value: elasticsearch
        - name: ELASTICSEARCH_PORT
          value: "9200"
        - name: ELASTICSEARCH_USERNAME
          value: elastic
        - name: ELASTICSEARCH_PASSWORD
          value: changeme
        - name: ELASTIC_CLOUD_ID
          value:
        - name: ELASTIC_CLOUD_AUTH
          value:
...

Déploiement de kube-state-metrics

kube-state-metrics est un module complémentaire Kubernetes qui monitore les objets stockés dans ce dernier. kube-state-metrics cible l'identification de la condition des objets Kubernetes déployés dans un cluster Kubernetes. Par exemple, à un moment donné, le nombre de pods déployés dans le cluster, les cœurs de processeur pouvant être attribués dans le cluster, le nombre de tâches qui ont échoué, etc. kube-state-metrics n'est pas déployé dans les clusters Kubernetes par défaut, c'est pourquoi vous devrez le faire. Un exemple de manifeste est à votre disposition dans "examples:standard" pour référence. Merci de vous reporter à ce référentiel GitHub pour plus d'informations sur kube-state-metrics.

Déploiement de Metricbeat comme un DaemonSet

Il convient de déployer une seule instance de Metricbeat par nœud Kubernetes, comme pour Filebeat. Le manifeste du DaemonSet est déjà défini dans le fichier "elastic/metricbeat-kubernetes.yaml", mais il est un peu plus complexe que pour Filebeat. Regardons les paramètres clés.

Les paramètres d'Autodiscover sont définis dans la section "metricbeat.autodiscover". Le premier paramètre "- type: kubernetes" concerne l'intégralité du cluster Kubernetes. Ici, nous utilisons le module Kubernetes de Metricbeat en vue de configurer les indicateurs pour l'intégralité du cluster Kubernetes. La première configuration "- module: kubernetes" définit les indicateurs que nous obtenons à partir de kube-state-metrics dont il est fait mention ci-dessus. La seconde configuration "- module: kubernetes" sert à monitorer le server API Kubernetes (kube-apiserver), qui est au cœur du plan de contrôle qui présente l'API Kubernetes. Merci de vous reporter à la documentation Metricbeat pour plus d'informations sur le module Kubernetes de Metricbeat.

metricbeat.autodiscover:
  providers:
    - type: kubernetes
      scope: cluster
      node: ${NODE_NAME}
      unique: true
      templates:
        - config:
            - module: kubernetes
              hosts: ["kube-state-metrics:8080"]
              period: 10s
              add_metadata: true
              metricsets:
                - state_node
                - state_deployment
                - state_daemonset
                - state_replicaset
                - state_pod
                - state_container
                - state_cronjob
                - state_resourcequota
                - state_statefulset
                - state_service
            - module: kubernetes
              metricsets:
                - apiserver
              hosts: ["https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}"]
              bearer_token_file: /fr/var/run/secrets/kubernetes.io/serviceaccount/token
              ssl.certificate_authorities:
                - /fr/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
              period: 30s

Par ailleurs, les indices sont définis de manière à exploiter le Kubernetes Autodiscover Provider afin d'activer le traitement des indicateurs à l'aide des paramètres d'annotation de pod d'application. Merci de vous reporter à la documentation Metricbeat pour plus d'informations sur la configuration d'Autodiscover pour Metricbeat.

    # To enable hints based autodiscover uncomment this:
    - type: kubernetes
      node: ${NODE_NAME}
      hints.enabled: true

Les paramètres ConfigMap suivants sont pour le nœud/ système/pod/conteneur/volume, et correspondent à l'ensemble d'indicateurs par défaut du module Kubernetes de Metricbeat. Ces indicateurs sont extraits du point de terminaison kubelet de chaque nœud.

kubernetes.yml: |-
  - module: kubernetes
    metricsets:
      - node
      - system
      - pod
      - container
      - volume
    period: 10s
    host: ${NODE_NAME}
    hosts: ["https://${NODE_NAME}:10250"]
    bearer_token_file: /fr/var/run/secrets/kubernetes.io/serviceaccount/token
    ssl.verification_mode: "none"

Comme pour Filebeat, en plus des étapes ci-dessus, tout ce que vous devez faire consiste essentiellement à ajouter l'URL et les identifiants pour votre cluster Elasticsearch.

Déploiement de l'application

Comme dans l'article précédent, nous déploierons Cloud-Voting-App. L'interface d'application a été créée à l'aide de Python/Flask. La composante de données utilise Redis. Rappelez-vous que l'application a été instrumentée avec le client Python Prometheus pour présenter les indicateurs personnalisés Prometheus. Comment collecter les indicateurs personnalisés Prometheus malgré l'absence de Prometheus cette fois-ci ? À partir de la version 7.12, nous pouvons utiliser l'agent APM Elastic pour obtenir des indicateurs personnalisés Prometheus !

D'abord, l'application importe "ElasticAPM" et les variables d'environnement sont utilisées pour les paramètres de l'agent APM Elastic. "SERVICE_NAME" est une chaîne de caractères arbitraire pour l'identification de l'application, "ENVIRONMENT" en est une pour l'identification de l'environnement d'application, tandis que "SECRET_TOKEN" et "SERVER_URL" servent à communiquer avec votre serveur d'APM. Le "PROMETHEUS_METRICS" final est un paramètre indiquant s'il faut obtenir l'indicateur depuis prometheus_client.

from elasticapm.contrib.flask import ElasticAPM
...
app = Flask(__name__)
...
# Elastic APM Configurations
app.config['ELASTIC_APM'] = {
# Set required service name. Allowed characters:
# a-z, A-Z, 0-9, -, _, and space
'SERVICE_NAME': os.environ['SERVICE_NAME'],
#
# Use if APM Server requires a token
'SECRET_TOKEN': os.environ['SECRET_TOKEN'],
#
# Set custom APM Server URL (default: http://localhost:8200)
'SERVER_URL': os.environ['SERVER_URL'],
#
# Set environment
'ENVIRONMENT': os.environ['ENVIRONMENT'],
#
# Set prometheus_metrics
'PROMETHEUS_METRICS': os.environ['PROMETHEUS_METRICS'],
}
apm = ElasticAPM(app)

Voici le Manifeste de déploiement de Cloud-Voting-App dans un cluster Kubernetes. Le fichier correspondant se situe ici : "elastic/cloud-vote-all-in-one-redis-aks.yaml". Pour commencer, concernant l'interface utilisateur "cloud-vote-front", les variables requises pour l'agent APM mentionné ci-dessus sont définies comme variables environnementales dans les spécifications de conteneur. Ici, aucune annotation spécifique aux pods n'est indiquée, c'est pourquoi les logs et les indicateurs sont tous acquis à l'aide des paramètres par défaut.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cloud-vote-front
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cloud-vote-front
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: cloud-vote-front
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": linux
      containers:
      - name: cloud-vote-front
        image: your image name
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 250m
          limits:
            cpu: 500m
        env:
        - name: REDIS
          value: "cloud-vote-back"
        - name: SERVICE_NAME
          value: "cloud-voting"
        - name: SECRET_TOKEN
          value: "APM Server secret token"
        - name: SERVER_URL
          value: "APM Server URL"
        - name: ENVIRONMENT:
          value: "Production"
        - name: PROMETHEUS_METRICS
          value: "True"

D'un autre côté, le back-end, "cloud-vote-redis", utilise des "annotations" de pod afin d'activer le module Redis Filebeat pour les logs et le module Redis Metricbeat pour les indicateurs, en appliquant tous les paramètres nécessaires. Tandis que cloud-vote-front utilise les paramètres par défaut pour collecter les logs et les indicateurs avec Beats, cloud-vote-back utilise le module Redis de Beats pour collecter les logs et les indicateurs. Aussi, en configurant la manière de collecter les logs et les indicateurs dans le manifeste de l'application au lieu du manifeste de Beats, vous pouvez séparer les responsabilités entre l'équipe de développement et l'équipe de plateforme Observability.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cloud-vote-back
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cloud-vote-back
  template:
    metadata:
      labels:
        app: cloud-vote-back
      annotations:
        co.elastic.logs/enabled: "true"
        co.elastic.logs/module: redis
        co.elastic.logs/fileset.stdout: log
        co.elastic.metrics/enabled: "true"
        co.elastic.metrics/module: redis
        co.elastic.metrics/hosts: "${data.host}:6379"
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": linux
      containers:
      - name: cloud-vote-back
        image: redis
        ports:
        - containerPort: 6379
          name: redis

Accès à Kibana

Nous avons maintenant déployé toutes les composantes requises. Votons quelques fois avec Cloud-Voting-App, puis accédons à Kibana.

Présentation d'Observability

Tout d'abord, quand vous ouvrez Elastic Observability dans Kibana, les taux de log des entrées de log issues de Filebeat et le résumé des entrées d'indicateur issues de Metricbeat s'affichent sans que vous ayez à faire quoi ce soit. Cela est dû au fait que Filebeat et Metricbeat ingèrent des données au format ECS par défaut.

saisir la description de l'image ici

Logs

Les logs ingérés par Filebeat sont stockés dans les index filebeat-*. Vous pouvez utiliser l'application Logs sur Kibana pour rechercher, filtrer et suivre tous les fichiers collectés dans Elasticsearch. Vous pouvez également surligner des chaînes spécifiques. Par exemple, nous avons surligné cloud-vote-front dans l'exemple ci-dessous.

saisir la description de l'image ici

Indicateurs

Les indicateurs ingérés par Metricbeat sont stockés dans les index metricbeat-*. L'application Metrics dans Kibana offre un moyen intuitif et facile à comprendre pour afficher les indicateurs collectés dans Elasticsearch. La vue "Kubernetes Pods", comme illustré ci-dessous, permet de cartographier les nœuds et pods Kubernetes, et d'afficher l'utilisation de chaque ressource.

saisir la description de l'image ici

Par ailleurs, vous pouvez cliquer sur un pod précis pour passer à d'autres applications telles que les logs de pod ou les traces d'APM, tout en préservant le contexte. Notez que "View details for kubernetes.pod.uid a47d81b1-02d7-481a-91d4-1db9fe82d7a7" s'affiche à l'écran.

saisir la description de l'image ici

Vous pouvez alors accéder aux logs de ce pod en cliquant sur "Kubernetes Pods logs". Avez-vous remarqué que la barre de recherche dans l'application Logs était déjà remplie par "kubernetes.pod.uid: a47d81b1-02d7-481a-91d4-1db9fe82d7a7" ? En préservant le contexte de cette façon, Kibana peut passer d'application en application en toute fluidité et proposer immédiatement les résultats pertinents.

saisir la description de l'image ici

Que sont devenus les indicateurs personnalisés Prometheus ? Les indicateurs personnalisés détenus par le client Python Prometheus sont écrits dans des index appelés apm-* via l'agent APM Elastic. Si vous vérifiez dans Kibana Discover, vous les verrez collectés dans le champ "prometheus.metrics.cloud_votes". La variable dans la demande POST est stockée comme "labels.vote". Merci de vous reporter à la documentation APM pour plus d'informations sur la collecte d'indicateurs personnalisés Prometheus à l'aide de l'agent APM Elastic Python.

saisir la description de l'image ici

Vous pouvez facilement visualiser les index apm-* avec Kibana Lens comme suit.

saisir la description de l'image ici

Tableaux de bord prédéfinis

Pour le pod "cloud-vote-back" à l'aide de Redis, nous avons activé le module Redis pour Filebeat et Metricbeat. Cela entraînera aussi la création préalable des tableaux de bord associés, prêts à l'emploi. Vous pouvez visualiser instantanément les logs et indicateurs Redis sans configuration supplémentaire.

saisir la description de l'image ici saisir la description de l'image ici

De plus, le tableau de bord Kubernetes est prêt à l'emploi grâce au module Kubernetes de Metricbeat.

saisir la description de l'image ici

Récapitulons

Dans cet article, nous avons traité de l'utilisation de Filebeat et de Metricbeat à la manière d'Elastic, dans le but de remplir Elastic Stack par des logs et des indicateurs permettant de monitorer Kubernetes. Nous avons également vu comment utiliser l'agent APM Elastic pour obtenir des indicateurs personnalisés Prometheus. Vous pouvez commencer à monitorer vos environnements Kubernetes en vous inscrivant à un essai gratuit d'Elastic Cloud ou en téléchargeant Elastic Stack et en l'hébergeant vous-même. Elastic Observability offre un monitoring plus efficace et rentable. Il est également possible de l'intégrer au machine learning Elastic et à l'alerting Kibana afin de mettre en place une observabilité hautement automatisée, exploitable et complète. Si vous rencontrez des difficultés ou si vous avez des questions, allez dans nos forums de discussion, nous sommes là pour vous aider.

Dans un futur article complémentaire, vous découvrirez d'autres manières d'employer Elastic pour monitorer Kubernetes.