Ingeniería

Monitoreo de Kubernetes al estilo de Elastic con Filebeat y Metricbeat

En el blog anterior, mostramos cómo usar Prometheus y Fluentd con el Elastic Stack para monitorear Kubernetes. Es una buena opción si ya usas esas herramientas de monitoreo basadas en open source en tu organización. Pero si eres nuevo en el monitoreo de Kubernetes o deseas aprovechar Elastic Observability al máximo, hay una forma más fácil e integral. En este blog, exploraremos cómo monitorear Kubernetes a la manera de Elastic: con Filebeat y Metricbeat.

Usar Filebeat y Metricbeat

Beats, como sabes, es una plataforma gratis y abierta dedica al envío de datos. Con Beats puedes transferir datos de cientos o miles de máquinas a Logstash o Elasticsearch.

Filebeat, que es conocido como un agente de logs ligero, también brinda soporte para una arquitectura en contenedores. Filebeat puede desplegarse en Docker, Kubernetes y entornos en el cloud, recopilar todos los flujos de logs y tomar metadatos, como contenedores, pods, nodos, entornos virtuales y hosts, y luego correlacionarlos directamente con los eventos de logs correspondientes. Metricbeat es un agente de métricas ligero que, como Filebeat, también brinda soporte para entornos en contenedores. En un entorno de Kubernetes, los contenedores se despliegan de forma dinámica como pods en nodos de trabajo disponibles. Esta "dinámica" es la clave, y Filebeat y Metricbeat tienen una característica útil llamada Autodiscover (Detección automática). Al ejecutar aplicaciones en contenedores, se convierten en objetivos móviles para los sistemas de monitoreo. Los proveedores de detección automática de Kubernetes de Filebeat y Metricbeat monitorean el inicio, la actualización y la detención de los nodos, los pods y los servicios de Kubernetes. Cuando Filebeat o Metricbeat detectan estos eventos, ponen a disposición los metadatos adecuados de cada evento. Además, según las anotaciones de los pods de Kubernetes iniciados, aplican la configuración adecuada a las métricas y los logs objetivo. La detección automática basada en sugerencias se explica en detalle en el blog anterior Detección automática con Beats basada en sugerencias de Docker y Kubernetes.

Monitoreo de arquitectura

Tal como en el blog anterior, desplegaremos una aplicación simple multicontenedor denominada Cloud-Voting-App en un cluster de Kubernetes y monitorearemos el entorno de Kubernetes, incluida dicha aplicación. Esta vez, explicaremos el procedimiento para recopilar logs usando Filebeat, recopilar métricas usando Metricbeat, ingestarlos directamente en Elasticsearch y monitorearlos usando Kibana. También veremos cómo obtener métricas personalizadas de Prometheus usando Elastic APM. La visión general de la arquitectura se muestra en la imagen a continuación. Además, el código para este tutorial está disponible en este repositorio de GitHub, consúltalo para ver el procedimiento completo.

introducir aquí una descripción de la imagen

Veamos cada uno de los pasos.

Desplegar Filebeat como DaemonSet

Solo se debe desplegar una instancia de Filebeat por nodo de Kubernetes. El manifiesto del DaemonSet ya está definido en el archivo elastic/filebeat-kubernetes.yaml, pero echemos un vistazo a la configuración relevante.

Primero, usa el proveedor de detección automática de Kubernetes a fin de configurar los ajustes de anotación de pods de las aplicaciones para que se ocupe de los logs. Como puedes ver, la configuración de Autodiscover (Detección automática) se define en la sección filebeat.autodiscover. Habilitamos las sugerencias y configuramos la ruta predeterminada para los logs de contenedores. Consulta la documentación de Filebeat para obtener más información sobre la configuración de Autodiscover (Descubrimiento automático) en Filebeat.

...
    # Para habilitar el descubrimiento automático basado en sugerencias, elimina la configuración de "filebeat.inputs" y quita el comentario de esto:
    filebeat.autodiscover:
      providers:
        - type: kubernetes
          node: ${NODE_NAME}
          hints.enabled: true
          hints.default_config:
            type: container
            paths:
              - /es/var/log/containers/*${data.kubernetes.container.id}.log
...

Además de lo anterior, lo único que debes hacer básicamente es agregar la URL y las credenciales de tu cluster de Elasticsearch.

...
     containers:
      - name: filebeat
        image: docker.elastic.co/beats/filebeat:7.13.0
        args: [
          "-c", "/es/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:
...

Desplegar kube-state-metrics

kube-state-metrics es un complemento de Kubernetes que monitorea los objetos almacenados en Kubernetes. kube-state-metrics se enfoca en identificar el estado de los objetos de Kubernetes desplegados en un cluster de Kubernetes. Por ejemplo, en un momento dado, cuántos pods hay desplegados en el cluster, cuáles son los CPU cores asignables en el cluster, cuántos trabajos fallaron, etc. kube-state-metrics no está desplegado en los clusters de Kubernetes de forma predeterminada, tendrás que desplegarlo tú. Hay un manifiesto de muestra de kube-state-metrics bajo examples/standard a modo de referencia. Consulta este repositorio de GitHub para obtener más información sobre kube-state-metrics.

Desplegar Metricbeat como DaemonSet

Solo se debe desplegar una instancia de Metricbeat por nodo de Kubernetes, similar a Filebeat. El manifiesto del DaemonSet ya está definido en el archivo elastic/metricbeat-kubernetes.yaml, pero es un poco más complejo que Filebeat. Veamos las configuraciones clave.

Las configuraciones de Autodiscover (Detección automática) se definen en la sección metricbeat.autodiscover. La primera configuración - type: kubernetes aplica a todo el cluster de Kubernetes. Aquí usamos el módulo de Kubernetes de Metricbeat para configurar las métricas para el cluster de Kubernetes completo. La primera configuración - module: kubernetes establece las métricas que obtenemos de kube-state-metrics antes mencionado. La segunda configuración - module: kubernetes es una configuración para monitorear el servidor de API de Kubernetes (kube-apiserver), que es la esencia del plano de control de Kubernetes que expone la API de Kubernetes. Consulta la documentación de Metricbeat para obtener más información sobre el módulo de 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: /es/var/run/secrets/kubernetes.io/serviceaccount/token
              ssl.certificate_authorities:
                - /es/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
              period: 30s

Además, se definen sugerencias para aprovechar el proveedor de detección automática de Kubernetes a fin de permitir el procesamiento de las métricas usando las configuraciones de anotación de pods de las aplicaciones. Consulta la documentación de Metricbeat para obtener más información sobre la configuración de Autodiscover (Descubrimiento automático) en Metricbeat.

    # Para permitir la detección automática basada en sugerencias, quita el comentario de esto:
    - type: kubernetes
      node: ${NODE_NAME}
      hints.enabled: true

Las siguientes configuraciones de ConfigMap son para nodo/sistema/pod/contenedor/volumen, que son el conjunto de métricas predeterminado del módulo de Kubernetes de Metricbeat. Estas métricas se toman del endpoint de kubelet de cada nodo.

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

Tal como en Filebeat, lo único que debes hacer es agregar la URL y las credenciales de tu cluster de Elasticsearch.

Desplegar la aplicación

Como en el blog anterior, desplegaremos Cloud-Voting-App. La interfaz de la aplicación se creó usando Python/Flask. El componente de datos usa Redis. Recuerda que la aplicación se instrumentó con el cliente de Python para Prometheus a fin de exponer las métricas personalizadas de Prometheus. ¿Cómo recopilamos las métricas personalizadas de Prometheus a pesar de la falta de Prometheus esta vez? A partir de la versión 7.12, podemos usar Elastic APM Agent para obtener métricas de Prometheus personalizadas.

Primero, la aplicación importa ElasticAPM y las variables de entorno se usan para la configuración de Elastic APM Agent. SERVICE_NAME es una cadena de caracteres arbitraria para identificar la aplicación, ENVIRONMENT es una cadena de caracteres arbitraria para identificar el entorno de la aplicación y SECRET_TOKEN y SERVER_URL son para comunicarse con el APM Server. Al final, PROMETHEUS_METRICS es un parámetro que indica si se obtendrá la métrica de prometheus_client.

from elasticapm.contrib.flask import ElasticAPM
...
app = Flask(__name__)
...
# Configuraciones de Elastic APM
app.config['ELASTIC_APM'] = {
# Configura el nombre de servicio obligatorio. Caracteres permitidos:
# a-z, A-Z, 0-9, -, _ y espacio.
'SERVICE_NAME': os.environ['SERVICE_NAME'],
#
# Úsala si el servidor APM requiere un token.
'SECRET_TOKEN': os.environ['SECRET_TOKEN'],
#
# Configura la URL personalizada de APM Server (predeterminada: http://localhost:8200).
'SERVER_URL': os.environ['SERVER_URL'],
#
# Configura el entorno.
'ENVIRONMENT': os.environ['ENVIRONMENT'],
#
# Configura prometheus_metrics.
'PROMETHEUS_METRICS': os.environ['PROMETHEUS_METRICS'],
}
apm = ElasticAPM(app)

El siguiente es el manifiesto para desplegar Cloud-Voting-App en un cluster de Kubernetes. El archivo correspondiente se encuentra en elastic/cloud-vote-all-in-one-redis-aks.yaml. En primer lugar, respecto a la interfaz de usuario cloud-vote-front, las variables requeridas para APM Agent antes mencionado están configuradas como variables de entorno en las especificaciones del contenedor. Aquí no hay especificadas anotaciones específicas del pod, por lo tanto, tanto las métricas como los logs se adquieren con la configuración predeterminada.

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"

Por otro lado, el backend, cloud-vote-redis usa annotations de pod para habilitar el módulo redis de Filebeat para logs y el módulo redis de Metricbeat para métricas, aplicando cualquier configuración necesaria. Mientras que cloute-vote-front usa la configuración predeterminada para recopilar logs y métricas con Beats, cloud-vote-back usa el módulo redis de Beats para recopilar logs y métricas. Además, configurando cómo recopilar logs y métricas en el manifiesto de la aplicación en lugar de en el manifiesto de Beats, puedes aislar las responsabilidades del equipo de desarrollo y el equipo de la plataforma de observabilidad.

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

Acceder a Kibana

Ahora ya desplegamos todos los componentes necesarios. Votemos algunas veces con Cloud-Voting-App y luego accedamos a Kibana.

Visión general de Observability

En primer lugar, cuando abres Elastic Observability en Kibana, las tasas de logs de las entradas de logs de Filebeat y el resumen de las entradas de métricas de Metricbeat se muestran sin que hagas nada. Este resultado se debe a que Filebeat y Metricbeat ingestan datos en formato ECS de forma predeterminada.

introducir aquí una descripción de la imagen

Logs

Los logs ingestados por Filebeat se almacenan en los índices filebeat-*. Puedes usar la app Logs en Kibana para buscar, filtrar y seguir el final de todos los logs recopilados en Elasticsearch. También puedes destacar cadenas específicas; por ejemplo, destacamos cloud-vote-front en el ejemplo siguiente.

introducir aquí una descripción de la imagen

Métricas

Las métricas ingestadas por Metricbeat se almacenan en los índices metricbeat-*. La app Metrics en Kibana proporciona una forma intuitiva y fácil de comprender de ver las métricas recopiladas en Elasticsearch. Con la vista Kubernetes Pods, como se muestra a continuación, se mapean los nodos y los pods de Kubernetes, y se muestra el uso de cada recurso.

introducir aquí una descripción de la imagen

También puedes hacer clic en un pod específico para saltar a otras apps, como rastreos de APM o logs de pod, preservando el contexto. Ten en cuenta que View details for kubernetes.pod.uid a47d81b1-02d7-481a-91d4-1db9fe82d7a7 se muestra en pantalla.

introducir aquí una descripción de la imagen

Luego puedes saltar a los logs de este pod haciendo clic en Kubernetes Pod logs. ¿Notaste que en la barra de búsqueda de la app Logs ya aparece kubernetes.pod.uid: a47d81b1-02d7-481a-91d4-1db9fe82d7a7? Al preservar el contexto de esta forma, Kibana puede transicionar de una app a otra sin problemas y devolver resultados relevantes al instante..

introducir aquí una descripción de la imagen

¿Qué sucedió con las métricas personalizadas de Prometheus? Las métricas personalizadas que mantiene el cliente de Python de Prometheus se escriben en índices denominados apm-* a través de Elastic APM Agent. Si compruebas con Kibana Discover, puedes ver que se recopilan en el campo prometheus.metrics.cloud_votes. La variable en la solicitud POST se almacena como labels.vote. Consulta la documentación de APM para obtener más información sobre recopilar métricas personalizadas de Prometheus con el agente Python de Elastic APM.

introducir aquí una descripción de la imagen

Puedes visualizar con facilidad los índices apm-* con Kibana Lens de la siguiente manera.

introducir aquí una descripción de la imagen

Dashboards predefinidos

Para el pod cloud-vote-back que usa Redis, habilitamos el módulo redis para Filebeat y Metricbeat. Esto también creará previamente dashboards listos para usar relacionados. Puedes visualizar de forma instantánea métricas y logs de Redis sin configuración adicional.

introducir aquí una descripción de la imagen introducir aquí una descripción de la imagen

Además, el dashboard de Kubernetes también está listo para usar, gracias al módulo de Kubernetes de Metricbeat.

introducir aquí una descripción de la imagen

Resumen

En este blog, vimos una forma más del estilo de Elastic de usar Filebeat y Metricbeat para ingresar logs y métricas al Elastic Stack a fin de monitorear Kubernetes. También vimos cómo usar Elastic APM Agent para obtener métricas personalizadas de Prometheus. Puedes comenzar a monitorear tus entornos de Kubernetes hoy registrándote para una prueba gratuita de Elastic Cloud o descargando el Elastic Stack y hospedándolo tú mismo. Elastic Observability permite un monitoreo más eficiente y efectivo. También se puede integrar con el machine learning de Elastic y las alertas de Kibana para establecer una observabilidad integral, procesable y sumamente automatizada. Si encuentras algún obstáculo o tienes preguntas, visita nuestros foros de debate; estamos aquí para ayudarte.

Mantente atento a un futuro blog de seguimiento con más formas de usar Elastic para monitorear Kubernetes.