Kubernetes + Blackbox 实现对 Web 和 DNS 的简单监控

其实都在这里了: https://github.com/prometheus/blackbox_exporter/blob/master/CONFIGURATION.md

Prometheus 带有很多有针对性的 Exporter,能够对 MySQL、Apache 或者 ElasticSearch 等服务 器进行监控,另外还有 Blackbox Exporter 用于对 http dns tcp 等零散目标进行简单监控。

DNS 的监控

首先需要运行一个 Blackbox 的 Deployment,并利用 Configmap 来为 Blackbox 提供配置文件:

apiVersion: v1
data:
  config.yml: |
    modules:
      http_2xx:  # http 检测模块
        prober: http
        http:
      http_post_2xx: # http post 模块
        prober: http
        http:
          method: POST
      tcp_connect: # tcp 检测模块
        prober: tcp
      dns:  # dns 检测模块
        prober: dns
        dns:
          transport_protocol: "tcp"
          preferred_ip_protocol: "ip4"
          query_name: "kubernetes.default.svc.cloud.ctrm"  # 利用这个域名来检查 dns 服务器
          query_type: "A"  # 如果是 kube-dns ,一定要加入这个
kind: ConfigMap
metadata:
  name: blackbox
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: blackbox
spec:
  template:
    metadata:
      labels:
        name: blackbox
    spec:
      containers:
      - image: prom/blackbox-exporter:v0.8.1
        name: blackbox
        ports:
        - containerPort: 9115
        volumeMounts:
        - name: config
          mountPath: /etc/blackbox_exporter
        args:
        - --config.file=/etc/blackbox_exporter/config.yml # Configmap 中的配置文件
        - --log.level=error  # 错误级别控制
      volumes:
      - name: config
        configMap:
          name: blackbox
---
apiVersion: v1
kind: Service
metadata:
  name: blackbox
spec:
  selector:
    name: blackbox
  ports:
  - port: 80
    targetPort: 9115          

使用kubectl apply命令运行起来。

接下来需要在 Prometheus 的配置文件中加入对 BlackBox 的抓取设置:

- job_name: "kubernetes-service-dns"
  metrics_path: /probe # 不是 metrics,是 probe
  params:
    module: [dns] # DNS 模块
  static_configs:
  - targets:
    - kube-dns:53 # 不要省略端口号
  relabel_configs:
  - source_labels: [__address__]
    target_label: __param_target
  - source_labels: [__param_target]
    target_label: instance
  - target_label: __address__
    replacement: blackbox # 服务地址,和上面的 Service 定义保持一致

重启 Prometheus,或者利用 curl Post 更新配置。打开 Prometheus 的 Target 页面,就会看到 上面定义的kubernetes-service-dns任务了,回到 Graph 页面,可以使用 probe_success{job="kubernetes-service-dns"}来查看检测历史结果。

HTTP 监控

上面的配置文件中提到有一个http_2xx的模块,这里我们可以使用他对 http 服务进行检测。

这里主要是对不受我们控制的外部服务的快速检测。 内部的方法就丰富多了。

因为前面已经给 Blackbox 配置了 http_2xx 模块,所以这里只需要在 Prometheus 中加入抓取任务:

- job_name: "business-service-liveness"
  metrics_path: /probe
  params:
    module: [http_2xx]  
  static_configs:
  - targets:
    - http://192.168.51.129:30001 # 要检查的网址
    - http://192.168.51.129:30004
    - http://192.168.51.129:30003
  relabel_configs:
  - source_labels: [__address__]
    target_label: __param_target
  - source_labels: [__param_target]
    target_label: instance
  - target_label: __address__
    replacement: blackbox-exporter:9115

同样的,重新载入之后,可以使用probe_successprobe_duration_seconds等来检查历史结果。

自带 metrics 端点的服务

有的服务,例如prometheus或者blackbox,以及kube-dnsetcd等, 都是自有/metrics提供指标输出的,这种服务对 Blackbox + Prometheus 组合是非常方便的。

只要给服务的注解部分加入几个标签:

prometheus.io/host: calico-etcd # 服务名称
prometheus.io/port: "6666" # metrics 端口
prometheus.io/scrape: "true" # 抓取开关

上面是 calico 的 etcd 服务加入的注解,服务中有了上述注解之后,Prometheus 的示例配置中,已经 有了针对这一配置的监控方法,直接刷新 Target 页面,就会看到新的监控目标,可以进行使用了。而无需 为每个服务分别定制 Target。

https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml