探针管理

目录

功能概述

平台的探针功能基于 Blackbox Exporter 实现,允许用户通过 ICMP、TCP 或 HTTP 对网络进行探测,以快速定位平台上发生的故障。

与依赖平台已有的各类监控指标的白盒监控系统不同,黑盒监控关注的是结果。当白盒监控无法覆盖影响服务可用性的所有因素时,黑盒监控能够快速发现故障并基于故障发出告警。例如,当某个 API 接口异常时,黑盒监控可以及时将此类问题暴露给用户。

WARNING

探针功能不支持在内核版本 3.10 及以下的节点上使用 ICMP 探测 IPv6 地址。若需使用此场景,请将节点内核版本升级至 3.11 及以上。

黑盒监控

创建黑盒监控项时,可选择 ICMP、TCP 或 HTTP 探测方式,定期探测指定的目标地址。

前提条件

监控组件必须已安装在集群中,且监控组件运行正常。

操作流程

  1. 在左侧导航栏点击 运维中心 > 监控 > 黑盒监控

    提示:黑盒监控为集群级功能,点击顶部导航栏可切换集群。

  2. 点击 创建黑盒监控项

  3. 按照以下说明配置相关参数。

    参数说明
    探测方式ICMP:通过 ping 输入的 目标地址(域名或 IP)来探测服务器是否可达。
    TCP:通过监听 目标地址 中指定的 <域名:端口><IP:端口> 来探测主机的业务端口。
    HTTP:探测输入的 目标地址 URL,检查网站连通性。
    提示:HTTP 探测方式默认仅支持 GET 请求,若需 POST 请求,请参考 自定义 BlackboxExporter 监控模块
    探测间隔探测的时间间隔。
    目标地址探测的目标地址,最长支持 128 个字符。
    不同探测方式对应的输入格式如下:
    ICMP:域名或 IP 地址,例如 10.165.94.31
    TCP<域名:端口><IP:端口>,例如 172.19.155.133:8765
    HTTP:以 http 或 https 开头的 URL,例如 http://alauda.cn/
  4. 点击 创建

    创建成功后,可在列表页实时查看最新探测结果,并基于黑盒监控项创建告警策略。当检测到故障时,系统会自动触发告警,通知相关人员进行处理。

WARNING

黑盒监控项创建成功后,系统需要约 5 分钟时间同步配置。在此同步期间,不会进行探测,且无法查看探测结果。

黑盒告警

前提条件

  • 监控组件必须已安装在集群中,且监控组件运行正常。

  • 黑盒监控项必须已成功创建,且系统已完成配置同步,黑盒监控页面可见探测结果。

操作流程

  1. 在左侧导航栏点击 运维中心 > 告警 > 告警策略

    提示:告警策略为集群级功能,点击顶部导航栏切换集群。请确保切换至刚配置黑盒监控项的集群。

  2. 点击 创建告警策略

  3. 按照以下说明配置相关参数;更多参数信息请参考 创建告警策略

  • 告警类型:请选择 资源告警

  • 资源类型:请选择 集群

  • 点击 添加告警规则

    • 告警类型:请选择 黑盒告警

    • 黑盒监控项:请选择目标黑盒监控项。

    • 指标名称:请选择希望监控并触发告警的指标。平台当前支持的指标为 ConnectivityHTTP Status Code

      • Connectivity:适用于所有黑盒监控项,触发条件为 “!= 1” 表示黑盒监控项的目标地址不可达。

      • HTTP Status Code:仅当黑盒监控项探测方式为 HTTP 时可选。触发条件值为三位正整数,例如设置为 “> 299” 表示响应码为 3XX、4XX 或 5XX 时触发告警。

    • 通知策略:请选择预先配置的通知策略。

    • 点击 添加

  1. 点击 创建。提交告警策略后,可在告警策略列表中查看该策略。

自定义 BlackboxExporter 监控模块

您还可以通过向 BlackboxExporter 配置文件添加自定义监控模块,增强黑盒监控功能。例如,添加 http_post_2xx 模块后,当黑盒监控的探测方式设置为 HTTP 时,即可探测 POST 请求方法的状态。

黑盒监控的配置文件位于集群中 Prometheus 组件安装的命名空间内,默认名称为 cpaas-monitor-prometheus-blackbox-exporter,可根据实际名称进行修改。

TIP

该配置文件为与命名空间相关的 ConfigMap 资源,可通过平台管理功能 集群管理 > 资源管理 快速查看和更新。

操作流程

  1. 通过向配置文件中 key modules 添加自定义监控模块,更新黑盒监控配置文件。

    以添加 http_post_2xx 模块为例:

      blackbox.yaml: |
        modules:           
          http_post_2xx:                    # HTTP POST 探测模块                                  
            prober: http
            timeout: 5s
            http:
              method: POST                 # 探测请求方法
              headers:
                Content-Type: application/json
              body: '{}'                   # 探测时携带的请求体

    有关黑盒监控配置文件的完整 YAML 示例,请参考 参考信息

  2. 通过以下任一方式激活配置。

    • 删除 Pod,重启 Blackbox Exporter 组件 cpaas-monitor-prometheus-blackbox-exporter

    • 执行以下命令调用 reload API,刷新配置文件:

      curl -X POST -v <Pod IP>:9115/-/reload     

通过 CLI 创建黑盒监控项和告警

前提条件

  • 已配置通知策略(若需告警自动通知)。

  • 目标集群已安装监控组件。

操作流程

  1. 新建 YAML 配置文件,命名为 example-probe.yaml
  2. 在 YAML 文件中添加 PrometheusRule 资源并提交。以下示例创建名为 prometheus-liveness 的新告警策略:
apiVersion: monitoring.coreos.com/v1
kind: Probe
metadata:
  annotations:
    cpaas.io/creator: jhshi@alauda.io                    # 探针项创建者
    cpaas.io/updated-at: "2021-05-25T08:08:45Z"          # 探针项最后更新时间
    cpaas.io/display-name: "Prometheus prober"           # 探针项描述
  creationTimestamp: "2021-05-10T02:04:33Z"              # 探针项创建时间
  labels:
    prometheus: kube-prometheus                          # 用于 prometheus 名称的标签值
  name: prometheus-liveness                              # 探针项名称
  namespace: cpaas-system                                # prometheus 命名空间
spec:
  jobName: prometheus-liveness                           # 探针项名称
  prober:
    url: cpaas-monitor-prometheus-blackbox-exporter:9115 # Blackbox 指标 URL,从特性中获取
  module: http_2xx                                       # 探针项模块名称
  targets:
    staticConfig:
      static:
      - http://www.prometheus.io                         # 探针目标地址
      labels:
        module: http_2xx                                 # 探针项模块名称
        prober: http                                     # 探测方式
  interval: 30s                                          # 探测间隔
  scrapeTimeout: 10s   
  1. 新建 YAML 配置文件,命名为 example-alerting-rule.yaml
  2. 在 YAML 文件中添加 PrometheusRule 资源并提交。以下示例创建名为 policy 的新告警策略:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  annotations:
    alert.cpaas.io/cluster: global      # 告警所在集群名称
    alert.cpaas.io/kind: Cluster        # 资源类型
    alert.cpaas.io/name: global         # 黑盒监控项所在集群名称
    alert.cpaas.io/namespace: cpaas-system  # prometheus 命名空间,保持默认
    alert.cpaas.io/notifications: '["test"]'
    alert.cpaas.io/repeat-config: '{"Critical":"never","High":"5m","Medium":"5m","Low":"5m"}'
    alert.cpaas.io/rules.description: "{}"
    alert.cpaas.io/rules.disabled: "[]"
    alert.cpaas.io/subkind: ""
    cpaas.io/description: ""
    cpaas.io/display-name: policy      # 告警策略显示名称
  labels:
    alert.cpaas.io/owner: System
    alert.cpaas.io/project: cpaas-system
    cpaas.io/source: Platform
    prometheus: kube-prometheus
    rule.cpaas.io/cluster: global
    rule.cpaas.io/name: policy
    rule.cpaas.io/namespace: cpaas-system
  name: policy
  namespace: cpaas-system
spec:
  groups:
    - name: general # 告警规则组名称
      rules:
        - alert: cluster.blackbox.probe.success-y97ah-9833444d918cab96c43e9ab6efc172cf
          annotations:
            alert_current_value: "{{ $value }}"  # 通知时的当前值,保持默认
          expr: max by (job, instance) (probe_success{job=~"test",
            instance=~"https://demo.at-servicecenter.com/"})!=1
            # 连通性告警场景,请务必修改黑盒监控项名称和目标地址
          for: 30s # 持续时间
          labels:
            alert_cluster: global # 告警所在集群名称
            alert_for: 30s # 持续时间
            alert_indicator: cluster.blackbox.probe.success  # 保持不变
            alert_indicator_aggregate_range: "0" # 保持不变
            alert_indicator_blackbox_instance: https://demo.at-servicecenter.com/ # 黑盒监控目标地址
            alert_indicator_blackbox_name: test # 黑盒监控项名称
            alert_indicator_comparison: "!="  # 连通性告警保持配置不变
            alert_indicator_query: ""  # 日志告警使用,无需配置此参数
            alert_indicator_threshold: "1"  # 告警规则阈值,1 表示连通性,保持不变
            alert_indicator_unit: ""  # 告警规则指标单位
            alert_involved_object_kind: Cluster   # 黑盒告警保持不变
            alert_involved_object_name: global   # 黑盒监控项所在集群
            alert_involved_object_namespace: ""  # 告警规则所属对象命名空间
            alert_name: cluster.blackbox.probe.success-y97ah  # 告警规则名称
            alert_namespace: cpaas-system  # 告警规则所在命名空间
            alert_project: cpaas-system  # 告警规则所属对象项目名称
            alert_resource: policy # 告警规则所在告警策略名称
            alert_source: Platform # 告警规则数据类型:Platform-平台数据,Business-业务数据
            severity: High # 告警规则等级:Critical-灾难,High-严重,Medium-警告,Low-提示
         - alert: cluster.blackbox.http.status.code-235el-99b0095b6b6669415043e14ae84f43bc
          annotations:
            alert_current_value: "{{ $value }}"
            alert_notifications: '["message"]'
          expr: max by(job, instance) (probe_http_status_code{job=~"test",
            instance=~"https://demo.at-servicecenter.com/"})>200
            # HTTP 状态码告警场景,请务必修改黑盒监控项名称和目标地址
          for: 30s
          labels:
            alert_cluster: global
            alert_for: 30s
            alert_indicator: cluster.blackbox.http.status.code
            alert_indicator_aggregate_range: "0"
            alert_indicator_blackbox_instance: https://demo.at-servicecenter.com/
            alert_indicator_blackbox_name: test
            alert_indicator_comparison: ">" 
            alert_indicator_query: ""
            alert_indicator_threshold: "299" # 告警规则阈值,HTTP 状态码告警场景应为三位数,例如大于 299 表示 3XX、4XX、5XX 状态码为错误
            alert_indicator_unit: ""
            alert_involved_object_kind: Cluster
            alert_involved_object_name: global
            alert_involved_object_namespace: ""
            alert_involved_object_options: Single
            alert_name: cluster.blackbox.http.status.code-235el
            alert_namespace: cpaas-system
            alert_project: cpaas-system
            alert_resource: policy33
            alert_source: Platform
            severity: High

参考信息

黑盒监控 YAML 配置文件的完整示例如下:

apiVersion: v1
data:
  blackbox.yaml: |
    modules:
      http_2xx_example:               # HTTP 探测示例
        prober: http
        timeout: 5s                   # 探测超时时间
        http:
          valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]                   # 返回信息中的版本,通常默认
          valid_status_codes: []  # 默认为 2xx                       # 有效响应码范围,返回码在此范围内视为探测成功
          method: GET                 # 请求方法
          headers:                    # 请求头
            Host: vhost.example.com
            Accept-Language: en-US
            Origin: example.com
          no_follow_redirects: false  # 是否允许重定向
          fail_if_ssl: false   
          fail_if_not_ssl: false
          fail_if_body_matches_regexp:
            - "Could not connect to database"
          fail_if_body_not_matches_regexp:
            - "Download the latest version here"
          fail_if_header_matches: # 验证未设置 Cookie
            - header: Set-Cookie
              allow_missing: true
              regexp: '.*'
          fail_if_header_not_matches:
            - header: Access-Control-Allow-Origin
              regexp: '(\*|example\.com)'
          tls_config:                  # https 请求的 TLS 配置
            insecure_skip_verify: false
          preferred_ip_protocol: "ip4" # 默认为 "ip6"                 # 优先使用的 IP 协议版本
          ip_protocol_fallback: false  # 不回退到 "ip6"            
      http_post_2xx:                   # 带 Body 的 HTTP 探测示例
        prober: http
        timeout: 5s
        http:
          method: POST                 # 探测请求方法
          headers:
            Content-Type: application/json
          body: '{"username":"admin","password":"123456"}'                   # 探测时携带的请求体
      http_basic_auth_example:         # 带用户名密码的探测示例
        prober: http
        timeout: 5s
        http:
          method: POST
          headers:
            Host: "login.example.com"
          basic_auth:                  # 探测时添加的用户名密码
            username: "username"
            password: "mysecret"
      http_custom_ca_example:
        prober: http
        http:
          method: GET
          tls_config:                  # 探测时指定使用的根证书
            ca_file: "/certs/my_cert.crt"
      http_gzip:
        prober: http
        http:
          method: GET
          compression: gzip            # 探测时使用的压缩方式
      http_gzip_with_accept_encoding:
        prober: http
        http:
          method: GET
          compression: gzip
          headers:
            Accept-Encoding: gzip
      tls_connect:                     # TCP 探测示例
        prober: tcp
        timeout: 5s
        tcp:
          tls: true                    # 是否使用 TLS
      tcp_connect_example:
        prober: tcp
        timeout: 5s
      imap_starttls:                   # 配置 IMAP 邮件服务器探测示例
        prober: tcp
        timeout: 5s
        tcp:
          query_response:
            - expect: "OK.*STARTTLS"
            - send: ". STARTTLS"
            - expect: "OK"
            - starttls: true
            - send: ". capability"
            - expect: "CAPABILITY IMAP4rev1"
      smtp_starttls:                   # 配置 SMTP 邮件服务器探测示例
        prober: tcp
        timeout: 5s
        tcp:
          query_response:
            - expect: "^220 ([^ ]+) ESMTP (.+)$"
            - send: "EHLO prober\r"
            - expect: "^250-STARTTLS"
            - send: "STARTTLS\r"
            - expect: "^220"
            - starttls: true
            - send: "EHLO prober\r"
            - expect: "^250-AUTH"
            - send: "QUIT\r"
      irc_banner_example:
        prober: tcp
        timeout: 5s
        tcp:
          query_response:
            - send: "NICK prober"
            - send: "USER prober prober prober :prober"
            - expect: "PING :([^ ]+)"
              send: "PONG ${1}"
            - expect: "^:[^ ]+ 001"
      icmp_example:                    # ICMP 探测示例配置
        prober: icmp
        timeout: 5s
        icmp:
          preferred_ip_protocol: "ip4"
          source_ip_address: "127.0.0.1"
      dns_udp_example:                 # 使用 UDP 的 DNS 查询示例
        prober: dns
        timeout: 5s
        dns:
          query_name: "www.prometheus.io"                 # 解析的域名
          query_type: "A"              # 域名对应的类型
          valid_rcodes:
          - NOERROR
          validate_answer_rrs:
            fail_if_matches_regexp:
            - ".*127.0.0.1"
            fail_if_all_match_regexp:
            - ".*127.0.0.1"
            fail_if_not_matches_regexp:
            - "www.prometheus.io.\t300\tIN\tA\t127.0.0.1"
            fail_if_none_matches_regexp:
            - "127.0.0.1"
          validate_authority_rrs:
            fail_if_matches_regexp:
            - ".*127.0.0.1"
          validate_additional_rrs:
            fail_if_matches_regexp:
            - ".*127.0.0.1"
      dns_soa:
        prober: dns
        dns:
          query_name: "prometheus.io"
          query_type: "SOA"
      dns_tcp_example:               # 使用 TCP 的 DNS 查询示例
        prober: dns
        dns:
          transport_protocol: "tcp" # 默认为 "udp"
          preferred_ip_protocol: "ip4" # 默认为 "ip6"
          query_name: "www.prometheus.io"
kind: ConfigMap
metadata:
  annotations:
    skip-sync: "true"
  labels:
    app.kubernetes.io/instance: cpaas-monitor
    app.kubernetes.io/managed-by: Tiller
    app.kubernetes.io/name: prometheus-blackbox-exporter
    helm.sh/chart: prometheus-blackbox-exporter-1.6.0
  name: cpaas-monitor-prometheus-blackbox-exporter
  namespace: cpaas-system