Ciao a tutti. A maggio, OTUS lancia , sia dell'infrastruttura che delle applicazioni, utilizzando Zabbix, Prometheus, Grafana ed ELK. In questo contesto, condividiamo tradizionalmente materiali utili sull'argomento.
per Prometheus consente di monitorare servizi esterni tramite HTTP, HTTPS, DNS, TCP e ICMP. In questo articolo vi mostrerò come configurare il monitoraggio HTTP/HTTPS utilizzando l'esportatore Blackbox. Avvieremo l'esportatore Blackbox in Kubernetes.
Ambiente
Avremo bisogno di quanto segue:
- Kubernetes
- Prometheus Operator
Configurazione dell'esportatore Blackbox
Configuriamo Blackbox tramite ConfigMap per configurare http il modulo di monitoraggio dei servizi web.
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: 5sModulo http_2xx viene utilizzato per verificare che il servizio web restituisca un codice di stato HTTP 2xx. Maggiori dettagli sulla configurazione dell'esportatore Blackbox sono descritti in .
Deployment dell'esportatore Blackbox nel cluster Kubernetes
Descrivete Deployment e Service per il deployment in Kubernetes.
---
kind: Servizio
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-exporterIl Blackbox exporter può essere distribuito con il seguente comando. Spazio dei nomi monitoraggio riferito a Prometheus Operator.
kubectl --namespace=monitoraggio apply -f blackbox-exporter.yamlAssicurati che tutti i servizi siano in esecuzione utilizzando il seguente comando:
kubectl --namespace=monitoraggio get all --selector=app=prometheus-blackbox-exporterVerifica Blackbox
Puoi accedere all'interfaccia web del Blackbox exporter tramite port-forward:
kubectl --namespace=monitoraggio port-forward svc/prometheus-blackbox-exporter 9115:9115Collegati all'interfaccia web del Blackbox exporter attraverso il browser web all'indirizzo :9115.

Se accedi all'indirizzo , vedrai il risultato della verifica dell'URL fornito ().

Valore della metrica probe_success uguale a 1 significa verifica riuscita. Un valore di 0 indica un errore.
Configurazione di Prometheus
Dopo aver distribuito il BlackBox exporter, configuriamo 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 # Il blackbox exporter.Generiamo Secret, utilizzando il seguente comando.
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
EOFIndichiamo additional-scrape-configs per il Prometheus Operator, utilizzando additionalScrapeConfigs.
kubectl --namespace=monitoring edit prometheuses k8s
...
spec:
additionalScrapeConfigs:
key: prometheus-additional.yaml
name: additional-scrape-configsAccediamo all'interfaccia web di Prometheus, verifichiamo metriche e obiettivi.
kubectl --namespace=monitoring port-forward svc/prometheus-k8s 9090:9090

Vediamo le metriche e gli obiettivi di Blackbox.
Aggiunta di regole per le notifiche (alert)
Per ricevere notifiche dall'esportatore Blackbox, aggiungeremo regole nel Prometheus Operator.
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 fallita (istanza {{ $labels.instance }})"
description: "Probe fallita
VALORE = {{ $value }}
ETICHETTE: {{ $labels }}"
- alert: SlowProbe
expr: avg_over_time(probe_duration_seconds[1m]) > 1
for: 5m
labels:
severity: warning
annotations:
summary: "Probe lenta (istanza {{ $labels.instance }})"
description: "La probe blackbox ha impiegato più di 1s per completarsi
VALORE = {{ $value }}
ETICHETTE: {{ $labels }}"
- alert: HttpStatusCode
expr: probe_http_status_code = 400
for: 5m
labels:
severity: error
annotations:
summary: "Codice di stato HTTP (istanza {{ $labels.instance }})"
description: "Il codice di stato HTTP non è compreso tra 200 e 399
VALORE = {{ $value }}
ETICHETTE: {{ $labels }}"
- alert: SslCertificateWillExpireSoon
expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30
for: 5m
labels:
severity: warning
annotations:
summary: "Il certificato SSL scadrà presto (istanza {{ $labels.instance }})"
description: "Il certificato SSL scade tra 30 giorni
VALORE = {{ $value }}
ETICHETTE: {{ $labels }}"
- alert: SslCertificateHasExpired
expr: probe_ssl_earliest_cert_expiry - time() 1
for: 5m
labels:
severity: warning
annotations:
summary: "Richieste HTTP lente (istanza {{ $labels.instance }})"
description: "La richiesta HTTP ha impiegato più di 1s
VALORE = {{ $value }}
ETICHETTE: {{ $labels }}"
- alert: SlowPing
expr: avg_over_time(probe_icmp_duration_seconds[1m]) > 1
for: 5m
labels:
severity: warning
annotations:
summary: "Ping lento (istanza {{ $labels.instance }})"
description: "Il ping blackbox ha impiegato più di 1s
VALORE = {{ $value }}
ETICHETTE: {{ $labels }}"Nel'interfaccia web di Prometheus, vai alla sezione Status => Rules e trova le regole di notifica per blackbox-exporter.

Configura le notifiche per la scadenza dei certificati SSL del Kubernetes API Server.
Impostiamo il monitoraggio della scadenza dei certificati SSL del Kubernetes API Server. Invierà notifiche una volta alla settimana.
Aggiungiamo il modulo Blackbox exporter per l'autenticazione del Kubernetes API Server.
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: 5sAggiungiamo la configurazione di scrape di Prometheus.
- 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 # Il blackbox exporter.Applichiamo il Secret di Prometheus.
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
EOFAggiungiamo le regole di notifica.
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: "Il certificato SSL del server API Kubernetes scadrà tra tre mesi (istanza {{ $labels.instance }})"
description: "Il certificato SSL del server API Kubernetes scade in 90 giornin VALORE = {{ $value }}n ETICHETTE: {{ $labels }}"Link utili
Fonte: habr.com
