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 no Conjunto Prometheus. Ele permite que você receba alertas de várias fontes como o Prometheus. Regras são criadas no lado do Prometheus, que por sua vez podem disparar alertas. É responsabilidade do Alertmanager interceptar esses alertas, agrupá-los (agregação), aplicar outras transformações e, finalmente, enviá-los para os receptores configurados. 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 completar este tutorial, você precisará de:

  • Conjunto de monitoramento Prometheus instalado em seu cluster conforme explicado em Conjunto Prometheus.
  • Conjunto Loki instalado em seu cluster conforme explicado em Conjunto Loki.
  • Aplicativo de Exemplo Emojivoto implantado no cluster. Siga os passos do repositório principal. Você estará criando alertas para este aplicativo.
  • Permissões administrativas sobre um espaço de trabalho do 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

kube-prom-stack já possui mais de cem regras 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ê deverá ver alguns Alertas predefinidos e deve se 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 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, você precisa adicionar uma nova definição na seção additionalPrometheusRule do arquivo de valores do Helm kube-prom-stack.
Você irá criar um alerta de exemplo que será acionado se o namespace emojivoto não tiver um número esperado de instâncias. O número esperado de pods para a aplicação emojivoto é 4.

Primeiro, abra o arquivo 04-setup-observability/assets/manifests/prom-stack-values.yaml fornecido no repositório 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 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"

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. Deve estar visível no final da lista.

Passo 3 – Configurar 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 Procurar 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á dele 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. Descomente todo o bloco alertmanager.config. Certifique-se de atualizar os valores slack_api_url e channel substituindo os espaços reservados <> de acordo.

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"
          # correspondentes:
          #   - 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 configuração acima,

  • slack_api_url: URL do webhook de entrada do Slack criada na etapa 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 modelagem 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.

Finalmente, faça o upgrade do kube-prometheus-stack, 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"

Neste ponto, você deverá 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 diminuindo o número de réplicas para a implantação /emoji do namespace emojivoto.

Do seu terminal, execute o seguinte comando para reduzir o número de réplicas para a implantação /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 Disparando após cerca de um minuto de redução 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, todos os disparos de alerta serão enviados para o canal do Slack. Isso pode causar fadiga de notificação. Para analisar qual notificação é enviada, você pode restringir o Alertmanager a 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. Remova os comentários de 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 apenas alertas do nome de alerta correspondente EmojivotoInstanceDown. Como o continue está definido como falso, o Alertmanager enviará notificações apenas 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 conferir 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 Acionado

Quando um alerta é acionado 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 fazer uso do Grafana, que já foi instalado nos tutoriais do Conjunto Prometheus e Conjunto Loki.

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ê pode observar a contagem do número de pods no namespace emojivoto exibida 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 quando 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 guia de Exploração, selecione a fonte de dados Loki. No navegador de Log, insira o seguinte: {namespace="emojivoto"} e clique no botão Executar consulta do lado 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 log. Por exemplo, para filtrar os logs para o contêiner 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 utilizar os Eventos do 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 ao Slack.

Saiba Mais

O próximo passo é configurar o Backup e 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