Hallo zusammen. Im Mai startet OTUS , sowohl für Infrastrukturen als auch für Anwendungen mit Zabbix, Prometheus, Grafana und ELK. In diesem Zusammenhang teilen wir traditionell nützliche Materialien zu diesem Thema.
für Prometheus ermöglicht die Überwachung externer Dienste über HTTP, HTTPS, DNS, TCP, ICMP. In diesem Artikel zeige ich Ihnen, wie Sie HTTP/HTTPS-Überwachung mit dem Blackbox-Exporter einrichten. Wir werden den Blackbox-Exporter in Kubernetes ausführen.
Umgebung
Wir brauchen Folgendes:
- Kubernetes
- Prometheus Operator
Konfiguration des Blackbox-Exporters
Wir konfigurieren Blackbox über ConfigMap zur Einrichtung http des Moduls zur Überwachung 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, ob der Webdienst den HTTP-Statuscode 2xx zurückgibt. Die Konfiguration des Blackbox-Exporters ist detailliert beschrieben in .
Bereitstellung des Blackbox-Exporters im Kubernetes-Cluster
Beschreiben Sie Deployment und Service für die Bereitstellung 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. Der Namespace monitoring bezieht sich auf den Prometheus-Operator.
kubectl --namespace=monitoring apply -f blackbox-exporter.yamlStellen Sie sicher, dass alle Dienste mit dem folgenden Befehl ausgeführt werden:
kubectl --namespace=monitoring get all --selector=app=prometheus-blackbox-exporterBlackbox-Überprüfung
Sie können auf die Weboberfläche des Blackbox-Exporters zugreifen unter 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 der Adresse :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. Der Wert 0 zeigt einen Fehler an.
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.Generieren wir Geheimnis, indem wir 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
EOFGeben Sie an 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-configsGehen Sie zur Weboberfläche von Prometheus und überprüfen Sie die Metriken und Ziele.
kubectl --namespace=monitoring port-forward svc/prometheus-k8s 9090:9090

Wir sehen die Metriken und Ziele des Blackbox.
Hinzufügen von Regeln für Benachrichtigungen (alert)
Um Benachrichtigungen vom Blackbox-Exporter zu erhalten, fügen wir Regeln zum 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 ETIKETTEN: {{ $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: "Blackbox-Probe dauerte mehr als 1s zur Vervollständigungn WERT = {{ $value }}n ETIKETTEN: {{ $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 ETIKETTEN: {{ $labels }}"
- alert: SslCertificateWillExpireSoon
expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30
for: 5m
labels:
severity: warning
annotations:
summary: "SSL-Zertifikat wird bald ablaufen (Instanz {{ $labels.instance }})"
description: "SSL-Zertifikat läuft in 30 Tagen abn WERT = {{ $value }}n ETIKETTEN: {{ $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 ETIKETTEN: {{ $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 ETIKETTEN: {{ $labels }}"Im Webinterface von Prometheus gehen Sie zum Abschnitt Status => Regeln und suchen Sie die Alarmeinstellungen für den Blackbox-Exporter.

Einrichtung 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 Sie das Blackbox-Exportermodul für die Authentifizierung des Kubernetes API-Servers hinzu.
kubectl --namespace=monitoring edit configmap prometheus-blackbox-exporter
...
kube-api:
http:
method: GET
no_follow_redirects: false
preferred_ip_protocol: ip4
tls_config:
insecure_skip_verify: false
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
valid_http_versions:
- HTTP/1.1
- HTTP/2
valid_status_codes: []
prober: http
timeout: 5sFügen Sie die Scrape-Konfiguration für Prometheus hinzu.
- job_name: 'kube-api-blackbox'
metrics_path: /probe
params:
module: [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.Verwenden von Prometheus Secret
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
EOFWir fügen Alarmregeln 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
