# 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 提供配置文件：

~~~yaml
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 的抓取设置：

~~~yaml
- 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 中加入抓取任务：

~~~yaml
- 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_success` 和 `probe_duration_seconds` 等来检查历史结果。

## 自带 metrics 端点的服务

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

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

~~~yaml
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
