Saltar al contenido principal

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