تحية للجميع. في شهر مايو ، أطلقت OTUS ورشة عمل حول المراقبة والتسجيل ، لكل من البنية التحتية والتطبيقات ، باستخدام Zabbix و Prometheus و Grafana و ELK. في هذا الصدد ، نشارك تقليديًا مواد مفيدة حول هذا الموضوع.
يسمح لك مُصدِّر Blackbox لـ Prometheus بمراقبة الخدمات الخارجية من خلال HTTP و HTTPS و DNS و TCP و ICMP. في هذه المقالة ، سأوضح لك كيفية تكوين مراقبة HTTP / HTTPS باستخدام مصدر Blackbox. سنطلق مصدر Blackbox في Kubernetes.بيئة
سنحتاج إلى ما يلي:تكوين مصدر Blackbox
نقوم بتكوين Blackbox من خلال ConfigMap
تكوين http
وحدة مراقبة خدمات الويب.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: 5s
تُستخدم الوحدة النمطية http_2xx
للتحقق من أن خدمة الويب تُرجع رمز حالة HTTP 2xx. يتم وصف تكوين مصدر الصندوق الأسود بمزيد من التفصيل في الوثائق .نشر مصدر الصندوق الأسود في مجموعة Kubernetes
وصف Deployment
و Service
للنشر في 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:
resources:
{}
volumeMounts:
- mountPath: /etc/config
name: config
readOnly: true
volumes:
- name: config
configMap:
name: prometheus-blackbox-exporter
يمكن نشر مُصدِّر Blackbox باستخدام الأمر التالي. monitoring
تشير مساحة الاسم إلى عامل تشغيل Prometheus.kubectl --namespace=monitoring apply -f blackbox-exporter.yaml
تحقق من أن جميع الخدمات تعمل باستخدام الأمر التالي:kubectl --namespace=monitoring get all --selector=app=prometheus-blackbox-exporter
تحقق من Blackbox
يمكنك الوصول إلى واجهة ويب Blackbox للمصدر باستخدام port-forward
:kubectl --namespace=monitoring port-forward svc/prometheus-blackbox-exporter 9115:9115
اتصل بواجهة ويب Blackbox للمصدر من خلال متصفح الويب على localhost : 9115.
إذا انتقلت إلى العنوان http: // localhost: 9115 / probe؟ Module = http_2xx & target = https: //www.google.com ، فسترى نتيجة التحقق من عنوان URL المحدد ( https://www.google.com ). تعني قيمة
المقياس probe_success
1 تحقق ناجح. تشير قيمة 0 إلى خطأ.إنشاء بروميثيوس
بعد نشر مصدر BlackBox ، قم بتكوين Prometheus prometheus-additional.yaml
.- job_name: 'kube-api-blackbox'
scrape_interval: 1w
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- https:
- http:
- https:
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: prometheus-blackbox-exporter:9115 # The blackbox exporter.
إنشاء 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
EOF
حدد additional-scrape-configs
عامل بروميثيوس باستخدام additionalScrapeConfigs
.kubectl --namespace=monitoring edit prometheuses k8s
...
spec:
additionalScrapeConfigs:
key: prometheus-additional.yaml
name: additional-scrape-configs
ننتقل إلى واجهة ويب Prometheus ، ونتحقق من المقاييس والأهداف.kubectl --namespace=monitoring port-forward svc/prometheus-k8s 9090:9090

نرى مقاييس وأهداف Blackbox.إضافة قواعد التنبيهات (تنبيه)
لتلقي إشعارات من مصدر Blackbox ، أضف القواعد إلى مشغل Prometheus.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 failed (instance {{ $labels.instance }})"
description: "Probe failed\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
- alert: SlowProbe
expr: avg_over_time(probe_duration_seconds[1m]) > 1
for: 5m
labels:
severity: warning
annotations:
summary: "Slow probe (instance {{ $labels.instance }})"
description: "Blackbox probe took more than 1s to complete\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
- alert: HttpStatusCode
expr: probe_http_status_code <= 199 OR probe_http_status_code >= 400
for: 5m
labels:
severity: error
annotations:
summary: "HTTP Status Code (instance {{ $labels.instance }})"
description: "HTTP status code is not 200-399\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
- alert: SslCertificateWillExpireSoon
expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30
for: 5m
labels:
severity: warning
annotations:
summary: "SSL certificate will expire soon (instance {{ $labels.instance }})"
description: "SSL certificate expires in 30 days\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
- alert: SslCertificateHasExpired
expr: probe_ssl_earliest_cert_expiry - time() <= 0
for: 5m
labels:
severity: error
annotations:
summary: "SSL certificate has expired (instance {{ $labels.instance }})"
description: "SSL certificate has expired already\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
- alert: HttpSlowRequests
expr: avg_over_time(probe_http_duration_seconds[1m]) > 1
for: 5m
labels:
severity: warning
annotations:
summary: "HTTP slow requests (instance {{ $labels.instance }})"
description: "HTTP request took more than 1s\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
- alert: SlowPing
expr: avg_over_time(probe_icmp_duration_seconds[1m]) > 1
for: 5m
labels:
severity: warning
annotations:
summary: "Slow ping (instance {{ $labels.instance }})"
description: "Blackbox ping took more than 1s\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
في واجهة الويب الخاصة بـ Prometheus ، انتقل إلى Status => Rules وابحث عن قواعد التنبيه الخاصة بمصدر Blackbox.
تكوين إخطارات انتهاء صلاحية شهادة SSL لخادم Kubernetes API Server
فلنقم بإعداد مراقبة انتهاء صلاحية شهادات Kubernetes API Server SSL. سوف يرسل إخطارات مرة واحدة في الأسبوع.أضف وحدة مُصدِّر Blackbox لمصادقة خادم Kubernetes API.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: 5s
إضافة تكوين كشط بروميثيوس- job_name: 'kube-api-blackbox'
metrics_path: /probe
params:
module: [kube-api]
static_configs:
- targets:
- https:
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: prometheus-blackbox-exporter:9115 # The blackbox exporter.
تطبيق Prometheus SecretPROMETHEUS_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
EOF
أضف قواعد التنبيه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: "Kubernetes API Server SSL certificate will expire after three months (instance {{ $labels.instance }})"
description: "Kubernetes API Server SSL certificate expires in 90 days\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
روابط مفيدة
المراقبة وتسجيل الدخول في Docker