Про blackbox-exporter я вже колись писав, див. Prometheus: Alertmanager и blackbox-exporter – проверка срока действия SSL и нотификация в Slack, але там було чисто про моніторинг SSL-сертіфікатів, та й було то давно, та й сетапилось все без Кубернетісу та Хельму.
Цього разу трохи детальніше про його сетап і можливості.
Отже, blackbox-exporter – це експортер, який вміє моніторити різноманітні ендпоінти – це можуть бути або якісь URL-и в інтернеті, ваші LoadBalancer-и в Амазоні, або Services в Кубернетесі, такі як MySQL або PostgreSQL бази данних.
Вміє виводити статистику по швидкості відповіді HTTP, коди відповідей, інформацію по SSL-сертіфікатах тощо.
Що будемо робити:
- за допомогую Helm розгорнемо kube-prometehus-stack в Minikube
- додамо сам експортер
- налаштуємо моніторинг ендпоінтів за допомогую ServiceMonitors, які будуть створені через конфіг blackbox-exporter
- подивимось на основні
probes, якими він опитує ендпоінти
Поїхали.
Зміст
Запуск Kube Prometheus Stack
Робити будемо в мінікубі, куди встановимо Prometheus Operator із Helm-репозіторія.
Запускаємо сам Мінікуб:
[simterm]
$ minikube start
[/simterm]
Додаємо репозіторій чартів Prometheus:
[simterm]
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts $ helm repo update
[/simterm]
Створюємо неймспейс:
[simterm]
$ kubectl create ns monitoring
[/simterm]
Встановлюємо kube-prometheus-stack:
[simterm]
$ helm -n monitoring install prometheus prometheus-community/kube-prometheus-stack
[/simterm]
Чекаємо декілька хвилин, поки всі поди стануть Running:
[simterm]
$ kubectl -n monitoring get pod NAME READY STATUS RESTARTS AGE alertmanager-prometheus-kube-prometheus-alertmanager-0 1/2 Running 1 (25s ago) 44s prometheus-grafana-599dbccb79-zlklx 2/3 Running 0 57s prometheus-kube-prometheus-operator-689dd6679c-s66vp 1/1 Running 0 57s prometheus-kube-state-metrics-6cfd96f4c8-84j26 1/1 Running 0 57s prometheus-prometheus-kube-prometheus-prometheus-0 0/2 PodInitializing 0 44s prometheus-prometheus-node-exporter-2h542 1/1 Running 0 57s
[/simterm]
Знаходимо Сервіс Прометеусу:
[simterm]
$ kubectl -n monitoring get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 7s prometheus-grafana ClusterIP 10.97.79.182 <none> 80/TCP 20s prometheus-kube-prometheus-alertmanager ClusterIP 10.106.147.39 <none> 9093/TCP 20s prometheus-kube-prometheus-operator ClusterIP 10.98.222.45 <none> 443/TCP 20s prometheus-kube-prometheus-prometheus ClusterIP 10.107.26.113 <none> 9090/TCP 20s ...
[/simterm]
Прокидуємо порт через port-forward:
[simterm]
$ kubectl -n monitoring port-forward svc/prometheus-kube-prometheus-prometheus 9090:9090
[/simterm]
Відкриваємо http://localhost:9090, та перевіряємо, що все працює:
Запуск blackbox-exporter
Його чарт є в тому ж репозиторії, тож просто встановлюємо експортер:
[simterm]
$ helm -n monitoring upgrade --install prometheus-blackbox prometheus-community/prometheus-blackbox-exporter
[/simterm]
Перевіряємо под:
[simterm]
$ kk -n monitoring get pod NAME READY STATUS RESTARTS AGE prometheus-blackbox-prometheus-blackbox-exporter-6865d9b44h546j 1/1 Running 0 27s ...
[/simterm]
Blackbox тримає свій конфіг в ConfigMap-і, яка підключається до поду і передає дефолтні параметри. Див. тут>>>.
[simterm]
$ kk -n monitoring get cm prometheus-blackbox-prometheus-blackbox-exporter -o yaml
apiVersion: v1
data:
blackbox.yaml: |
modules:
http_2xx:
http:
follow_redirects: true
preferred_ip_protocol: ip4
valid_http_versions:
- HTTP/1.1
- HTTP/2.0
prober: http
timeout: 5s
[/simterm]
Власне, тут ми і бачимо модулі, точніше поки що один, який використвує prober http, який виконує HTTP-запроси до targets, які ще треба додати.
Blackbox та ServiceMonitor
Для того, щоб додати ендпоінти, котрі ми хочемо моніторити, можна використовувати ServiceMonitor, див. конфіг тут>>>.
Чомусь ніде в нагуглених гайдах цей момент толком не описаний, хоча він дуже зручний: в конфіг Блекбоксу додаємо список таргетів, а Блекбокс створює ServiceMonitor для кожного з них, і Prometheus починає їх моніторити.
Створюємо файл blackbox-exporter-values.yaml, в якому додаємо поки що один ендпоінт – просто перевірити, чи воно взагалі працює:
serviceMonitor:
enabled: true
defaults:
labels:
release: prometheus
targets:
- name: google.com
url: https://google.com
Якщо не вказано інше, то Блекбокс використвує дефолтні значення із values.yaml чарту, в данному випадку це буде модуль http_2xx, який виконує GET запрос, та перевіряє код відповіді: якщо отримано 200 – то перевірка пройдена, якщо інший – то фейл.
Оновлюємо Helm-реліз з новим конфігом:
[simterm]
$ helm -n monitoring upgrade --install prometheus-blackbox prometheus-community/prometheus-blackbox-exporter -f blackbox-exporter-values.yaml
[/simterm]
Перевіряємо, чи створився ServiceMonitor
[simterm]
$ kk -n monitoring get servicemonitor NAME AGE prometheus-blackbox-prometheus-blackbox-exporter-google.com 4m43s
[/simterm]
Перевіряємо в Targets самого Прометеусу:
Для кожного Target, який ми вказуємо в конфігурації Блекбоксу, додається окрема scrape job в Прометеусі:
І перевіряємо метріки Блекбоксу:
Основна метрика, яку використую особисто я – це probe_success, яка власне говорить чи пройдена перевірка:
Тут в лейблу target через metricRelabelings підставляється значення з name, яке ми вказали для таргету Блекбокса, а в instance – його URL.
Моніторинг внутрішніх ендпоінтів
Чудово – ми сходили на Гугол, і він робить.
А як щодо перевірки ендпоінтів всередині кластеру?
Візьмемо приклад з nginx із документації Kubernetes, тільки задеплоїмо Под та Сервіс до власного неймпейсу, а не до default.
Створюємо неймспейс:
[simterm]
$ kk create ns test-ns namespace/test-ns created
[/simterm]
Маніфест з подом та Сервісом, лише додаємо свій Namespace:
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: test-ns
labels:
app.kubernetes.io/name: proxy
spec:
containers:
- name: nginx
image: nginx:stable
ports:
- containerPort: 80
name: http-web-svc
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: test-ns
spec:
selector:
app.kubernetes.io/name: proxy
ports:
- name: name-of-service-port
protocol: TCP
port: 80
targetPort: http-web-svc
Деплоїмо:
[simterm]
$ kk apply -f testpod-with-svc.yaml pod/nginx created service/nginx-service created
[/simterm]
Перевіряємо:
[simterm]
$ kk -n test-ns get all NAME READY STATUS RESTARTS AGE pod/nginx 1/1 Running 0 23s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/nginx-service ClusterIP 10.106.58.247 <none> 80/TCP 23s
[/simterm]
Оновлюємо конфіг Blackbox:
serviceMonitor:
enabled: true
defaults:
labels:
release: prometheus
targets:
- name: google.com
url: https://google.com
- name: nginx-test
url: nginx-service.test-ns.svc.cluster.local:80
Оновлюємо сетап екпортеру:
[simterm]
$ helm -n monitoring upgrade --install prometheus-blackbox prometheus-community/prometheus-blackbox-exporter -f blackbox-exporter-values.yaml
[/simterm]
Перевіряємо СервісМонітори ще раз:
[simterm]
$ kk -n monitoring get servicemonitor NAME AGE prometheus-blackbox-prometheus-blackbox-exporter-google.com 12m prometheus-blackbox-prometheus-blackbox-exporter-nginx-test 5s
[/simterm]
І за хвилину – можемо перевіряти probe_success:
Взагалі, не обов’язково вказувати повний URL у вигляді nginx-service.test-ns.svc.cluster.local – достатньо буде servicename.namespace, тобто nginx-service.test-ns, але повний URL як на мене виглядає більш наочно в лейблах та алертах.
Модулі Blackbox Exporter
Все виглядає чудово, поки ми опитуємо звичайний HTTP-ендпоінт, який завжди віддає код 200.
Що як треба перевірити інші коди?
Створимо власний модуль, використвуючи probes Блекбоксу:
config:
modules:
http_4xx:
prober: http
timeout: 5s
http:
method: GET
valid_status_codes: [404, 405]
valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
follow_redirects: true
preferred_ip_protocol: "ip4"
serviceMonitor:
enabled: true
defaults:
labels:
release: prometheus
targets:
- name: google.com
url: https://google.com
- name: nginx-test
url: nginx-service.test-ns.svc.cluster.local:80
- name: nginx-test-404
url: nginx-service.test-ns.svc.cluster.local:80/404
module: http_4xx
Тут в modules задаємо ім’я нового модуля – http_4xx, який пробер він має викорисовувати – http, і параметри для цього пробера – яким саме запитом перевіряємо, і які коди відповіді будемо вважати правильними.
Далі, в Таргетах для nginx-test-404 явно вказуємо використання модулю http_4xx.
Тестування модулів
Окремо подивимось як саме можемо перевірити – чи буде модуль працювати так, як ми розраховуємо.
Все просто – запускаємо тестовий под, і curl-ом з опцією -I дивимось на відповідь ендпоінта.
Якшо перевіряємо TCP-коннект – то telnet.
Отже, створюємо под з Убунтою, підключаємось до нього – запускаємо всередені bash:
[simterm]
$ kk -n monitoring run pod --rm -i --tty --image ubuntu -- bash
[/simterm]
Встановлюємо curl та telnet:
[simterm]
root@pod:/# apt update && apt -y install curl telnet
[/simterm]
Та дивимось – чи працє URL nginx-service.test-ns.svc.cluster.local:80/404:
[simterm]
root@pod:/# curl -I nginx-service.test-ns.svc.cluster.local:80/404 HTTP/1.1 404 Not Found
[/simterm]
404 – як ми і очікували.
Оновлюємо Блекбокс з новим конфігом:
[simterm]
$ helm -n monitoring upgrade --install prometheus-blackbox prometheus-community/prometheus-blackbox-exporter -f blackbox-exporter-values.yaml
[/simterm]
Перевіримо його ConfigMap – чи додався модуль http_4xx, який ми вказали в нашому файлу конфіга:
[simterm]
$ kk -n monitoring get cm prometheus-blackbox-prometheus-blackbox-exporter -o yaml
apiVersion: v1
data:
blackbox.yaml: |
modules:
http_2xx:
http:
follow_redirects: true
preferred_ip_protocol: ip4
valid_http_versions:
- HTTP/1.1
- HTTP/2.0
prober: http
timeout: 5s
http_4xx:
http:
follow_redirects: true
method: GET
preferred_ip_protocol: ip4
valid_http_versions:
- HTTP/1.1
- HTTP/2.0
valid_status_codes:
- 404
- 405
prober: http
timeout: 5s
[/simterm]
І перевіряємо Прометеус:
probe_success{target="nginx-test-404"} == 1 – все робить.
TCP Connect і моніторинг баз данних
Ще один модуль, котрий дуже часто використовуємо – TCP, який просто намагається відкрити TCP-сессію на вказанний URL та порт. Підходить для перевірок баз данних та будь-яких інших не-HTTP-ресурсів.
Запустимо MySQL:
[simterm]
$ helm repo add bitnami https://charts.bitnami.com/bitnami $ helm install mysql bitnami/mysql
[/simterm]
Знаходимо його Сервіс:
[simterm]
$ kk get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 20h mysql ClusterIP 10.99.71.124 <none> 3306/TCP 40s mysql-headless ClusterIP None <none> 3306/TCP 40s
[/simterm]
Оновлюємо конфіг Blackbox:
config:
modules:
...
tcp_connect:
prober: tcp
serviceMonitor:
...
targets:
...
- name: mysql
url: mysql.default.svc.cluster.local:3306
module: tcp_connect
Деплоїмо, і перевіряємо:
Prometheus alerting
За альортінг особливо писати й нема чого – все стандартно, як будь-які інші алерти Прометеусу.
Наприклад ми моніторимо Сервіси Apache Druid з таким алертом (скрін з конфігу Terraform з деякими змінними):
Просто перевіряємо, що probe_success != 1.
Посилання по темі
- Blackbox exporter probes – приклади роботи з probes та модулями













