Coleta de logs de arquivos em contêineres com Filebeat no Kubernetes

Para coletar arquivos de log gerados por contêineres em um pod Kubernetes, uma abordagem comum é utilizar o padrão sidecar: adicionar um segundo contêiner ao pod (por exemplo, Filebeat) que compartilha o volume dos logs via emptyDir. Dessa forma, o agente de coleta pode ler os logs sem acessar diretamente o sistema de arquivos do contêiner principal.

Exemplo de configuração

O manifesto a seguir cria um Deployment com dois contêineres: um Nginx que gera logs de acesso e um Filebeta que os envia para o Elasticsearch.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sidecar-log-coletor
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
      componente: nginx-log
  template:
    metadata:
      labels:
        app: web
        componente: nginx-log
    spec:
      containers:
      # Contêiner da aplicação
      - name: nginx
        image: lizhenliang/nginx-php
        volumeMounts:
        - name: logs-compartilhados
          mountPath: /var/log/nginx
      # Contêiner sidecar para coleta
      - name: filebeat
        image: elastic/filebeat:7.10.1
        args: ["-c", "/etc/filebeat.yml", "-e"]
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            memory: 500Mi
        securityContext:
          runAsUser: 0
        volumeMounts:
        - name: config-filebeat
          mountPath: /etc/filebeat.yml
          subPath: filebeat.yml
        - name: logs-compartilhados
          mountPath: /var/log/nginx
      volumes:
      - name: logs-compartilhados
        emptyDir: {}
      - name: config-filebeat
        configMap:
          name: filebeat-nginx-cfg
---
apiVersion: v1
kind: Service
metadata:
  name: sidecar-log-coletor-svc
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: web
    componente: nginx-log
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat-nginx-cfg
data:
  filebeat.yml: |
    filebeat.inputs:
    - type: log
      paths:
        - /var/log/nginx/access.log
      fields_under_root: true
      fields:
        project: microservice
        app: nginx

    setup.ilm.enabled: false
    setup.template.name: "nginx-web-logs"
    setup.template.pattern: "nginx-web-logs-*"

    output.elasticsearch:
      hosts: ['elasticsearch-master:9200']
      username: "admin"
      password: "12345678"
      index: "nginx-web-logs-%{+yyyy.MM.dd}"

Implantação e verificação

Crie os recursos no cluster:

kubectl create -f sidecar-log-coletor.yaml

Verifique se o pod está rodando com os dois contêineres:

kubectl get pods -l componente=nginx-log
NAME                                    READY   STATUS    RESTARTS   AGE
sidecar-log-coletor-68b99bf447-fvvdj    2/2     Running   0          2m

Teste o acesso ao Nginx para gerar logs:

kubectl get pods -o wide | grep sidecar
sidecar-log-coletor-68b99bf447-fvvdj   2/2   Running   0   5m53s   10.244.85.199   k8s-node01

curl -I 10.244.85.199/status.html
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 08 Jul 2021 14:41:48 GMT
... 

No Kibana, crie um padrão de índice para nginx-web-logs-* para visualizar os dados enviados pelo Filebeat.

Tags: kubernetes filebeat sidecar emptydir nginx

Publicado em 6-22 20:44