图片来源:https://unsplash.com/photos/BjjwEf0BRkAgit
前面咱们主要介绍了 Prometheus 下如何进行白盒监控,咱们监控主机的资源用量、容器的运行状态、数据库中间件的运行数据、自动发现 Kubernetes 集群中的资源等等,这些都是支持业务和服务的基础设施,经过白盒可以了解其内部的实际运行状态,经过对监控指标的观察可以预判可能出现的问题,从而对潜在的不肯定因素进行优化。而从完整的监控逻辑的角度,除了大量的应用白盒监控之外,还应该添加适当的 Blackbox(黑盒)监控,黑盒监控即以用户的身份测试服务的外部可见性,常见的黑盒监控包括 HTTP探针、 TCP探针 等用于检测站点或者服务的可访问性,以及访问效率等。github
黑盒监控相较于白盒监控最大的不一样在于黑盒监控是以故障为导向当故障发生时,黑盒监控能快速发现故障,而白盒监控则侧重于主动发现或者预测潜在的问题。一个完善的监控目标是要可以从白盒的角度发现潜在问题,可以在黑盒的角度快速发现已经发生的问题。数据库
Blackbox Exporter 是 Prometheus 社区提供的官方黑盒监控解决方案,其容许用户经过:HTTP、 HTTPS、 DNS、 TCP 以及 ICMP 的方式对网络进行探测。api
一样首先须要在 Kubernetes 集群中运行 blackbox-exporter 服务,一样经过一个 ConfigMap 资源对象来为 Blackbox 提供配置,以下所示:(prome-blackbox.yaml)网络
apiVersion: v1 kind: ConfigMap metadata: name: blackbox-config namespace: kube-mon data: blackbox.yml: |- modules: http_2xx: # http 检测模块 Blockbox-Exporter 中全部的探针均是以 Module 的信息进行配置 prober: http timeout: 10s http: valid_http_versions: ["HTTP/1.1", "HTTP/2"] valid_status_codes: [200] # 这里最好做一个返回状态码,在grafana做图时,有明示---陈刚注释。 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: # TCP 检测模块 prober: tcp timeout: 10s dns: # DNS 检测模块 prober: dns dns: transport_protocol: "tcp" # 默认是 udp preferred_ip_protocol: "ip4" # 默认是 ip6 query_name: "kubernetes.default.svc.cluster.local" --- apiVersion: apps/v1 kind: Deployment metadata: name: blackbox namespace: kube-mon spec: selector: matchLabels: app: blackbox template: metadata: labels: app: blackbox spec: containers: - image: prom/blackbox-exporter:v0.16.0 name: blackbox args: - --config.file=/etc/blackbox_exporter/blackbox.yml # ConfigMap 中的配置文件 - --log.level=error # 错误级别控制 ports: - containerPort: 9115 volumeMounts: - name: config mountPath: /etc/blackbox_exporter volumes: - name: config configMap: name: blackbox-config --- apiVersion: v1 kind: Service metadata: name: blackbox namespace: kube-mon spec: selector: app: blackbox ports: - port: 9115 targetPort: 9115
直接建立上面的资源清单:app
$ kubectl apply -f prome-blackbox.yaml configmap/blackbox-config created deployment.apps/blackbox created service/blackbox created
而后须要在 Prometheus 的配置文件中加入对 BlackBox 的抓取设置,以下所示:curl
apiVersion: v1 kind: ConfigMap metadata: name: prometheus-config namespace: kube-mon data: prometheus.yml: | global: scrape_interval: 15s scrape_timeout: 15s scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: "kubernetes-service-dns" metrics_path: /probe # 不是 metrics,是 probe params: module: [dns] # 使用 DNS 模块 static_configs: - targets: - kube-dns.kube-system:53 # 不要省略端口号 relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: blackbox:9115 # 服务地址,和上面的 Service 定义保持一致
首先获取 targets 实例的 address 值写进 param_target, _param<name> 形式的标签里的 name 和它的值会被添加到发送到黑盒的 http 的 header 的 params 看成键值,例如 param_module 对应 params 里的 module。而后获取 __param_target 的值,并覆写到 instance 标签中,覆写 Target 实例的 address 标签值为 BlockBoxExporter 实例的访问地址,向 blackbox:9115 发送请求获取实例的 metrics 信息。而后更新配置:tcp
$ kubectl apply -f prometheus-cm.yaml configmap/prometheus-config configured # 隔一下子执行 reload 操做 $ curl -X POST "http://10.244.3.174:9090/-/reload" # promethues pod ip
打开 Prometheus 的 Target 页面,就会看到 上面定义的 kubernetes-service-dns 任务了:ide
回到 Graph 页面,可使用 probe_success{job="kubernetes-service-dns"} 来查看检测结果,这样就实现了对 DNS 的黑盒监控。post
除了 DNS 的配置外,上面咱们还配置了一个 http_2xx 的模块,也就是 HTTP 探针,HTTP 探针是进行黑盒监控时最经常使用的探针之一,经过 HTTP 探针可以对网站或者 HTTP 服务创建有效的监控,包括其自己的可用性,以及用户体验相关的如响应时间等等。除了可以在服务出现异常的时候及时报警,还能帮助系统管理员分析和优化网站体验。这里咱们可使用他来对 http 服务进行检测。
由于前面已经给 Blackbox 配置了 http_2xx 模块,因此这里只须要在 Prometheus 中加入抓取任务,这里咱们能够结合前面的 Prometheus 的服务发现功能来作黑盒监控,对于 Service 和 Ingress 类型的服务发现,用来进行黑盒监控是很是合适的,配置以下所示:
- job_name: 'kubernetes-http-services' metrics_path: /probe params: module: [http_2xx] # 使用定义的http模块 kubernetes_sd_configs: - role: service # service 类型的服务发现 relabel_configs: # 只有service的annotation中配置了 prometheus.io/http_probe=true 的才进行发现 - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_http_probe] action: keep regex: true - source_labels: [__address__] target_label: __param_target - target_label: __address__ replacement: blackbox:9115 - source_labels: [__param_target] target_label: instance - action: labelmap regex: __meta_kubernetes_service_label_(.+) - source_labels: [__meta_kubernetes_namespace] target_label: kubernetes_namespace - source_labels: [__meta_kubernetes_service_name] target_label: kubernetes_name - job_name: 'kubernetes-ingresses' metrics_path: /probe params: module: [http_2xx] # 使用定义的http模块 kubernetes_sd_configs: - role: ingress # ingress 类型的服务发现 relabel_configs: # 只有ingress的annotation中配置了 prometheus.io/http_probe=true的才进行发现 - source_labels: [__meta_kubernetes_ingress_annotation_prometheus_io_http_probe] action: keep regex: true - source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path] regex: (.+);(.+);(.+) replacement: ${1}://${2}${3} target_label: __param_target - target_label: __address__ replacement: blackbox:9115 - source_labels: [__param_target] target_label: instance - action: labelmap regex: __meta_kubernetes_ingress_label_(.+) - source_labels: [__meta_kubernetes_namespace] target_label: kubernetes_namespace - source_labels: [__meta_kubernetes_ingress_name] target_label: kubernetes_name
咱们结合前面的服务发现功能,经过过滤 prometheus.io/http_probe=true 的 Service 和 Ingress 才进行 HTTP 探针类型的黑盒监控,其余配置和上面配置 dns 监控的时候是一致的。而后更新配置:
$ kubectl apply -f prometheus-cm.yaml configmap/prometheus-config configured # 隔一下子执行reload操做 $ curl -X POST "http://10.244.3.174:9090/-/reload"
打开 Prometheus 的 Target 页面,就会看到 上面定义的两个任务了:
可是如今尚未任何数据,这是由于上面是匹配 __meta_kubernetes_ingress_annotation_prometheus_io_http_probe 这个元信息,因此若是咱们须要让这两个任务发现的话须要在 Service 或者 Ingress 中配置对应的 annotation:
annotation: prometheus.io/http-probe: "true"
好比在咱们本身的一个 Ingress 对象中添加上面这个 annotation:
$ kubectl get ingress fe-trait-ingress -o yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: ...... prometheus.io/http-probe: "true" # 用于黑盒监控 ...... spec: rules: - host: todo.qikqiak.com http: paths: - backend: serviceName: fe servicePort: 3000 path: /app(/|$)(.*) status: loadBalancer: {}
这个时候咱们查看到 Ingress 这个任务下面已经有抓取任务了:
好比如今咱们可使用 probe_duration_seconds 来检查监控结果:
对于 Service 是同样的,固然若是你须要对监控的路径、端口这些作控制,咱们能够本身在 relabel_configs 中去作相应的配置,好比咱们想对 Service 的黑盒作自定义配置,能够想下面这样配置:
- source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_namespace, __meta_kubernetes_service_annotation_prometheus_io_http_probe_port, __meta_kubernetes_service_annotation_prometheus_io_http_probe_path] action: replace target_label: __param_target regex: (.+);(.+);(.+);(.+) replacement: $1.$2:$3$4
这样咱们就须要在 Service 中配置这样的 annotation 了:
annotation: prometheus.io/http-probe: "true" prometheus.io/http-probe-port: "8080" prometheus.io/http-probe-path: "/healthz"
这样咱们就完成了 HTTP 探针的黑盒监控,除此以外,咱们还能够配置 TCP 的监控,上面咱们已经配置了这个模块,你们能够本身尝试去配置下。
除了支持对 HTT P协议进行网络探测之外,Blackbox 还支持对 TCP、DNS、ICMP 等其余网络协议,感兴趣的读者能够从 Blackbox 的 Github 项目中获取更多使用信息。
Prometheus 配置文件能够参考官方仓库:https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml
Blackbox 的配置文件能够参考官方参考:https://github.com/prometheus/blackbox_exporter/blob/master/example.yml