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.