Capítulo 11.2 - Gestión de Logs
Objetivos de Aprendizaje
Al final de este capítulo, usted será capaz de:
- Comprender la gestión de logs en Kubernetes
- Utilizar kubectl para ver los logs
- Centralizar los logs con EFK/Loki
- Configurar Fluentd/Fluent Bit
- Analizar los logs con Kibana/Grafana
- Implementar la rotación de logs
Introducción
Los logs son esenciales para la depuración y el monitoreo. En Kubernetes, los logs se gestionan a nivel de los contenedores y deben ser centralizados para un análisis eficaz.
Logs con kubectl
Ver los Logs de un Pod
# Logs de un Pod
kubectl logs my-pod
# Logs de un contenedor específico
kubectl logs my-pod -c my-container
# Logs de todos los contenedores
kubectl logs my-pod --all-containers=true
# Logs con seguimiento (streaming)
kubectl logs -f my-pod
# Logs anteriores (si el Pod se reinició)
kubectl logs my-pod --previous
# Logs con timestamp
kubectl logs my-pod --timestamps
# Limitar el número de líneas
kubectl logs my-pod --tail=100
# Logs desde una fecha
kubectl logs my-pod --since=1h
Logs de Varios Pods
# Logs de todos los Pods con una etiqueta
kubectl logs -l app=my-app
# Logs de un Deployment
kubectl logs deployment/my-app
# Logs de un StatefulSet
kubectl logs statefulset/my-app
Centralización de Logs
EFK Stack (Elasticsearch, Fluentd, Kibana)
Arquitectura:
- Fluentd: Recopila y envía los logs
- Elasticsearch: Almacena los logs
- Kibana: Visualiza y busca los logs
Loki Stack (Loki, Grafana)
Arquitectura:
- Fluent Bit: Recopila los logs
- Loki: Almacena los logs (como Prometheus para logs)
- Grafana: Visualiza los logs
Instalación de EFK Stack
Vía Helm
# Añadir el repositorio
helm repo add elastic https://helm.elastic.co
helm repo update
# Instalar Elasticsearch
helm install elasticsearch elastic/elasticsearch \
--namespace logging \
--create-namespace
# Instalar Fluentd
helm install fluentd fluent/fluentd \
--namespace logging
# Instalar Kibana
helm install kibana elastic/kibana \
--namespace logging
Configuración de Fluentd
DaemonSet Fluentd
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: logging
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch.logging.svc.cluster.local"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
Instalación de Loki Stack
Vía Helm
# Añadir el repositorio
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
# Instalar Loki
helm install loki grafana/loki-stack \
--namespace logging \
--create-namespace
Configuración de Fluent Bit
apiVersion: v1
kind: ConfigMap
metadata:
name: fluent-bit-config
namespace: logging
data:
fluent-bit.conf: |
[SERVICE]
Flush 1
Log_Level info
[INPUT]
Name tail
Path /var/log/containers/*.log
Parser docker
Tag kube.*
Refresh_Interval 5
[OUTPUT]
Name loki
Match kube.*
Host loki.logging.svc.cluster.local
Port 3100
Labels job=fluentbit
Análisis con Kibana
Acceso
# Port-forward
kubectl port-forward -n logging svc/kibana-kibana 5601:5601
Búsqueda de Logs
Kibana Query Language (KQL):
kubernetes.namespace: "production" AND level: "error"
Lucene:
kubernetes.namespace:production AND level:error
Análisis con Grafana
Acceso
# Port-forward
kubectl port-forward -n logging svc/loki-grafana 3000:80
LogQL (Loki Query Language)
# Logs de un namespace
{namespace="production"}
# Logs con errores
{namespace="production"} |= "error"
# Tasa de logs por segundo
rate({namespace="production"}[5m])
Buenas Prácticas
1. Centralización
Centralizar todos los logs en un sistema único.
2. Rotación
Configurar la rotación de logs para evitar el agotamiento del almacenamiento.
3. Indexación
Indexar los logs para una búsqueda rápida.
4. Retención
Definir una política de retención adecuada.
5. Parsing
Parsear los logs estructurados (JSON) para una mejor búsqueda.
Resumen
En este capítulo, usted ha aprendido:
kubectl logs: Ver los logs de los Pods
Centralización: EFK Stack o Loki Stack
Fluentd/Fluent Bit: Recolección de logs
Elasticsearch: Almacenamiento y búsqueda
Loki: Almacenamiento ligero para logs
Kibana/Grafana: Visualización y análisis
Buenas prácticas: Centralización, rotación, indexación, retención
Próximos Pasos
Capítulo 11.3: Alerting
Capítulo 11.4: Distributed Tracing
Lab 11.3: Configuración del Logging
Capítulo creado el: Diciembre 2024