• DevOps
  • Защита информации
  • ИТ-поддержка
  • Настройка связки grafana+prometheus с уведомлениями в telegram

    Prometheus-operator (на текущий момент проект называется kube-prometheus-stack) позволяет из коробки получить базово настроенный мониторинг кластера kubernetes на основе популярной связки prometheus+grafana.

    К сожалению, для решения реальных задач настроек по умолчанию недостаточно, ведь может понадобиться подключать к мониторингу дополнительные объекты, создавать кастомные уведомления, настраивать отправку уведомлений в мессенджер. Рассмотрим пример базовой конфигурации prometheus-operator, позволяющей решать эти задачи.

    Создаем папку prometheus-operator, которая будет содержать наши кастомные values-prod.yaml для helm-чарта и папку с манифестами telegram-alertmanager, решения, используемого в качестве “посредника” для отправки алертов в telegram.

    Нужна помощь? Настройки grafana, prometheus мы осуществляем в рамках услуги DevOps-аутсорсинг. Также возможны разовые проектные работы.

    Содержимое папки telegram-alertmanager. Манифест Telegram-alertmanager.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
       name: telegram-alertmanager
       namespace: prometheus-operator
       labels:
         app: telegram
    spec:
       template:
         metadata:
           name: telegram-alertmanager
           labels:
             app: telegram
         spec:
           containers:
             - name: telegram-alertmanager
               image: janwh/alertmanager-telegram
               ports:
                 - containerPort: 8080
               env:
                 - name: TELEGRAM_CHAT_ID
                   value: "-5842051ХХ"
                 - name: TELEGRAM_TOKEN
                   value: "1457321396:AAGB8bUYwY8yGZchAiitrHOpUYb_7YuХХХХ"
       replicas: 1
       selector:
         matchLabels:
           app: telegram
    

    В указанном выше манифесте необходимо поменять параметры namespace, telegram_chat_id и telegram_token, указав свои значения.

    Манифест service-telegram.yaml:

    apiVersion: v1
    kind: Service
    metadata:
     labels:
       app: telegram
     name: telegram-alertmanager
     namespace: prometheus-operator
    spec:
     type: ClusterIP
     selector:
       app: telegram
     ports:
       - protocol: TCP
         port: 8080
    

    Создадим yaml-файл со значениями параметров нашего prometheus-operatora:

    additionalPrometheusRules:
     - name: my-rule-file
       groups:
         - name: test
           rules:
             - alert: HaproxyServerDown
               expr: haproxy_server_up != 0
               for: 0m
               labels:
                 severity: critical
               annotations:
                 summary: HAProxy server down (instance {{ $labels.instance }})
             #              description: HAProxy server is down\n  VALUE = {{ $value }}\n  LABELS: { { $labels } }
    
             - alert: NodeNetworkInterfaceFlapping
               expr: changes(node_network_up{device!~"veth.+",job="node-exporter"}[2m])> 2
               for: 2m
               labels:
                 severity: warning
               annotations:
                 message: Network interface "{{ $labels.device }}" changing it's up status often on node-exporter {{ $labels.namespace }}/{{ $labels.pod }}"
    
    alertmanager:
     config:
       global:
         resolve_timeout: 5m
       route:
         group_by: ['alertname', 'instance', 'job']
         group_wait: 30s
         group_interval: 5m
         repeat_interval: 12h
         receiver: 'null'
         routes:
           - match:
               alertname: Watchdog
             receiver: 'telegram'
             continue: true
           - match_re:
               severity: ^(none|warning|critical)$
             receiver: 'telegram'
       receivers:
         - name: 'telegram'
           webhook_configs:
             - url: 'http://telegram-alertmanager:8080/alerts'
               send_resolved: true
         - name: 'null'
    
     ingress:
       enabled: true
       annotations:
         kubernetes.io/ingress.class: nginx
         external-dns.alpha.kubernetes.io/target: "monitoring.dom"
       hosts:
         - alertmanager.dom
       paths:
         - /
    
    grafana:
     enabled: true
     namespaceOverride: ""
     defaultDashboardsEnabled: true
     adminPassword: prom-operator
     ingress:
       enabled: true
       annotations:
         kubernetes.io/ingress.class: "nginx"
         external-dns.alpha.kubernetes.io/target: "monitoring.dom"
       hosts:
         - grafana.dom
    
    prometheus:
     ingress:
       enabled: true
       annotations:
         kubernetes.io/ingress.class: "nginx"
         external-dns.alpha.kubernetes.io/target: "monitoring.dom"
       hosts:
         - prometheus.dom
    
     prometheusSpec:
       additionalScrapeConfigs:
         - job_name: 'linux vm'
           static_configs:
           - targets: [ '172.28.7.139:9100' ]
         - job_name: 'win-exporter'
           static_configs:
           - targets: [ '172.28.7.128:9182' ]
         - job_name: 'rabbit'
           static_configs:
           - targets: [ '172.28.7.139:9419' ]
    

    В разделе additionalPrometheusRules описанного выше файла указываем необходимые кастомные алерты, в разделе alertmanager описываем получателя наших алертов, в grafana. Указываем пароль админа и адрес нашего экземпляра grafana, в PrometheusSpec указываем объекты, которые необходимо мониторить нашей связкой prometheus+grafana.

    Данный пример лишь один из возможных вариантов базовой настройки, позволяет получить базовое понимание параметризации helm-чарта prometheus-operatora; на его основе возможно быстро оптимизировать параметры под нужды своей инфраструктуры.

    Запустим установку в кластер telegram-alertmanager:

    kubectl apply -f telegram-alertmanager/.

    Запустим установку prometheus-operator:

    helm repo add stable https://charts.helm.sh/stable
    helm repo update
    helm upgrade -i prometheus-operator stable/prometheus-operator  --atomic --namespace prometheus-operator --values values-prod.yaml
    

    После запуска всех сущностей в кластере kubernetes, получили решение, позволяющие гибко оптимизировать параметры стека prometheus+grafana и получать в мессенджер информацию об уведомлениях (алертах).

    Не нашли ответа на свой вопрос?
    Содержание