# ============================================================================= # 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