xpeditis2.0/infra/prod/k8s/monitoring/05-alertmanager.yaml
2026-09-07 21:40:50 +02:00

151 lines
4.1 KiB
YAML

# =============================================================================
# Alertmanager -- routage des alertes vers Discord
# =============================================================================
# L'URL du webhook n'est PAS dans ce ConfigMap : elle est lue depuis un fichier
# monte depuis un Secret (webhook_url_file). Un ConfigMap est lisible par tout
# ce qui a un acces lecture au namespace, un webhook Discord permet de publier
# n'importe quoi dans votre canal d'exploitation.
---
apiVersion: v1
kind: ConfigMap
metadata:
name: alertmanager-config
namespace: monitoring
data:
alertmanager.yml: |
global:
resolve_timeout: 5m
route:
receiver: discord
group_by: ['alertname', 'severity']
group_wait: 30s
group_interval: 5m
# Une alerte critique non traitee est repetee toutes les heures : elle ne
# doit pas disparaitre du fil de discussion.
repeat_interval: 1h
routes:
- matchers:
- severity = "avertissement"
receiver: discord
repeat_interval: 12h
inhibit_rules:
# Si le backend est totalement indisponible, inutile d'inonder le canal
# avec les alertes de latence et de taux d'erreur qui en decoulent.
- source_matchers:
- alertname = "BackendIndisponible"
target_matchers:
- severity =~ "avertissement|critique"
equal: ['cluster']
receivers:
- name: discord
discord_configs:
- webhook_url_file: /etc/alertmanager/secrets/discord-webhook
send_resolved: true
title: '[{{ .Status | toUpper }}] {{ .CommonLabels.alertname }}'
message: |-
{{ range .Alerts }}{{ .Annotations.summary }}
{{ .Annotations.description }}
{{ end }}
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: alertmanager-data
namespace: monitoring
spec:
accessModes: [ReadWriteOnce]
storageClassName: local-path
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: alertmanager
namespace: monitoring
labels:
app.kubernetes.io/name: alertmanager
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app.kubernetes.io/name: alertmanager
template:
metadata:
labels:
app.kubernetes.io/name: alertmanager
spec:
securityContext:
runAsNonRoot: true
runAsUser: 65534
runAsGroup: 65534
fsGroup: 65534
seccompProfile:
type: RuntimeDefault
containers:
- name: alertmanager
image: prom/alertmanager:v0.28.0
args:
- --config.file=/etc/alertmanager/alertmanager.yml
- --storage.path=/alertmanager
- --web.listen-address=:9093
ports:
- name: http
containerPort: 9093
readinessProbe:
httpGet:
path: /-/ready
port: http
initialDelaySeconds: 10
resources:
requests:
cpu: 20m
memory: 64Mi
limits:
cpu: 200m
memory: 192Mi
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]
volumeMounts:
- name: config
mountPath: /etc/alertmanager/alertmanager.yml
subPath: alertmanager.yml
- name: secrets
mountPath: /etc/alertmanager/secrets
readOnly: true
- name: data
mountPath: /alertmanager
volumes:
- name: config
configMap:
name: alertmanager-config
- name: secrets
secret:
secretName: alertmanager-secrets
- name: data
persistentVolumeClaim:
claimName: alertmanager-data
---
apiVersion: v1
kind: Service
metadata:
name: alertmanager
namespace: monitoring
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: alertmanager
ports:
- name: http
port: 9093
targetPort: http