Capítulo 11.3 - Alerting
Objetivos de Aprendizaje
Al final de este capítulo, usted será capaz de:
- Comprender el sistema de alerting de Prometheus
- Configurar Alertmanager
- Crear reglas de alerta
- Gestionar las notificaciones (email, Slack, PagerDuty)
- Configurar el grouping y el routing
- Implementar el silencio y la inhibición
Introducción
El alerting permite notificar a los equipos cuando se detectan problemas en el clúster o las aplicaciones.
Arquitectura de Alerting
Prometheus
- Recolecta las métricas
- Evalúa las reglas de alerta
- Envía las alertas a Alertmanager
Alertmanager
- Recibe las alertas de Prometheus
- Agrupa y enruta las alertas
- Envía las notificaciones
Instalación de Alertmanager
Vía kube-prometheus-stack
Alertmanager está incluido en kube-prometheus-stack.
Verificación
# Ver los Pods
kubectl get pods -n monitoring | grep alertmanager
# Acceder a Alertmanager
kubectl port-forward -n monitoring svc/prometheus-kube-prometheus-alertmanager 9093:9093
Creación de Reglas de Alerta
PrometheusRule
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: kubernetes-alerts
namespace: monitoring
spec:
groups:
- name: kubernetes.rules
rules:
# Pod CrashLooping
- alert: PodCrashLooping
expr: rate(kube_pod_container_status_restarts_total[15m]) > 0
for: 5m
labels:
severity: warning
annotations:
summary: "El pod {{ $labels.pod }} está en crash looping"
description: "El pod {{ $labels.pod }} en el namespace {{ $labels.namespace }} se ha reiniciado {{ $value }} veces en los últimos 15 minutos"
# High CPU Usage
- alert: HighCPUUsage
expr: 100 - (avg(rate(container_cpu_usage_seconds_total[5m])) * 100) < 10
for: 5m
labels:
severity: critical
annotations:
summary: "Alto uso de CPU en {{ $labels.instance }}"
description: "El uso de CPU está por encima del 90% en {{ $labels.instance }}"
# High Memory Usage
- alert: HighMemoryUsage
expr: (container_memory_usage_bytes / container_spec_memory_limit_bytes) * 100 > 90
for: 5m
labels:
severity: warning
annotations:
summary: "Alto uso de memoria en {{ $labels.pod }}"
description: "El uso de memoria está por encima del 90% en el pod {{ $labels.pod }}"
Configuración de Alertmanager
ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: alertmanager-config
namespace: monitoring
data:
alertmanager.yml: |
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 10s
group_interval: 10s
repeat_interval: 12h
receiver: 'default'
routes:
- match:
severity: critical
receiver: 'critical-alerts'
- match:
severity: warning
receiver: 'warning-alerts'
receivers:
- name: 'default'
email_configs:
- to: 'team@example.com'
from: 'alertmanager@example.com'
smarthost: 'smtp.example.com:587'
auth_username: 'alertmanager@example.com'
auth_password: 'password'
- name: 'critical-alerts'
slack_configs:
- api_url: 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'
channel: '#alerts-critical'
title: '{{ .GroupLabels.alertname }}'
text: '{{ range .Alerts }}{{ .Annotations.description }}{{ end }}'
- name: 'warning-alerts'
email_configs:
- to: 'team@example.com'
from: 'alertmanager@example.com'
smarthost: 'smtp.example.com:587'
Notificaciones
Email
receivers:
- name: 'email'
email_configs:
- to: 'admin@example.com'
from: 'alertmanager@example.com'
smarthost: 'smtp.example.com:587'
auth_username: 'user'
auth_password: 'password'
headers:
Subject: 'Alerta: {{ .GroupLabels.alertname }}'
Slack
receivers:
- name: 'slack'
slack_configs:
- api_url: 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'
channel: '#alerts'
title: '{{ .GroupLabels.alertname }}'
text: '{{ range .Alerts }}{{ .Annotations.description }}{{ end }}'
PagerDuty
receivers:
- name: 'pagerduty'
pagerduty_configs:
- service_key: 'YOUR_SERVICE_KEY'
description: '{{ .GroupLabels.alertname }}'
Grouping y Routing
Grouping
Las alertas similares se agrupan juntas:
route:
group_by: ['alertname', 'cluster']
group_wait: 10s
group_interval: 10s
repeat_interval: 12h
Routing
Enruta las alertas según los labels:
route:
routes:
- match:
severity: critical
receiver: 'critical-team'
- match:
severity: warning
receiver: 'warning-team'
Silencio e Inhibición
Silencio
Eliminar temporalmente alertas:
# Vía la interfaz de Alertmanager
# O vía amtool
amtool silence add alertname=HighCPUUsage --duration=1h
Inhibición
Eliminar alertas menos importantes cuando una alerta crítica está activa:
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'instance']
Buenas Prácticas
1. Reglas Apropiadas
Crear reglas para problemas reales y accionables.
2. Umbrales Realistas
Definir umbrales que disparen alertas significativas.
3. Grouping
Agrupar las alertas para evitar el spam.
4. Escalation
Configurar la escalada para las alertas críticas.
5. Documentación
Documentar cada regla de alerta.
Resumen
En este capítulo, usted ha aprendido:
Alerting: Sistema de notificación para problemas
PrometheusRule: Define las reglas de alerta
Alertmanager: Gestiona el routing y las notificaciones
Notificaciones: Email, Slack, PagerDuty
Grouping: Agrupa alertas similares
Routing: Enruta según los labels
Silencio/Inhibición: Gestiona alertas temporalmente
Buenas prácticas: Reglas apropiadas, umbrales realistas, grouping
Próximos Pasos
Módulo 12: Despliegue en Producción
Lab 11.4: Alerting y Notificaciones
Capítulo creado el: Diciembre 2024