🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 概述 在监控体系里面,通常我们认为监控分为:`白盒监控` 和 `黑盒监控`。 黑盒监控:主要关注的现象,一般都是正在发生的东西,例如出现一个告警,业务接口不正常,那么这种监控就是站在用户的角度能看到的监控,重点在于能对正在发生的故障进行告警。 白盒监控:主要关注的是原因,也就是系统内部暴露的一些指标,例如 redis 的 info 中显示 redis slave down,这个就是 redis info 显示的一个内部的指标,重点在于原因,可能是在黑盒监控中看到 redis down,而查看内部信息的时候,显示 redis port is refused connection。 # Blackbox Exporter Blackbox Exporter 是 Prometheus 社区提供的官方黑盒监控解决方案,其允许用户通过:HTTP、HTTPS、DNS、TCP 以及 ICMP 的方式对网络进行探测。 1. HTTP 测试 定义 Request Header 信息 判断 Http status / Http Respones Header / Http Body 内容 2. TCP 测试 业务组件端口状态监听 应用层协议定义与监听 3. ICMP 测试 主机探活机制 4. POST 测试 接口联通性 5. SSL 证书过期时间 详细的配置请查看[黑盒监控官方文档](https://github.com/prometheus/blackbox_exporter/blob/master/CONFIGURATION.md) # 安装Blackbox Exporter 安装blackbox exporter的yaml文件 ```yaml apiVersion: v1 kind: ConfigMap metadata: name: prometheus-blackbox-exporter namespace: kube-mon data: blackbox.yml: |- modules: http_2xx: # 这里写的名称是定义,Prometheus的使用该名称即可 prober: http timeout: 10s http: valid_http_versions: ["HTTP/1.1", "HTTP/2"] valid_status_codes: [] method: GET preferred_ip_protocol: "ip4" http_post_2xx: # http post 监测模块 prober: http timeout: 10s http: valid_http_versions: ["HTTP/1.1", "HTTP/2"] method: POST preferred_ip_protocol: "ip4" tcp_connect: prober: tcp timeout: 10s icmp: prober: icmp timeout: 10s icmp: preferred_ip_protocol: "ip4" --- apiVersion: apps/v1 kind: Deployment metadata: name: blackbox-exporter namespace: kube-mon spec: replicas: 1 selector: matchLabels: app: blackbox-exporter template: metadata: labels: app: blackbox-exporter spec: containers: - name: blackbox-exporter image: prom/blackbox-exporter:v0.19.0 imagePullPolicy: IfNotPresent args: - --config.file=/etc/blackbox_exporter/blackbox.yml - --log.level=debug - --web.listen-address=:9115 ports: - containerPort: 9115 name: blackbox-port protocol: TCP readinessProbe: failureThreshold: 3 initialDelaySeconds: 5 periodSeconds: 10 successThreshold: 1 tcpSocket: port: 9115 timeoutSeconds: 5 resources: limits: cpu: 200m memory: 60Mi requests: cpu: 100m memory: 50Mi volumeMounts: - mountPath: /etc/blackbox_exporter name: config volumes: - configMap: defaultMode: 420 name: prometheus-blackbox-exporter name: config --- apiVersion: v1 kind: Service metadata: name: blackbox-exporter namespace: kube-mon spec: type: ClusterIP selector: app: blackbox-exporter ports: - name: http port: 9115 ``` 启动blackbox_exporter ```shell kubectl apply -f blackbox-exporter.yaml ``` # Prometheus使用黑盒监控网页 ## 监控有域名解析的网页 **prometheus配置如下** ```yaml - job_name: "target-http-probe" # 使用blackbox exporter的接口 metrics_path: /probe params: # http_2xx 是于blackbox exporter的 `configMap` 中的配置文件名称一致 module: [ http_2xx ] # 这里使用文件发现的方式,可以随时添加和删减网页的监控 file_sd_configs: - files: - targets/http*.yml relabel_configs: # 用targets/http*.yml的网页域名替换原instance的值 - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance # 用blackbox-exporter的service地址值"prometheus-blackbox-exporter:9115"替换原__address__的值 - target_label: __address__ replacement: blackbox-exporter:9115 ``` 这里演示的网页是 `baidu.com` ,所有主机有网且有配置正确的dns都可以访问到该域名。因为该域名是有在dns域名服务上做解析的。 ```yaml apiVersion: v1 kind: ConfigMap metadata: name: targets-files-sd-config namespace: kube-mon data: # 如果有多个文件的话,也可以写在同一个configmap中的。 http.yml: | - targets: - baidu.com ``` 更新配置文件以及重新reload Prometheus服务 ```shell kubectl apply -f prometheus-config.yaml configmap/prometheus-config unchanged configmap/targets-files-sd-config configured curl -X POST "http://`kubectl -n kube-mon get endpoints prometheus -o jsonpath={.subsets[0].addresses[0].ip}`:9090/-/reload" ``` **Prometheus展示** ![targets00](https://img.kancloud.cn/71/5f/715f1eafac25a683c030dd0643349477_1618x764.png) ![targets01](https://img.kancloud.cn/2e/92/2e9256c4754b03e3d97665c477f97bc2_1920x330.png) ## 监控没有域名解析的网页 例如Prometheus使用nginx-ingress作为网关,给外部系统通过域名来访问集群内部的Prometheus。现在需要通过Prometheus来检查域名的状态是否为200状态码。 这里只需要在http.yml文件中添加一个域名即可。稍等几分钟即可在Prometheus看到 ```yaml apiVersion: v1 kind: ConfigMap metadata: name: prometheus-files-sd-config namespace: kube-mon data: http.yml: | - targets: - baidu.com - www.ecloud.com/prometheus ``` 只需要更新configMap即可 ```shell kubectl apply -f prometheus-config.yaml configmap/prometheus-config unchanged configmap/prometheus-files-sd configured ``` **Prometheus展示** ![targets03](https://img.kancloud.cn/23/fc/23fc353e44eb8dc6e9b1f85c35ff6a7a_1561x309.png) ![targets04](https://img.kancloud.cn/e6/d8/e6d8279bf3b1344fa76311276d630a5d_1913x302.png) 从promSQL获取到的域名 `www.ecloud.com/prometheus` 的状态码为403。出现该原因是blockbox exporter直接使用dns服务器解析 `www.ecloud.com` 的域名(可以通过查看blockbox exporter日志发现问题)。固然这不是我们想要的结果。从尝试过将设置域名映射为本地IP地址,但是发现是无效的。 解决方法: `blockbox exporter`容器先使用内部的dns服务进行域名解析,如果解析不成功,会通过 `/etc/resolv.conf` 的域名解析地址进行解析。 所以只需要在内部dns服务添加A记录进行解析即可。 ```shell # 添加A记录 kubectl -n kube-system edit cm coredns apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 5s } ready kubernetes cluster.local. in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } # 添加hosts{}的字段,有多个域名加添加多行 # 【注意】最后一行固定是fallthrough hosts { 192.168.31.188 www.ecloud.com fallthrough } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 } cache 30 loop reload loadbalance } # 重启coredns服务 kubectl -n kube-system delete pod -l k8s-app=kube-dns pod "coredns-8587764bd6-b898r" deleted pod "coredns-8587764bd6-tlxpd" deleted pod "coredns-8587764bd6-tts8x" deleted ``` 再次查看PromSQL就可以看到状态码为200了。 ![targets](https://img.kancloud.cn/08/ce/08ce5cc0fd834718a451fa92eee02a59_1920x297.png) # prometheus使用黑盒监控service资源 ## http检测 **prometheus配置如下** ```yaml - job_name: "service-http-probe" scrape_interval: 1m metrics_path: /probe # 使用blackbox exporter配置文件的http_2xx的探针 params: module: [ http_2xx ] kubernetes_sd_configs: - role: service relabel_configs: # 保留service注释有prometheus.io/scrape: true和prometheus.io/http-probe: true - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape, __meta_kubernetes_service_annotation_prometheus_io_http_probe] action: keep regex: true;true # 将原标签名__meta_kubernetes_service_name改成service_name - source_labels: [__meta_kubernetes_service_name] action: replace regex: (.*) target_label: service_name # 将原标签名__meta_kubernetes_namespace改成namespace - source_labels: [__meta_kubernetes_namespace] action: replace regex: (.*) target_label: namespace # 将instance改成 `clusterIP:port` 地址 - source_labels: [__meta_kubernetes_service_cluster_ip, __meta_kubernetes_service_annotation_prometheus_io_http_probe_port, __meta_kubernetes_service_annotation_pr ometheus_io_http_probe_path] action: replace regex: (.*);(.*);(.*) target_label: __param_target replacement: $1:$2$3 - source_labels: [__param_target] target_label: instance # 将__address__的值改成 `blackbox-exporter:9115` - target_label: __address__ replacement: blackbox-exporter:9115 ``` > 总结:需要service服务使用http-probe监控。则需要在service上添加注释必须有以下三行 > prometheus.io/http-probe: "true"、prometheus.io/scrape: "true" 和 prometheus.io/http-probe-port: "8002" > 如果域名上下文不是为 `/` 的话,需要在注释添加 prometheus.io/http-probe-path: "/test/demo" 更新配置文件以及重新reload Prometheus服务 ```shell kubectl apply -f prometheus-config.yaml configmap/prometheus-config configured curl -X POST "http://`kubectl -n kube-mon get endpoints prometheus -o jsonpath={.subsets[0].addresses[0].ip}`:9090/-/reload" ``` **Prometheus展示** ![](https://img.kancloud.cn/b1/ec/b1ece795bfd579f0e2fa6f8d5c16ab66_1702x240.png) ![](https://img.kancloud.cn/52/c1/52c13324101d13219dce6ea48c5e3e97_1274x251.png) ## tcp检测 ```yaml - job_name: "service-tcp-probe" scrape_interval: 1m metrics_path: /probe # 使用blackbox exporter配置文件的tcp_connect的探针 params: module: [ tcp_connect ] kubernetes_sd_configs: - role: service relabel_configs: # 保留prometheus.io/scrape: "true"和prometheus.io/tcp-probe: "true"的service - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape, __meta_kubernetes_service_annotation_prometheus_io_tcp_probe] action: keep regex: true;true # 将原标签名__meta_kubernetes_service_name改成service_name - source_labels: [__meta_kubernetes_service_name] action: replace regex: (.*) target_label: service_name # 将原标签名__meta_kubernetes_service_name改成service_name - source_labels: [__meta_kubernetes_namespace] action: replace regex: (.*) target_label: namespace # 将instance改成 `clusterIP:port` 地址 - source_labels: [__meta_kubernetes_service_cluster_ip, __meta_kubernetes_service_annotation_prometheus_io_http_probe_port] action: replace regex: (.*);(.*) target_label: __param_target replacement: $1:$2 - source_labels: [__param_target] target_label: instance # 将__address__的值改成 `blackbox-exporter:9115` - target_label: __address__ replacement: blackbox-exporter:9115 ``` > 总结:需要service服务使用http-probe监控。则需要在service上添加注释必须有以下三行 > prometheus.io/tcp-probe: "true"、prometheus.io/scrape: "true" 和 prometheus.io/http-probe-port: "xxx" 更新配置文件以及重新reload Prometheus服务 ```shell kubectl apply -f prometheus-config.yaml configmap/prometheus-config configured curl -X POST "http://`kubectl -n kube-mon get endpoints prometheus -o jsonpath={.subsets[0].addresses[0].ip}`:9090/-/reload" ``` **Prometheus展示** ![](https://img.kancloud.cn/69/89/69894ade15a34e1e0f1724c5a3f18f70_1612x210.png)