Come configurare avvisi e notifiche utilizzando Alertmanager nel cluster DOKS

Introduzione

Le notifiche e gli avvisi sono una parte critica del flusso di lavoro di distribuzione. Quando si lavora con un cluster Kubernetes, spesso è necessario essere immediatamente informati su eventuali problemi critici nel cluster.

Alertmanager fa parte dello stack kube-prom-stack installato nel tuo cluster in Prometheus Stack. Consente di ricevere avvisi da varie fonti come Prometheus. Le regole vengono create sul lato di Prometheus, che a loro volta possono generare avvisi. È responsabilità di Alertmanager intercettare tali avvisi, raggrupparli (aggregazione), applicare altre trasformazioni e infine instradarli ai destinatari configurati. I messaggi di notifica possono essere ulteriormente formattati per includere dettagli aggiuntivi se desiderato. Puoi utilizzare Slack, Gmail, ecc. per inviare notifiche in tempo reale.

In questa sezione, imparerai come ispezionare gli avvisi esistenti, crearne di nuovi e quindi configurare Alertmanager per inviare notifiche tramite Slack utilizzando lo stesso file di manifesto utilizzato per configurare Prometheus.

Tabella dei contenuti

Prerequisiti

Per completare questo tutorial, avrai bisogno di:

  • Lo stack di monitoraggio Prometheus installato nel tuo cluster come spiegato in Stack Prometheus.
  • Lo stack Loki installato nel tuo cluster come spiegato in Stack Loki.
  • L’applicazione di esempio Emojivoto è stata distribuita nel cluster. Si prega di seguire i passaggi dal repository principale. Si creeranno avvisi per questa applicazione.
  • Diritti amministrativi su uno spazio di lavoro Slack. In seguito, si creerà un’applicazione con un webhook in ingresso che verrà utilizzato per inviare notifiche da Alertmanager.

Passo 1 – Controllare gli Avvisi Inclusi

kube-prom-stack ha già oltre cento regole attivate. Per accedere alla console di Prometheus, effettuare prima un port-forward sulla propria macchina locale.

kubectl --namespace monitoring port-forward svc/kube-prom-stack-kube-prome-prometheus 9091:9090

Aprire un browser web su localhost:9091 e accedere alla voce di menu Avvisi. Dovresti vedere alcuni Avvisi predefiniti e dovrebbe apparire come segue:

Fare clic su uno qualsiasi degli avvisi per espanderlo. È possibile visualizzare informazioni sull’espressione che interroga, le etichette che sono state impostate e le annotazioni che sono molto importanti dal punto di vista del template. Prometheus supporta il templating nelle annotazioni e nelle etichette degli avvisi. Per ulteriori informazioni, consultare la documentazione ufficiale.

Passaggio 2 – Creazione di un Nuovo Avviso

Per creare un nuovo avviso, è necessario aggiungere una nuova definizione nella sezione additionalPrometheusRule del file dei valori di Helm kube-prom-stack.
Creerai un esempio di avviso che verrà attivato se lo spazio dei nomi emojivoto non ha un numero previsto di istanze. Il numero previsto di pod per l’applicazione emojivoto è 4.

Innanzitutto, apri il file 04-setup-observability/assets/manifests/prom-stack-values.yaml fornito nel repository del kit di avvio, utilizzando un editor di testo a tua scelta (preferibilmente con supporto per il controllo YAML). Poi, decommenta il blocco additionalPrometheusRules.

additionalPrometheusRulesMap:
  rule-name:
    groups:
    - name: emojivoto-instance-down
      rules:
        - alert: EmojivotoInstanceDown
          expr: sum(kube_pod_owner{namespace="emojivoto"}) by (namespace) < 4
          for: 1m
          labels:
            severity: 'critical'
          annotations:
            description: ' The Number of pods from the namespace {{ $labels.namespace }} is lower than the expected 4. '
            summary: 'Pod {{ $labels.pod }} down'

Infine, applica le impostazioni utilizzando helm:

HELM_CHART_VERSION="35.5.1"

helm upgrade kube-prom-stack prometheus-community/kube-prometheus-stack --version "${HELM_CHART_VERSION}" \
--namespace monitoring \
-f "04-setup-observability/assets/manifests/prom-stack-values-v${HELM_CHART_VERSION}.yaml"

Per verificare che l’avviso sia stato creato con successo, vai alla Console di Prometheus, clicca su Avvisi e identifica l’avviso EmojivotioInstanceDown. Dovrebbe essere visibile in fondo all’elenco.

Passaggio 3 – Configura Alertmanager per Inviare Notifiche a Slack

Per completare questa sezione, è necessario disporre dei diritti amministrativi su uno spazio di lavoro Slack. Ciò ti consentirà di creare il webhook in entrata di cui avrai bisogno nei passaggi successivi. Dovrai anche creare un canale dove desideri ricevere le notifiche da Alertmanager.
Configurerai Alertmanager per scansionare tutti gli avvisi ricevuti stampando i rispettivi riassunti e descrizioni su nuove linee.

  1. Apri un browser web e vai su https://api.slack.com/apps. Clicca sul pulsante Crea nuova app.
  2. Nella finestra Crea un’app, seleziona l’opzione Da zero. Quindi, dai un nome alla tua applicazione e seleziona lo spazio di lavoro appropriato.
  3. Dalla pagina Informazioni di base, clicca sull’opzione Webhook in entrata, attivala e clicca sul pulsante Aggiungi nuovo webhook allo spazio di lavoro in fondo.
  4. Nella pagina successiva, utilizza il menu a discesa Cerca un canale… per selezionare il canale desiderato dove vuoi inviare le notifiche. Quando sei pronto, clicca sul pulsante Consenti.
  5. Copia il valore dell’URL del webhook visualizzato sulla pagina. Ne avrai bisogno nella sezione successiva.

Successivamente, indicherai ad Alertmanager come inviare le notifiche su Slack. Apri il file 04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml fornito nel repository del Kit di Avvio utilizzando un editor di testo a tua scelta. Rimuovi il commento dall’intero blocco alertmanager.config. Assicurati di aggiornare i valori slack_api_url e channel sostituendo i segnaposto <> di conseguenza.

alertmanager:
  enabled: true
  config:
    global:
      resolve_timeout: 5m
      slack_api_url: "<YOUR_SLACK_APP_INCOMING_WEBHOOK_URL_HERE>"
    route:
      receiver: "slack-notifications"
      repeat_interval: 12h
      routes:
        - receiver: "slack-notifications"
          # corrispondenze:
          #   - alertname="EmojivotoInstanceDown"
          # continua: falso
    receivers:
      - name: "slack-notifications"
        slack_configs:
          - channel: "#<YOUR_SLACK_CHANNEL_NAME_HERE>"
            send_resolved: true
            title: "{{ range .Alerts }}{{ .Annotations.summary }}\n{{ end }}"
            text: "{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}"

Nella configurazione sopra,

  • slack_api_url: URL webhook Slack in ingresso creato nel passaggio 4
  • receivers.[].slack_configs: definisce il canale Slack utilizzato per inviare le notifiche, il titolo della notifica e il messaggio effettivo. È anche possibile formattare il messaggio di notifica (o corpo) in base alle proprie esigenze.
  • title e text: scorrono le allerte attive e stampano il riepilogo e la descrizione utilizzando il sistema di modelli di Prometheus.
  • send_resolved: booleano che indica se Alertmanager dovrebbe inviare una notifica quando un’avviso non è più attivo.

I parametri matcher e continue sono ancora commentati poiché verranno decommentati successivamente nella guida. Per ora, dovrebbero rimanere commentati.

Infine, esegui l’aggiornamento dello stack kube-prometheus, utilizzando helm:

HELM_CHART_VERSION="35.5.1"

helm upgrade kube-prom-stack prometheus-community/kube-prometheus-stack --version "${HELM_CHART_VERSION}" \
--namespace monitoring \
-f "04-setup-observability/assets/manifests/prom-stack-values-v${HELM_CHART_VERSION}.yaml"

A questo punto, dovresti ricevere notifiche Slack per tutte le allerte attive.

Successivamente, testerai se l’allerta EmojivotoInstanceDown aggiunta precedentemente funziona e invia una notifica a Slack ridimensionando il numero di repliche per il deployment /emoji dello spazio dei nomi emojivoto.

Dal terminale, esegui il seguente comando per portare il numero di repliche per il deployment /emoji a 0:

kubectl scale --replicas=0 deployment/emoji -n emojivoto

Apri un browser web su localhost:9091 e accedi alla voce di menu Alerts. Cerca l’allarme EmojivotoInstanceDown creato in precedenza. Lo stato dell’allarme dovrebbe indicare Firing dopo circa un minuto di ridimensionamento del deployment.

A message notification will be sent to Slack to the channel you configured earlier if everything goes well. You should see the “The Number of pods from the namespace emojivoto is lower than the expected 4.” alert in the Slack message as configured in the annotations.description config of the additionalPrometheusRulesMap block.

Attualmente, tutte le attivazioni degli allarmi verranno inviate al canale Slack. Questo può causare affaticamento da notifica. Per analizzare meglio quali notifiche vengono inviate, è possibile limitare Alertmanager a inviare notifiche solo per gli allarmi che corrispondono a un determinato modello. Ciò viene fatto utilizzando il parametro matcher.

Apri il file 04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml fornito nel repository Starter Kit utilizzando un editor di testo a tua scelta. Rimuovi il commento dall’intero blocco alertmanager.config. Assicurati di rimuovere il commento dai parametri matcher e continue:

config:
  global:
    resolve_timeout: 5m
    slack_api_url: "<YOUR_SLACK_APP_INCOMING_WEBHOOK_URL_HERE>"
  route:
    receiver: "slack-notifications"
    repeat_interval: 12h
    routes:
      - receiver: "slack-notifications"
        matchers:
          - alertname="EmojivotoInstanceDown"
        continue: false
  receivers:
    - name: "slack-notifications"
      slack_configs:
        - channel: "#<YOUR_SLACK_CHANNEL_NAME_HERE>"
          send_resolved: true
          title: "{{ range .Alerts }}{{ .Annotations.summary }}\n{{ end }}"
          text: "{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}"

Infine, esegui l’aggiornamento dello stack kube-prometheus-stack, utilizzando helm:

HELM_CHART_VERSION="35.5.1"

helm upgrade kube-prom-stack prometheus-community/kube-prometheus-stack --version "${HELM_CHART_VERSION}" \
--namespace monitoring \
-f "04-setup-observability/assets/manifests/prom-stack-values-v${HELM_CHART_VERSION}.yaml"

Ora dovresti ricevere solo le notifiche corrispondenti al nome dell’allarme EmojivotoInstanceDown. Poiché il parametro continue è impostato su false, Alertmanager invierà solo notifiche da questo allarme e smetterà di inviarle agli altri.

Cliccando sul nome della notifica in Slack si aprirà un browser web su una pagina web non raggiungibile con il DNS interno di Kubernetes del pod Alertmanager. Questo è previsto. Alcuni link utili da controllare: Per ulteriori informazioni, puoi consultare servizio pod DNS, Parametri di configurazione per AlertManager, e alcuni Esempi di notifica.

Passaggio 4 – Risoluzione dei problemi di un’allerta attiva

Quando un’allerta viene attivata e invia una notifica in Slack, è importante che tu possa risolvere facilmente il problema e trovare prontamente la causa principale. Per fare ciò, puoi fare uso di Grafana che è già stato installato nei tutorial Stack Prometheus e Stack Loki.

Crea un port forwarding per Grafana sulla porta 3000:

kubectl --namespace monitoring port-forward svc/kube-prom-stack-grafana 3000:80

Apri un browser web su localhost:3000 e accedi utilizzando le credenziali predefinite admin/prom-operator.

Passa alla sezione Allerta. Dal filtro Stato, clicca sull’opzione Fuoco. Identifica l’allerta emojivoto-instance-down definita nella sezione Creazione di una nuova allerta ed espandila. Dovresti vedere quanto segue:

Clicca sul pulsante Vedi grafico. Dalla pagina successiva, puoi osservare il conteggio per il numero di pod nello spazio dei nomi emojivoto visualizzato come metrica. Tieni presente che Grafana filtra i risultati utilizzando un intervallo di tempo di Ultima ora per impostazione predefinita. Regola questo all’intervallo di tempo in cui scatta l’allarme. Puoi regolare l’intervallo di tempo utilizzando l’opzione Da A per un risultato più granulare o utilizzando un Intervallo rapido come Ultimi 30 minuti.

Dalla scheda Esplora, seleziona la sorgente dati Loki. Nel browser di log inserisci quanto segue: {namespace="emojivoto"} e clicca sul pulsante Esegui query in alto a destra della pagina. Dovresti vedere quanto segue:

Assicurati di regolare l’intervallo di tempo di conseguenza.

Da questa pagina, puoi filtrare ulteriormente i risultati del log. Ad esempio, per filtrare i log per il contenitore web-svc dello spazio dei nomi emojivoto, puoi inserire la seguente query: {namespace="emojivoto", container="web-svc"}

Maggiori spiegazioni sull’utilizzo di LogQL possono essere trovate in Passaggio 3 – Utilizzo di LogQL.

Puoi anche utilizzare gli Eventi Kubernetes esportati installati in precedenza e filtrare gli eventi relativi allo spazio dei nomi emojivoto.

Inserisci la seguente query nel browser dei log: {app="event-exporter"} |= "emojivoto". Questo restituirà gli eventi Kubernetes correlati allo spazio dei nomi emojivoto.

Conclusione

In questo tutorial, hai imparato come ispezionare gli alert esistenti, crearne di nuovi e configurare AlertManager per inviare notifiche a Slack.

Per saperne di più

Il prossimo passo è impostare il Backup e il Ripristino utilizzando Velero o TrilioVault nel tuo cluster DOKS.

Source:
https://www.digitalocean.com/community/developer-center/how-to-set-up-alerts-and-notification-using-alertmanager-in-doks-cluster