Engenharia

Monitoramento do Kubernetes no estilo Elastic com o Filebeat e o Metricbeat

Em minha postagem anterior no blog, demonstrei como usar o Prometheus e o Fluentd com o Elastic Stack para monitorar o Kubernetes. Essa é uma boa opção se você já estiver usando essas ferramentas de monitoramento baseadas em código aberto na sua organização. No entanto, se você for novo no monitoramento do Kubernetes ou quiser aproveitar ao máximo o Elastic Observability, há uma maneira mais fácil e abrangente. Neste blog, explicaremos como monitorar o Kubernetes no estilo da Elastic: usando o Filebeat e o Metricbeat.

Com o Filebeat e Metricbeat

O Beats é uma plataforma gratuita e aberta dedicada ao envio de dados. Com o Beats, você pode transferir dados de centenas ou milhares de computadores para o Logstash ou o Elasticsearch.

O Filebeat, conhecido como um agente lightweight de log, também dá suporte à arquitetura em containers. O Filebeat pode ser implantado no Docker, no Kubernetes e em ambientes de nuvem, coletando todos os fluxos de log, além de buscar metadados, como containers, pods, nós, ambientes virtuais e hosts e correlacioná-los automaticamente aos eventos de log correspondentes. O Metricbeat é um agente lightweight de métricas que, como o Filebeat, também dá suporte a ambientes em containers. Em um ambiente Kubernetes, os containers são implantados dinamicamente como pods nos nós de trabalho disponíveis. Essa “dinâmica” é a chave, e o Filebeat e o Metricbeat têm um recurso útil chamado Autodiscover (Autodescoberta). Quando você executa aplicativos em containers, eles se tornam alvos móveis para os sistemas de monitoramento. Os provedores de Autodiscover do Kubernetes do Filebeat e do Metricbeat monitoram o início, a atualização e a parada de nós, pods e serviços do Kubernetes. Quando o Filebeat ou o Metricbeat detectam esses eventos, eles disponibilizam os metadados apropriados para cada evento. Além disso, dependendo das anotações dos pods do Kubernetes iniciados, eles aplicam as configurações apropriadas aos logs e métricas de destino. O Autodiscover baseado em dicas é explicado em detalhes em nosso post anterior do blog Docker and Kubernetes Hints-Based Autodiscover with Beats.

Arquitetura de monitoramento

Como no blog anterior, implantaremos uma aplicação simples e com vários containers chamada Cloud-Voting-App em um cluster do Kubernetes e monitoraremos o ambiente do Kubernetes, incluindo essa aplicação. Desta vez, explicarei o procedimento para coletar logs usando o Filebeat, coletar métricas usando o Metricbeat, ingeri-los diretamente no Elasticsearch e monitorá-los usando o Kibana. Também falarei sobre como obter métricas personalizadas do Prometheus usando o Elastic APM. A visão geral da arquitetura é mostrada na figura abaixo. Além disso, o código deste tutorial está disponível em meu repositório do GitHub, portanto, consulte-o para obter o procedimento completo.

enter image description here

Vamos dar uma olhada em cada etapa.

Implantação do Filebeat como um DaemonSet

Apenas uma instância do Filebeat deve ser implantada por nó do Kubernetes. O manifesto do DaemonSet já está definido no arquivo elastic/filebeat-kubernetes.yaml, mas vamos dar uma olhada nas configurações relevantes.

Primeiro, use o provedor Kubernetes Autodiscover para definir as configurações de anotação do pod da aplicação para lidar com os logs. Como você pode ver, as configurações do Autodiscover são definidas na seção ‘filebeat.autodiscover’. Habilitei as dicas e defini o caminho padrão para os logs do container. Consulte a Documentação do Filebeat para obter mais informações sobre como configurar o Autodiscover para o 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:
              - /pt/var/log/containers/*${data.kubernetes.container.id}.log
...

Além disso, tudo o que você precisa fazer é adicionar a URL e as credenciais do cluster do Elasticsearch.

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

Implantação do kube-state-metrics

O kube-state-metrics é um complemento do Kubernetes que monitora os objetos armazenados no Kubernetes. O kube-state-metrics se concentra em identificar a condição dos objetos do Kubernetes implantados em um cluster do Kubernetes. Por exemplo, em um determinado momento, quantos pods estão implantados no cluster, quais são os núcleos de CPU alocáveis no cluster, quantos trabalhos falharam e assim por diante. O kube-state-metrics não é implantado nos clusters do Kubernetes por padrão, portanto, você precisará implantá-lo por conta própria. Um manifesto de amostra do kube-state-metrics é colocado em examples/standard para sua referência. Consulte este repositório do GitHub para obter mais informações sobre o kube-state-metrics.

Implantação do Metricbeat como um DaemonSet

De forma semelhante ao Filebeat, apenas uma instância do Metricbeat deve ser implantada por nó do Kubernetes. O manifesto do DaemonSet já está definido no arquivo elastic/metricbeat-kubernetes.yaml, mas é um pouco mais complicado do que o do Filebeat. Vamos dar uma olhada nas configurações mais importantes.

As configurações do Autodiscover são definidas na seção metricbeat.autodiscover. A primeira configuração - type: kubernetes é para todo o cluster do Kubernetes. Aqui, usamos o módulo Kubernetes do Metricbeat para configurar métricas para todo o cluster Kubernetes. A primeira configuração - module: kubernetes define as métricas que obtemos do kube-state-metrics mencionado acima. A segunda configuração - module: kubernetes serve para monitorar o servidor da API do Kubernetes (kube-apiserver), que é o núcleo do plano de controle do Kubernetes que expõe a API do Kubernetes. Consulte a documentação do Metricbeat para obter mais informações sobre o módulo Kubernetes do 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: /pt/var/run/secrets/kubernetes.io/serviceaccount/token
              ssl.certificate_authorities:
                - /pt/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
              period: 30s

Além disso, as dicas são definidas para aproveitar o provedor de Autodescoberta do Kubernetes para permitir o processamento das métricas usando as configurações de anotação do pod da aplicação. Consulte a documentação do Metricbeat para obter mais informações sobre como configurar o Autodiscover para o Metricbeat.

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

As seguintes configurações do ConfigMap são para node/system/pod/container/volume, que é o Metricset padrão do módulo Kubernetes do Metricbeat. Essas métricas são extraídas do endpoint do kubelet de cada nó.

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

E, assim como no Filebeat, tudo o que você precisa fazer é adicionar a URL e as credenciais do seu cluster do Elasticsearch.

Implantação da aplicação

Assim como no blog anterior, implantaremos o Cloud-Voting-App. A interface da aplicação foi criada usando Python/Flask. O componente de dados usa o Redis. Lembre-se de que a aplicação foi instrumentada com o Prometheus Python Client para expor as métricas personalizadas do Prometheus. Como podemos coletar métricas personalizadas do Prometheus, apesar da ausência do Prometheus desta vez? Da versão 7.12 em diante, podemos usar o Elastic APM Agent para obter métricas personalizadas do Prometheus!

Primeiro, a aplicação importa o ElasticAPM e as variáveis de ambiente são usadas para as configurações do Elastic APM Agent. SERVICE_NAME é uma cadeia de caracteres arbitrária para identificar a aplicação, ENVIRONMENT é uma cadeia de caracteres arbitrária para identificar o ambiente da aplicação e SECRET_TOKEN e SERVER_URL são para a comunicação com o APM Server. O PROMETHEUS_METRICS final é um parâmetro que indica se a métrica deve ser obtida do 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)

A seguir, o Manifesto para implantar o Cloud-Voting-App em um cluster do Kubernetes. O respectivo arquivo está localizado em elastic/cloud-vote-all-in-one-redis-aks.yaml. Em primeiro lugar, em relação à interface de usuário cloud-vote-front, as variáveis necessárias para o APM Agent mencionado acima são definidas como variáveis de ambiente na especificação do container. Aqui, nenhuma anotação específica do pod é especificada, portanto, tanto os registros quanto as métricas são adquiridos usando as configurações padrão.

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 outro lado, o backend, cloud-vote-redis, usa o pod annotations para habilitar o módulo Filebeat redis para logs e o módulo Metricbeat redis para métricas, aplicando as configurações necessárias. Enquanto o cloute-vote-front usa as configurações padrão para coletar logs e métricas com o Beats, o cloud-vote-back usa o módulo redis do Beats para coletar logs e métricas. Além disso, ao configurar como coletar logs e métricas no manifesto do aplicativo em vez de no manifesto do Beats, você pode isolar as responsabilidades entre a equipe de desenvolvimento e a equipe da plataforma 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

Vamos acessar o Kibana

Agora, implantamos todos os componentes necessários. Vamos votar algumas vezes com o Cloud-Voting-App e depois acessar o Kibana.

Visão geral do Observability

Em primeiro lugar, quando você abre o Elastic Observability no Kibana, as taxas de logs das entradas de log do Filebeat e o resumo das entradas de métrica do Metricbeat são exibidos sem você precisar fazer nada. Esse resultado decorre do fato de que o Filebeat e o Metricbeat ingerem dados no formato ECS por padrão.

enter image description here

Logs

Os logs ingeridos pelo Filebeat são armazenados nos índices filebeat-*. Você pode usar o app Logs no Kibana para buscar, filtrar e acompanhar todos os logs coletados no Elasticsearch. Você também pode destacar strings específicas; por exemplo, destacamos cloud-vote-front no exemplo abaixo.

enter image description here

Métricas

As métricas ingeridas pelo Metricbeat são armazenadas nos índices metricbeat-*. O app Metrics no Kibana fornece uma maneira fácil de entender e intuitiva de visualizar as métricas coletadas no Elasticsearch. Ao usar a visualização Kubernetes Pods, conforme mostrado abaixo, você mapeia os nós e pods do Kubernetes e mostra o uso de cada recurso.

enter image description here

Você também pode clicar em um pod específico para ir para outros apps, como logs de pod ou traces de APM, preservando o contexto. Observe que View details for kubernetes.pod.uid a47d81b1-02d7-481a-91d4-1db9fe82d7a7 é exibido na tela.

enter image description here

Em seguida, você pode acessar os logs desse pod clicando em Kubernetes Pod logs. Você notou que a barra de busca no app Logs já está preenchida com kubernetes.pod.uid: a47d81b1-02d7-481a-91d4-1db9fe82d7a7? Ao preservar o contexto dessa forma, o Kibana pode fazer a transição de um app para outro sem dificuldades, retornando resultados relevantes instantaneamente.

enter image description here

Então, o que aconteceu com as métricas personalizadas do Prometheus? As métricas personalizadas mantidas pelo Prometheus Python Client são gravadas em índices chamados apm-* por meio do Agente de APM do Elastic. Se você verificar no Discover do Kibana, verá que ele é coletado no campo prometheus.metrics.cloud_votes. A variável na solicitação POST é armazenada como labels.vote. Consulte a documentação do APM para obter mais informações sobre a coleta de métricas personalizadas do Prometheus com o agente Python do Elastic APM.

enter image description here

Você pode visualizar facilmente os índices apm-* com Kibana Lens da seguinte forma.

enter image description here

Dashboards pré-definidos

Para o pod cloud-vote-back que usa o Redis, habilitamos o módulo redis para o Filebeat e o Metricbeat. Isso também criará previamente dashboards prontos para uso relacionados. Você pode visualizar instantaneamente os logs e as métricas do Redis sem nenhuma configuração adicional.

enter image description here enter image description here

Além disso, o dashboard do Kubernetes também está pronto para uso, graças ao módulo Kubernetes do Metricbeat.

enter image description here

Resumo

Neste blog, vimos uma maneira mais no estilo Elastic de usar o Filebeat e o Metricbeat para preencher o Elastic Stack com logs e métricas para monitorar o Kubernetes. Também vimos como usar o Agente Elastic APM para obter métricas personalizadas do Prometheus. Você pode começar a monitorar seus ambientes Kubernetes hoje mesmo inscrevendo-se em uma avaliação gratuita do Elastic Cloud ou baixando o Elastic Stack e hospedando-o por conta própria. O Elastic Observability permite um monitoramento mais eficiente e eficaz. Ele também pode ser integrado ao machine learning da Elastic e aos alertas do Kibana para estabelecer uma observabilidade altamente automatizada, acionável e abrangente. Se tiver alguma dificuldade ou dúvidas, vá para os nossos fóruns de discussão — estamos aqui para ajudar.

Em um futuro post do blog, abordaremos mais maneiras de usar o Elastic para monitorar o Kubernetes.