Monitoring-wijzigingen op het cluster uitrollen

Aan het einde van deze gids zijn wijzigingen in k8s/monitoring/ (rules, config, ingress, dashboards) live op het cluster en is er bevestiging dat alerting nog werkt. Voor de architectuur achter deze stack, zie explanation: monitoring-stack. Voor referentie van endpoints, secrets en alert-rules, zie reference: monitoring-stack.

Voorwaarden:

  • kubectl-toegang tot het monitoring-namespace.
  • De PR’s met de gewenste yaml-wijzigingen zijn gemerged naar main.
  • Korte downtime van Alertmanager is acceptabel als je de deployment opnieuw oprolt (Recreate-strategy).

1. Nieuwe secrets aanmaken (alleen eerste keer of bij rotatie)

Secrets staan niet in git. Twee monitoring-specifieke secrets die handmatig moeten:

# SMTP-credentials voor Alertmanager → Flowmailer
kubectl create secret generic alertmanager-smtp \
  --namespace monitoring \
  --from-literal=SMTP_FROM='alerts@tapster.nl' \
  --from-literal=SMTP_HOST='smtp.flowmailer.net' \
  --from-literal=SMTP_PORT='587' \
  --from-literal=SMTP_USER='<flowmailer-user>' \
  --from-literal=SMTP_PASS='<flowmailer-password>'

# Watchdog-webhook (healthchecks.io of BetterStack heartbeat-URL)
kubectl create secret generic alertmanager-webhook \
  --namespace monitoring \
  --from-literal=HEALTHCHECK_WATCHDOG_URL='https://hc-ping.com/<uuid>'

Een nieuwe placeholder in alertmanager-config.yaml toegevoegd? Dan ook de envsubst-whitelist in alertmanager-deployment.yaml bijwerken. Zie reference: envsubst-whitelist.

2. Prometheus: rules en config

kubectl apply -f k8s/monitoring/mongoose-pool-rules.yaml
kubectl apply -f k8s/monitoring/kubernetes-platform-rules.yaml
kubectl apply -f k8s/monitoring/watchdog-rules.yaml
kubectl apply -f k8s/monitoring/prometheus-config.yaml
kubectl apply -f k8s/monitoring/prometheus-deployment.yaml

kubectl -n monitoring rollout restart deployment/prometheus
kubectl -n monitoring rollout status deployment/prometheus

Verifieer dat de rules geladen zijn:

kubectl -n monitoring port-forward svc/prometheus 9090:9090 &
curl -s -u admin:<wachtwoord> http://localhost:9090/api/v1/rules \
  | jq '.data.groups[].name'
kill %1

Verwacht: watchdog, mongoose-pool, kubernetes-pods, kubernetes-nodes, tapster-api-availability, tls-certificates, alertmanager-self.

3. Alertmanager: config en deployment

kubectl apply -f k8s/monitoring/alertmanager-config.yaml
kubectl apply -f k8s/monitoring/alertmanager-deployment.yaml

kubectl -n monitoring rollout restart deployment/alertmanager
kubectl -n monitoring rollout status deployment/alertmanager

Verifieer dat de init-container de envsubst-render goed deed:

POD=$(kubectl -n monitoring get pod -l app=alertmanager -o name | head -1)
kubectl -n monitoring exec "$POD" -c alertmanager -- \
  cat /etc/alertmanager/alertmanager.yml | head -40

Geen letterlijke ${...}-strings te zien (anders is de whitelist incompleet). Controleer ook dat Watchdog actief is:

kubectl -n monitoring port-forward svc/alertmanager 9093:9093 &
curl -s http://localhost:9093/api/v2/alerts \
  | jq '.[] | select(.labels.alertname=="Watchdog") | {state: .status.state, startsAt}'
kill %1

4. Ingress

kubectl apply -f k8s/monitoring/ingress.yaml

Traefik leest IngressRoutes en secret-changes live; geen rollout nodig. Test dat basic-auth werkt:

curl -I https://prometheus.tapster.nl     # verwacht: 401 Unauthorized
curl -I -u admin:<wachtwoord> https://prometheus.tapster.nl   # verwacht: 200 of 302

Voor het roteren van het basic-auth-wachtwoord, zie basic-auth rotate how-to.

5. Grafana: datasources, dashboards

kubectl apply -f k8s/monitoring/grafana-deployment.yaml
kubectl apply -f k8s/monitoring/grafana-dashboards-configmap.yaml

kubectl -n monitoring rollout restart deployment/grafana
kubectl -n monitoring rollout status deployment/grafana

Open Grafana, check onder Configuration → Data sources dat prometheus en alertmanager allebei “Working” tonen. Onder Dashboards moeten de nieuwe ConfigMap-dashboards verschijnen.

6. End-to-end verificatie

Stuur een test-alert direct in Alertmanager om de hele keten te toetsen:

kubectl -n monitoring port-forward svc/alertmanager 9093:9093 &
curl -s -H 'Content-Type: application/json' -d '[{
  "labels":{"alertname":"SmtpTest","severity":"critical","service":"tapster-api"},
  "annotations":{"summary":"Verificatie na monitoring-rollout"},
  "startsAt":"'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'",
  "endsAt":"'"$(date -u -v+10M +%Y-%m-%dT%H:%M:%SZ)"'"
}]' http://localhost:9093/api/v2/alerts
kill %1

Mail moet binnen ~30 seconden bij roy@tapster.nl zijn. Geen mail? Check de logs:

kubectl -n monitoring logs deploy/alertmanager -c alertmanager --since=2m \
  | grep -iE 'notify|smtp|err|warn'

Watchdog-heartbeat naar healthchecks.io moet ook live zijn. Kijk op het dashboard van de healthcheck-service: laatste ping < 2 minuten geleden.

Veelvoorkomende problemen

  • The PersistentVolumeClaim "..." is invalid: spec.resources.requests.storage: Forbidden: field can not be less than previous value: de yaml verkleint een PVC. PVC-shrinks worden niet ondersteund door de cluster-default storage-class. Voor Alertmanager: zie Alertmanager-PVC verkleinen.
  • Alertmanager CrashLoopBackOff met invalid URL: unsupported scheme "": een placeholder in alertmanager-config.yaml is niet vervangen. Check dat de variabele in de envsubst-whitelist van alertmanager-deployment.yaml staat én dat het bijbehorende secret (vaak alertmanager-webhook) bestaat met de juiste keys.
  • Grafana 502 Bad Gateway: pod is nog niet ready. Wacht 30 tot 60 seconden of check kubectl -n monitoring logs deploy/grafana op datasource-provisioning-fouten.