Como configurar alertas e notificações usando o Alertmanager no cluster DOKS

Introdução

Alertas e notificações são partes críticas do seu fluxo de trabalho de implantação. Ao trabalhar com um cluster Kubernetes, muitas vezes você precisa ser notificado imediatamente sobre qualquer problema crítico em seu cluster.

O Alertmanager faz parte do kube-prom-stack instalado em seu cluster na Pilha Prometheus. Ele permite que você receba alertas de várias fontes, como o Prometheus. As regras são criadas no lado do Prometheus, que por sua vez pode disparar alertas. É responsabilidade do Alertmanager interceptar esses alertas, agrupá-los (agregação), aplicar outras transformações e, finalmente, roteá-los para os receptores configurados. As mensagens de notificação podem ser formatadas para incluir detalhes adicionais, se desejado. Você pode usar o Slack, Gmail, etc., para enviar notificações em tempo real.

Nesta seção, você aprenderá como inspecionar os alertas existentes, criar novos e, em seguida, configurar o Alertmanager para enviar notificações via Slack usando o mesmo arquivo de manifesto usado para configurar o Prometheus.

Sumário

Pré-requisitos

Para concluir este tutorial, você precisará de:

  • Conjunto de monitoramento Prometheus instalado em seu cluster conforme explicado em Pilha Prometheus.
  • Conjunto de Loki instalado em seu cluster conforme explicado em Pilha Loki.
  • Aplicativo de Exemplo Emojivoto implantado no cluster. Por favor, siga os passos do repositório principal. Você estará criando alertas para este aplicativo.
  • Privilégios administrativos sobre um espaço de trabalho no Slack. Mais tarde, você estará criando um aplicativo com um webhook de entrada que será usado para enviar notificações do Alertmanager.

Passo 1 – Verificar Alertas Incluídos

O kube-prom-stack possui mais de cem regras já ativadas. Para acessar o console do Prometheus, primeiro faça um encaminhamento de porta para sua máquina local.

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

Abra um navegador da web em localhost:9091 e acesse o item de menu Alertas. Você deve ver alguns Alertas predefinidos e deve parecer com o seguinte:

Clique em qualquer um dos alertas para expandi-lo. Você pode ver informações sobre a expressão que ele consulta, as etiquetas que foram configuradas e as anotações, que são muito importantes do ponto de vista de modelagem. O Prometheus suporta modelagem nas anotações e etiquetas dos alertas. Para mais informações, consulte a documentação oficial.

Passo 2 – Criando um Novo Alerta

Para criar um novo alerta, é necessário adicionar uma nova definição na seção additionalPrometheusRule do arquivo de valores do Helm kube-prom-stack.
Você criará um alerta de exemplo que será acionado se o namespace emojivoto não tiver o número esperado de instâncias. O número esperado de pods para a aplicação emojivoto é 4.

Primeiramente, abra o arquivo 04-setup-observability/assets/manifests/prom-stack-values.yaml fornecido no repositório do Starter Kit, usando um editor de texto de sua escolha (preferencialmente com suporte a lint YAML). Em seguida, descomente o bloco 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'

Por fim, aplique as configurações usando 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"

Para verificar se o alerta foi criado com sucesso, navegue até o Console do Prometheus, clique no item de menu Alertas e identifique o alerta EmojivotioInstanceDown. Ele deve estar visível na parte inferior da lista.

Passo 3 – Configurando o Alertmanager para Enviar Notificações para o Slack

Para concluir esta seção, você precisa ter direitos administrativos sobre um espaço de trabalho do Slack. Isso permitirá que você crie o webhook de entrada necessário nos próximos passos. Você também precisará criar um canal onde deseja receber notificações do Alertmanager.
Você configurará o Alertmanager para percorrer todos os alertas recebidos, imprimindo seus respectivos resumos e descrições em novas linhas.

  1. Abra um navegador da web e acesse https://api.slack.com/apps. Clique no botão Criar novo aplicativo.
  2. Na janela Criar um aplicativo, selecione a opção Do zero. Em seguida, dê um nome para o seu aplicativo e selecione o espaço de trabalho apropriado.
  3. Na página Informações básicas, clique na opção Webhooks de entrada, ative-a e clique no botão Adicionar novo webhook ao espaço de trabalho na parte inferior.
  4. Na próxima página, use a lista suspensa Pesquisar por um canal… para selecionar o canal desejado onde deseja enviar notificações. Quando estiver pronto, clique no botão Permitir.
  5. Copie o valor da URL do webhook exibido na página. Você precisará dela na próxima seção.

Em seguida, você informará ao Alertmanager como enviar notificações para o Slack. Abra o arquivo 04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml fornecido no repositório do Starter Kit usando um editor de texto de sua escolha. Remova o comentário do bloco inteiro alertmanager.config. Certifique-se de atualizar os valores slack_api_url e channel substituindo os espaços reservados <> conforme necessário.

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"
          # combinadores:
          #   - alertname="EmojivotoInstanceDown"
          # continuar: 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 }}"

No arquivo de configuração acima,

  • slack_api_url: URL do webhook do Slack criado no passo 4
  • receivers.[].slack_configs: define o canal do Slack usado para enviar notificações, título da notificação e a mensagem real. Também é possível formatar a mensagem de notificação (ou corpo) com base em seus requisitos.
  • título e texto: itera sobre os alertas disparados e imprime o resumo e a descrição usando o sistema de templating do Prometheus.
  • send_resolved: booleano indicando se o Alertmanager deve enviar uma notificação quando um alerta não estiver mais disparando.

Os parâmetros matcher e continue ainda estão comentados, pois você os descomentará mais tarde no guia. Por enquanto, eles devem permanecer comentados.

Por fim, atualize o kube-prometheus-stack, usando o 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"

Neste ponto, você deve receber notificações do Slack para todos os alertas disparados.

Em seguida, você vai testar se o alerta EmojivotoInstanceDown adicionado anteriormente funciona e envia uma notificação para o Slack, escalonando para baixo o número de réplicas para o deployment /emoji do namespace emojivoto.

A partir do seu terminal, execute o seguinte comando para reduzir o número de réplicas para o deployment /emoji para 0:

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

Abra um navegador da web em localhost:9091 e acesse o item de menu Alertas. Procure pelo alerta EmojivotoInstanceDown criado anteriormente. O status do alerta deve indicar Ativação após cerca de um minuto de escalonamento para baixo da implantação.

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.

Atualmente, todas as ativações de alertas serão enviadas para o canal do Slack. Isso pode causar fadiga de notificação. Para detalhar qual notificação é enviada, você pode restringir o Alertmanager para enviar notificações apenas para alertas que correspondam a determinado padrão. Isso é feito usando o parâmetro matcher.

Abra o arquivo 04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml fornecido no repositório do Starter Kit usando um editor de texto de sua escolha. Descomente todo o bloco alertmanager.config. Certifique-se de descomentar os parâmetros 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 }}"

Por fim, atualize o kube-prometheus-stack, usando o 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"

Agora, você deverá receber alertas apenas do nome do alerta correspondente EmojivotoInstanceDown. Como o continue está definido como falso, o Alertmanager enviará apenas notificações deste alerta e parará de enviá-las para outros.

Clicar no nome da notificação no Slack abrirá um navegador da web para uma página da web inacessível com o DNS interno do Kubernetes do pod Alertmanager. Isso é esperado. Alguns links úteis para você verificar: Para mais informações, você pode verificar o serviço de DNS do pod, parâmetros de configuração para o AlertManager, e alguns exemplos de notificação.

Passo 4 – Depurar um Alerta Disparado

Quando um alerta é disparado e envia uma notificação no Slack, é importante que você possa depurar o problema facilmente e encontrar a causa raiz prontamente. Para fazer isso, você pode usar o Grafana, que já foi instalado nos tutoriais do Prometheus Stack e do Loki Stack.

Crie um encaminhamento de porta para o Grafana na porta 3000:

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

Abra um navegador da web em localhost:3000 e faça login usando as credenciais padrão admin/prom-operator.

Navegue até a seção de Alertas. No filtro de Estado, clique na opção Disparando. Identifique o alerta emojivoto-instance-down definido na seção de Criando um Novo Alerta e expanda-o. Você deverá ver o seguinte:

Clique no botão Ver gráfico. Na próxima página, você poderá observar a contagem para o número de pods no namespace emojivoto exibido como uma métrica. Observe que o Grafana filtra os resultados usando um intervalo de tempo de Última 1 hora por padrão. Ajuste isso para o intervalo de tempo em que o alerta é disparado. Você pode ajustar o intervalo de tempo usando a opção De Para para um resultado mais granular ou usando um Intervalo Rápido como Últimos 30 minutos.

Na aba Explorar, selecione a fonte de dados Loki. No navegador de logs, insira o seguinte: {namespace="emojivoto"} e clique no botão Executar consulta no canto superior direito da página. Você deverá ver o seguinte:

Certifique-se de ajustar o intervalo de tempo conforme necessário.

A partir desta página, você pode filtrar ainda mais os resultados de logs. Por exemplo, para filtrar os logs para o container web-svc do namespace emojivoto, você pode inserir a seguinte consulta: {namespace="emojivoto", container="web-svc"}

Mais explicações sobre o uso do LogQL podem ser encontradas em Passo 3 – Usando LogQL.

Você também pode usar os Eventos Kubernetes Exportados instalados anteriormente e filtrar eventos relacionados ao namespace emojivoto.

Insira a seguinte consulta no navegador de logs: {app="event-exporter"} |= "emojivoto". Isso retornará os eventos do Kubernetes relacionados ao namespace emojivoto.

Conclusão

Neste tutorial, você aprendeu como inspecionar alertas existentes, criar novos e configurar o AlertManager para enviar notificações para o Slack.

Saiba Mais

O próximo passo é configurar o Backup e a Restauração usando o Velero ou o TrilioVault no seu cluster DOKS.

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