Monitoring e Logging no Kubernetes: Ferramentas e Estratégias
Descubra as melhores práticas e ferramentas para monitorar e registrar logs de suas aplicações no Kubernetes, da coleta de métricas à análise de logs.
InSkillCoach
Introdução
Em um ambiente Kubernetes, a visibilidade é crucial para manter a saúde e o desempenho de suas aplicações. O monitoring e o logging são dois aspectos fundamentais da observabilidade que permitem detectar problemas, entender sua causa e tomar medidas preventivas.
Este artigo explora as ferramentas e estratégias para implementar um sistema completo de monitoring e logging no Kubernetes.
Monitoring no Kubernetes
O monitoring no Kubernetes consiste em coletar, analisar e visualizar métricas sobre o estado do seu cluster e de suas aplicações. Veja a seguir as principais abordagens e ferramentas.
Métricas Básicas com kubectl
O Kubernetes fornece comandos básicos para monitorar o estado do seu cluster:
# Vérifier l'état des nœuds
kubectl get nodes
# Vérifier l'état des pods
kubectl get pods
# Vérifier l'état des services
kubectl get services
# Vérifier les événements du cluster
kubectl get events
# Vérifier l'utilisation des ressources des nœuds
kubectl top nodes
# Vérifier l'utilisation des ressources des pods
kubectl top pods
Métricas do Kubernetes com o Metrics Server
O Metrics Server é um componente que coleta as métricas básicas do Kubernetes (CPU, memória) e as expõe por meio da API do Kubernetes.
apiVersion: v1
kind: ServiceAccount
metadata:
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system:aggregated-metrics-reader
labels:
rbac.authorization.k8s.io/aggregate-to-view: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rules:
- apiGroups:
- metrics.k8s.io
resources:
- pods
- nodes
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system:metrics-server
rules:
- apiGroups:
- ""
resources:
- nodes/metrics
verbs:
- get
- apiGroups:
- ""
resources:
- pods
- nodes
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: metrics-server-auth-delegator
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: metrics-server:system:auth-delegator
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: system:metrics-server
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:metrics-server
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: v1
kind: Service
metadata:
name: metrics-server
namespace: kube-system
labels:
kubernetes.io/name: Metrics-server
kubernetes.io/cluster-service: "true"
spec:
selector:
k8s-app: metrics-server
ports:
- name: https
port: 443
protocol: TCP
targetPort: https
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: metrics-server
namespace: kube-system
labels:
k8s-app: metrics-server
spec:
selector:
matchLabels:
k8s-app: metrics-server
strategy:
rollingUpdate:
maxUnavailable: 0
template:
metadata:
name: metrics-server
labels:
k8s-app: metrics-server
spec:
serviceAccountName: metrics-server
containers:
- name: metrics-server
image: k8s.gcr.io/metrics-server/metrics-server:v0.5.0
args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls
ports:
- name: https
containerPort: 4443
protocol: TCP
livenessProbe:
httpGet:
path: /livez
port: https
scheme: HTTPS
initialDelaySeconds: 20
periodSeconds: 10
readinessProbe:
httpGet:
path: /readyz
port: https
scheme: HTTPS
initialDelaySeconds: 20
periodSeconds: 10
resources:
requests:
cpu: 100m
memory: 200Mi
limits:
cpu: 200m
memory: 400Mi
volumeMounts:
- name: tmp-dir
mountPath: /tmp
volumes:
- name: tmp-dir
emptyDir: {}
Prometheus: Coleta Avançada de Métricas
O Prometheus é um sistema de monitoring open source que coleta e armazena métricas na forma de séries temporais. Ele é particularmente adequado para ambientes cloud-native.
Instalação do Prometheus com Helm
# Ajouter le repo Helm de Prometheus
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# Installer Prometheus
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace
Configuração do Prometheus para Kubernetes
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: app-monitor
labels:
release: prometheus
spec:
selector:
matchLabels:
app: myapp
endpoints:
- port: http
interval: 15s
path: /metrics
Grafana: Visualização de Métricas
O Grafana é uma ferramenta de visualização que permite criar dashboards interativos para suas métricas do Prometheus.
Instalação do Grafana com Helm
# Ajouter le repo Helm de Grafana
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
# Installer Grafana
helm install grafana grafana/grafana \
--namespace monitoring \
--create-namespace
Exemplo de Dashboard do Grafana
{
"annotations": {
"list": []
},
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 0,
"links": [],
"liveNow": false,
"panels": [
{
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 10,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "never",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
},
"unit": "percent"
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 0
},
"id": 1,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "prometheus"
},
"expr": "sum(rate(container_cpu_usage_seconds_total{namespace=\"default\"}[5m])) by (pod) * 100",
"refId": "A"
}
],
"title": "CPU Usage by Pod",
"type": "timeseries"
}
],
"refresh": "5s",
"schemaVersion": 38,
"style": "dark",
"tags": [],
"templating": {
"list": []
},
"time": {
"from": "now-1h",
"to": "now"
},
"timepicker": {},
"timezone": "",
"title": "Kubernetes Monitoring",
"uid": "kubernetes",
"version": 1,
"weekStart": ""
}
Alertmanager: Gerenciamento de Alertas
O Alertmanager gerencia os alertas enviados pelo Prometheus e os encaminha para diferentes canais de notificação.
Configuração do Alertmanager
apiVersion: monitoring.coreos.com/v1
kind: AlertmanagerConfig
metadata:
name: app-alerts
namespace: default
spec:
route:
receiver: 'slack'
groupBy: ['alertname', 'namespace']
groupWait: 30s
groupInterval: 5m
repeatInterval: 4h
receivers:
- name: 'slack'
slackConfigs:
- apiURL: 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK'
channel: '#alerts'
sendResolved: true
Logging no Kubernetes
O logging no Kubernetes consiste em coletar, armazenar e analisar os logs de suas aplicações e do sistema. Veja a seguir as principais abordagens e ferramentas.
Logging Básico com kubectl
O Kubernetes fornece comandos básicos para acessar os logs de seus pods:
# Voir les logs d'un pod
kubectl logs <pod-name>
# Voir les logs d'un conteneur spécifique dans un pod
kubectl logs <pod-name> -c <container-name>
# Voir les logs en temps réel
kubectl logs -f <pod-name>
# Voir les logs d'un pod précédent (en cas de redémarrage)
kubectl logs <pod-name> --previous
Arquitetura de Logging Centralizada
Para uma solução de logging completa, você pode implementar uma arquitetura centralizada com os seguintes componentes:
- Coletor de logs: coleta os logs de todos os pods
- Armazenamento: armazena os logs para análise posterior
- Interface de visualização: permite pesquisar e analisar os logs
ELK Stack: Elasticsearch, Logstash, Kibana
O ELK Stack é uma solução popular para coleta, armazenamento e análise de logs.
Instalação do ELK Stack com Helm
# Ajouter le repo Helm d'Elastic
helm repo add elastic https://helm.elastic.co
helm repo update
# Installer Elasticsearch
helm install elasticsearch elastic/elasticsearch \
--namespace logging \
--create-namespace
# Installer Kibana
helm install kibana elastic/kibana \
--namespace logging \
--create-namespace
# Installer Logstash
helm install logstash elastic/logstash \
--namespace logging \
--create-namespace
Configuração do Filebeat para Coleta de Logs
O Filebeat é um agente leve que coleta os logs e os envia ao Elasticsearch ou ao Logstash.
apiVersion: beat.k8s.elastic.co/v1beta1
kind: Filebeat
metadata:
name: filebeat
namespace: logging
spec:
version: 7.14.0
elasticsearchRef:
name: elasticsearch
config:
filebeat.inputs:
- type: container
paths:
- /var/log/containers/*.log
processors:
- add_kubernetes_metadata:
host: ${NODE_NAME}
matchers:
- logs_path:
logs_path: "/var/log/containers/"
daemonSet:
podTemplate:
spec:
containers:
- name: filebeat
volumeMounts:
- name: varlogcontainers
mountPath: /var/log/containers
- name: varlogpods
mountPath: /var/log/pods
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
volumes:
- name: varlogcontainers
hostPath:
path: /var/log/containers
- name: varlogpods
hostPath:
path: /var/log/pods
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
EFK Stack: Elasticsearch, Fluentd, Kibana
Uma alternativa ao ELK Stack é o EFK Stack, que utiliza o Fluentd no lugar do Logstash.
Instalação do EFK Stack com Helm
# Ajouter le repo Helm de Fluentd
helm repo add fluent https://fluent.github.io/helm-charts
helm repo update
# Installer Fluentd
helm install fluentd fluent/fluentd \
--namespace logging \
--create-namespace
Configuração do Fluentd
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentd-config
namespace: logging
data:
fluent.conf: |
<source>
@type tail
path /var/log/containers/*.log
pos_file /var/log/fluentd-containers.log.pos
tag kubernetes.*
read_from_head true
<parse>
@type json
time_format %Y-%m-%dT%H:%M:%S.%NZ
</parse>
</source>
<filter kubernetes.**>
@type kubernetes_metadata
</filter>
<match kubernetes.**>
@type elasticsearch
host elasticsearch
port 9200
logstash_format true
logstash_prefix k8s
<buffer>
@type memory
flush_interval 5s
retry_max_times 5
</buffer>
</match>
Loki: Solução de Logging Leve
O Loki é uma solução de logging leve desenvolvida pela Grafana Labs, projetada para ser muito eficiente e fácil de usar.
Instalação do Loki com Helm
# Ajouter le repo Helm de Grafana
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
# Installer Loki
helm install loki grafana/loki-stack \
--namespace logging \
--create-namespace
Configuração do Promtail
O Promtail é o agente de coleta de logs do Loki.
apiVersion: v1
kind: ConfigMap
metadata:
name: promtail-config
namespace: logging
data:
promtail.yaml: |
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: kubernetes-pods
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_name]
regex: (.+)
target_label: pod
- source_labels: [__meta_kubernetes_namespace_name]
regex: (.+)
target_label: namespace
pipeline_stages:
- docker: {}
- cri: {}
Boas Práticas para Monitoring e Logging
1. Coleta de Métricas no Nível da Aplicação
Instrumente suas aplicações para expor métricas no formato Prometheus:
// Exemple avec Micrometer pour Java
@RestController
public class MetricsController {
private final Counter requestCounter;
public MetricsController(MeterRegistry registry) {
this.requestCounter = Counter.builder("app_requests_total")
.description("Total number of requests")
.register(registry);
}
@GetMapping("/api/resource")
public String handleRequest() {
requestCounter.increment();
return "Response";
}
}
2. Estruturação dos Logs
Utilize um formato estruturado para seus logs (JSON) para facilitar a análise:
// Exemple avec SLF4J et Logback
<configuration>
<appender name="JSON" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<includeMDC>true</includeMDC>
<customFields>{"app_name":"myapp"}</customFields>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="JSON" />
</root>
</configuration>
3. Rotulagem de Métricas e Logs
Adicione rótulos (labels) pertinentes às suas métricas e logs para facilitar a filtragem e a análise:
# Exemple de configuration Prometheus
scrape_configs:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_name]
regex: (.+)
target_label: pod
- source_labels: [__meta_kubernetes_namespace_name]
regex: (.+)
target_label: namespace
- source_labels: [__meta_kubernetes_pod_label_app]
regex: (.+)
target_label: app
4. Definição de Alertas Pertinentes
Defina alertas que detectem problemas reais sem gerar falsos positivos:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: app-alerts
namespace: monitoring
spec:
groups:
- name: app
rules:
- alert: HighErrorRate
expr: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) > 0.05
for: 5m
labels:
severity: critical
annotations:
summary: High error rate detected
description: Error rate is above 5% for the last 5 minutes
5. Retenção e Arquivamento
Configure uma estratégia de retenção e arquivamento para suas métricas e logs:
# Exemple de configuration Elasticsearch pour la rétention
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: elasticsearch
spec:
version: 7.14.0
nodeSets:
- name: default
count: 3
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
indices:
lifecycle:
policies:
- name: logs-policy
phases:
hot:
min_age: 0s
actions:
rollover:
max_age: 1d
max_size: 50gb
warm:
min_age: 7d
actions:
forcemerge:
max_num_segments: 1
cold:
min_age: 30d
actions:
freeze: {}
delete:
min_age: 90d
actions:
delete: {}
Exemplo Completo: Stack de Monitoramento e Logging
Aqui está um exemplo completo de configuração de uma stack de monitoramento e logging no Kubernetes:
# Prometheus Operator
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
namespace: monitoring
spec:
serviceAccountName: prometheus
serviceMonitorSelector:
matchLabels:
release: prometheus
resources:
requests:
memory: 2Gi
cpu: 1
limits:
memory: 4Gi
cpu: 2
storage:
volumeClaimTemplate:
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 50Gi
---
# Grafana
apiVersion: integreatly.org/v1alpha1
kind: Grafana
metadata:
name: grafana
namespace: monitoring
spec:
config:
auth:
adminUser: admin
adminPassword: admin
dashboard:
defaultDashboard: kubernetes
dashboardLabelSelector:
- matchLabels:
grafana_dashboard: "1"
resources:
requests:
memory: 1Gi
cpu: 500m
limits:
memory: 2Gi
cpu: 1
---
# Loki
apiVersion: loki.grafana.com/v1
kind: Loki
metadata:
name: loki
namespace: logging
spec:
size: 1x.small
storage:
type: filesystem
size: 10Gi
resources:
requests:
memory: 512Mi
cpu: 250m
limits:
memory: 1Gi
cpu: 500m
---
# Promtail
apiVersion: v1
kind: ConfigMap
metadata:
name: promtail-config
namespace: logging
data:
promtail.yaml: |
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: kubernetes-pods
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_name]
regex: (.+)
target_label: pod
- source_labels: [__meta_kubernetes_namespace_name]
regex: (.+)
target_label: namespace
pipeline_stages:
- docker: {}
- cri: {}
---
# ServiceMonitor pour l'application
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: app-monitor
namespace: monitoring
labels:
release: prometheus
spec:
selector:
matchLabels:
app: myapp
endpoints:
- port: http
interval: 15s
path: /metrics
---
# Service pour l'application avec métriques
apiVersion: v1
kind: Service
metadata:
name: app-service
labels:
app: myapp
spec:
selector:
app: myapp
ports:
- name: http
port: 80
targetPort: 8080
- name: metrics
port: 8080
targetPort: 8080
Conclusão
Um sistema robusto de monitoramento e logging é essencial para manter a saúde e o desempenho das suas aplicações no Kubernetes. Ao combinar ferramentas como Prometheus, Grafana e Loki, você obtém visibilidade completa sobre o seu cluster e as suas aplicações.
Boas práticas como a coleta de métricas no nível da aplicação, a estruturação dos logs e a definição de alertas pertinentes ajudarão você a detectar e resolver problemas antes que eles afetem seus usuários.
No próximo artigo, vamos explorar a segurança no Kubernetes, um aspecto crucial para proteger suas aplicações e seus dados.
Sobre InSkillCoach
Especialista em treinamento e tecnologias
Coach especializado em tecnologias avançadas e IA, apoiado pela GNeurone Inc.
Certificações:
- AWS Certified Solutions Architect – Professional
- Certificações Google Cloud
- Microsoft Certified: DevOps Engineer Expert
- Certified Kubernetes Administrator (CKA)
- CompTIA Security+
Comentários
Os comentários são alimentados pelo GitHub Discussions
Conecte-se com o GitHub para participar da discussão