<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>blackbox | 伪架构师</title>
    <link>/tags/blackbox/</link>
      <atom:link href="/tags/blackbox/index.xml" rel="self" type="application/rss+xml" />
    <description>blackbox</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Tue, 19 Sep 2017 23:26:45 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>blackbox</title>
      <link>/tags/blackbox/</link>
    </image>
    
    <item>
      <title>Kubernetes &#43; Blackbox 实现对 Web 和 DNS 的简单监控</title>
      <link>/post/blackbox-monitor-dns-web/</link>
      <pubDate>Tue, 19 Sep 2017 23:26:45 +0800</pubDate>
      <guid>/post/blackbox-monitor-dns-web/</guid>
      <description>

&lt;blockquote&gt;
&lt;p&gt;其实都在这里了：
&lt;a href=&#34;https://github.com/prometheus/blackbox_exporter/blob/master/CONFIGURATION.md&#34; target=&#34;_blank&#34;&gt;https://github.com/prometheus/blackbox_exporter/blob/master/CONFIGURATION.md&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;h2 id=&#34;dns-的监控&#34;&gt;DNS 的监控&lt;/h2&gt;

&lt;p&gt;首先需要运行一个 Blackbox 的 Deployment，并利用 Configmap 来为 Blackbox 提供配置文件：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;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: &amp;quot;tcp&amp;quot;
          preferred_ip_protocol: &amp;quot;ip4&amp;quot;
          query_name: &amp;quot;kubernetes.default.svc.cloud.ctrm&amp;quot;  # 利用这个域名来检查 dns 服务器
          query_type: &amp;quot;A&amp;quot;  # 如果是 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
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;使用 &lt;code&gt;kubectl apply&lt;/code&gt; 命令运行起来。&lt;/p&gt;

&lt;p&gt;接下来需要在 Prometheus 的配置文件中加入对 BlackBox 的抓取设置：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;- job_name: &amp;quot;kubernetes-service-dns&amp;quot;
  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 定义保持一致
&lt;/code&gt;&lt;/pre&gt;

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

&lt;h2 id=&#34;http-监控&#34;&gt;HTTP 监控&lt;/h2&gt;

&lt;p&gt;上面的配置文件中提到有一个 &lt;code&gt;http_2xx&lt;/code&gt; 的模块，这里我们可以使用他对 http 服务进行检测。&lt;/p&gt;

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

&lt;p&gt;因为前面已经给 Blackbox 配置了 http_2xx 模块，所以这里只需要在 Prometheus 中加入抓取任务：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;- job_name: &amp;quot;business-service-liveness&amp;quot;
  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
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;同样的，重新载入之后，可以使用 &lt;code&gt;probe_success&lt;/code&gt; 和 &lt;code&gt;probe_duration_seconds&lt;/code&gt; 等来检查历史结果。&lt;/p&gt;

&lt;h2 id=&#34;自带-metrics-端点的服务&#34;&gt;自带 metrics 端点的服务&lt;/h2&gt;

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

&lt;p&gt;只要给服务的注解部分加入几个标签：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;prometheus.io/host: calico-etcd # 服务名称
prometheus.io/port: &amp;quot;6666&amp;quot; # metrics 端口
prometheus.io/scrape: &amp;quot;true&amp;quot; # 抓取开关
&lt;/code&gt;&lt;/pre&gt;

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

&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml&#34; target=&#34;_blank&#34;&gt;https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
  </channel>
</rss>
