Hallo zusammen. Im Mai startet OTUS , sowohl für Infrastruktur als auch für Anwendungen mit Zabbix, Prometheus, Grafana und ELK. Aus diesem Grund teilen wir traditionell nützliche Materialien zu diesem Thema.
für Prometheus ermöglicht das Monitoring externer Dienste über HTTP, HTTPS, DNS, TCP, ICMP. In diesem Artikel zeige ich Ihnen, wie Sie HTTP/HTTPS-Monitoring mit dem Blackbox-Exporter einrichten. Wir werden den Blackbox-Exporter in Kubernetes betreiben.
Umgebung
Wir benötigen Folgendes:
- Kubernetes
- Prometheus Operator
Konfiguration des Blackbox-Exporters
Wir konfigurieren die Blackbox über ConfigMap zur Einstellung http des Moduls für das Monitoring von Webdiensten.
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-blackbox-exporter
labels:
app: prometheus-blackbox-exporter
data:
blackbox.yaml: |
modules:
http_2xx:
http:
no_follow_redirects: false
preferred_ip_protocol: ip4
valid_http_versions:
- HTTP/1.1
- HTTP/2
valid_status_codes: []
prober: http
timeout: 5sModul http_2xx wird verwendet, um zu überprüfen, dass der Webdienst den HTTP-Statuscode 2xx zurückgibt. Weitere Informationen zur Konfiguration des Blackbox-Exporters finden Sie in der .
Deployment des Blackbox-Exporters im Kubernetes-Cluster
Beschreiben Sie Deployment und Service für das Deployment in Kubernetes.
---
kind: Service
apiVersion: v1
metadata:
name: prometheus-blackbox-exporter
labels:
app: prometheus-blackbox-exporter
spec:
type: ClusterIP
ports:
- name: http
port: 9115
protocol: TCP
selector:
app: prometheus-blackbox-exporter
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus-blackbox-exporter
labels:
app: prometheus-blackbox-exporter
spec:
replicas: 1
selector:
matchLabels:
app: prometheus-blackbox-exporter
template:
metadata:
labels:
app: prometheus-blackbox-exporter
spec:
restartPolicy: Always
containers:
- name: blackbox-exporter
image: "prom/blackbox-exporter:v0.15.1"
imagePullPolicy: IfNotPresent
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
args:
- "--config.file=/config/blackbox.yaml"
resources:
{}
ports:
- containerPort: 9115
name: http
livenessProbe:
httpGet:
path: /health
port: http
readinessProbe:
httpGet:
path: /health
port: http
volumeMounts:
- mountPath: /config
name: config
- name: configmap-reload
image: "jimmidyson/configmap-reload:v0.2.2"
imagePullPolicy: "IfNotPresent"
securityContext:
runAsNonRoot: true
runAsUser: 65534
args:
- --volume-dir=/etc/config
- --webhook-url=http://localhost:9115/-/reload
resources:
{}
volumeMounts:
- mountPath: /etc/config
name: config
readOnly: true
volumes:
- name: config
configMap:
name: prometheus-blackbox-exporterDer Blackbox-Exporter kann mit dem folgenden Befehl bereitgestellt werden. Namespace monitoring bezieht sich auf den Prometheus-Operator.
kubectl --namespace=monitoring apply -f blackbox-exporter.yamlStellen Sie sicher, dass alle Dienste laufen, indem Sie den folgenden Befehl verwenden:
kubectl --namespace=monitoring get all --selector=app=prometheus-blackbox-exporterÜberprüfung der Blackbox
Sie können auf die Weboberfläche des Blackbox-Exporters zugreifen über port-forward:
kubectl --namespace=monitoring port-forward svc/prometheus-blackbox-exporter 9115:9115Verbinden Sie sich über einen Webbrowser mit der Weboberfläche des Blackbox-Exporters unter :9115.

Wenn Sie die Adresse aufrufen , sehen Sie das Ergebnis der Überprüfung der angegebenen URL ().

Metrikwert probe_success gleich 1 bedeutet eine erfolgreiche Überprüfung. Ein Wert von 0 weist auf einen Fehler hin.
Konfiguration von Prometheus
Nachdem der BlackBox-Exporter bereitgestellt wurde, konfigurieren wir Prometheus in prometheus-additional.yaml.
- job_name: 'kube-api-blackbox'
scrape_interval: 1w
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- https://www.google.com
- http://www.example.com
- https://prometheus.io
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: prometheus-blackbox-exporter:9115 # Der Blackbox-Exporter.Generierung von Secret, indem Sie den folgenden Befehl verwenden.
PROMETHEUS_ADD_CONFIG=$(cat prometheus-additional.yaml | base64)
cat << EOF | kubectl --namespace=monitoring apply -f -
apiVersion: v1
kind: Secret
metadata:
name: additional-scrape-configs
type: Opaque
data:
prometheus-additional.yaml: $PROMETHEUS_ADD_CONFIG
EOFAngeben additional-scrape-configs für den Prometheus Operator, unter Verwendung von additionalScrapeConfigs.
kubectl --namespace=monitoring edit prometheuses k8s
...
spec:
additionalScrapeConfigs:
key: prometheus-additional.yaml
name: additional-scrape-configsÖffnen Sie die Weboberfläche von Prometheus, um Metriken und Ziele zu überprüfen.
kubectl --namespace=monitoring port-forward svc/prometheus-k8s 9090:9090

Sie sehen die Metriken und Ziele von Blackbox.
Hinzufügen von Regeln für Benachrichtigungen (Alert)
Um Benachrichtigungen vom Blackbox-Exporter zu erhalten, fügen wir Regeln im Prometheus Operator hinzu.
kubectl --namespace=monitoring edit prometheusrules prometheus-k8s-rules
...
- name: blackbox-exporter
rules:
- alert: ProbeFailed
expr: probe_success == 0
for: 5m
labels:
severity: error
annotations:
summary: "Probe fehlgeschlagen (Instanz {{ $labels.instance }})"
description: "Probe fehlgeschlagenn WERT = {{ $value }}n LABELS: {{ $labels }}"
- alert: SlowProbe
expr: avg_over_time(probe_duration_seconds[1m]) > 1
for: 5m
labels:
severity: warning
annotations:
summary: "Langsame Probe (Instanz {{ $labels.instance }})"
description: "Die Blackbox-Probe dauerte mehr als 1s zur Fertigstellungn WERT = {{ $value }}n LABELS: {{ $labels }}"
- alert: HttpStatusCode
expr: probe_http_status_code = 400
for: 5m
labels:
severity: error
annotations:
summary: "HTTP-Statuscode (Instanz {{ $labels.instance }})"
description: "HTTP-Statuscode ist nicht 200-399n WERT = {{ $value }}n LABELS: {{ $labels }}"
- alert: SslCertificateWillExpireSoon
expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30
for: 5m
labels:
severity: warning
annotations:
summary: "SSL-Zertifikat läuft bald ab (Instanz {{ $labels.instance }})"
description: "SSL-Zertifikat läuft in 30 Tagen abn WERT = {{ $value }}n LABELS: {{ $labels }}"
- alert: SslCertificateHasExpired
expr: probe_ssl_earliest_cert_expiry - time() 1
for: 5m
labels:
severity: warning
annotations:
summary: "Langsame HTTP-Anfragen (Instanz {{ $labels.instance }})"
description: "HTTP-Anfrage dauerte mehr als 1sn WERT = {{ $value }}n LABELS: {{ $labels }}"
- alert: SlowPing
expr: avg_over_time(probe_icmp_duration_seconds[1m]) > 1
for: 5m
labels:
severity: warning
annotations:
summary: "Langsame Ping (Instanz {{ $labels.instance }})"
description: "Blackbox-Ping dauerte mehr als 1sn WERT = {{ $value }}n LABELS: {{ $labels }}"Im Web-Interface von Prometheus gehen Sie zu Status => Regeln und finden Sie die Benachrichtigungsregeln für den blackbox-exporter.

Konfiguration von Benachrichtigungen über das Ablaufen von SSL-Zertifikaten für den Kubernetes API Server.
Lassen Sie uns das Monitoring für das Ablaufen von SSL-Zertifikaten des Kubernetes API Servers einrichten. Es wird einmal pro Woche Benachrichtigungen senden.
Fügen wir das Blackbox-Exporter-Modul für die Authentifizierung des Kubernetes API Servers hinzu.
kubectl --namespace=monitoring edit configmap prometheus-blackbox-exporter
...
kube-api:
http:
methode: GET
no_follow_redirects: false
bevorzugtes_ip_protokoll: ip4
tls_config:
insecure_skip_verify: false
ca_datei: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_datei: /var/run/secrets/kubernetes.io/serviceaccount/token
gültige_http_versionen:
- HTTP/1.1
- HTTP/2
gültige_status_codes: []
prober: http
timeout: 5sFügen wir die Scrape-Konfiguration für Prometheus hinzu.
- job_name: 'kube-api-blackbox'
metrics_path: /probe
params:
modul: [kube-api]
static_configs:
- targets:
- https://kubernetes.default.svc/api
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: prometheus-blackbox-exporter:9115 # Der blackbox-exporter.Wenden wir das Prometheus Secret an.
PROMETHEUS_ADD_CONFIG=$(cat prometheus-additional.yaml | base64)
cat << EOF | kubectl --namespace=monitoring apply -f -
apiVersion: v1
kind: Secret
metadata:
name: additional-scrape-configs
type: Opaque
data:
prometheus-additional.yaml: $PROMETHEUS_ADD_CONFIG
EOFFügen wir die Benachrichtigungsregeln hinzu.
kubectl --namespace=monitoring edit prometheusrules prometheus-k8s-rules
...
- name: k8s-api-server-cert-expiry
rules:
- alert: K8sAPIServerSSLCertExpiringAfterThreeMonths
expr: probe_ssl_earliest_cert_expiry{job="kube-api-blackbox"} - time() < 86400 * 90
for: 1w
labels:
severity: warning
annotations:
summary: "Das SSL-Zertifikat des Kubernetes API Servers läuft in drei Monaten ab (Instanz {{ $labels.instance }})"
description: "Das SSL-Zertifikat des Kubernetes API Servers läuft in 90 Tagen abn WERT = {{ $value }}n LABELS: {{ $labels }}"Nützliche Links
Quelle: habr.com
