Saltar al contenido principal

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