管理拨测

功能概述

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

与依赖于平台上已有的各类监控指标的白盒监控系统不同,黑盒监控侧重于结果。当白盒监控无法覆盖影响服务可用性的所有因素时,黑盒监控能够快速检测故障,并基于这些故障发出警报。例如,如果某个 API 接口出现异常,黑盒监控能够及时向用户揭示这些问题。

WARNING

拨测功能不支持在内核版本为 3.10 及以下版本的节点上使用 ICMP 方式探测 IPv6 地址,如需使用此场景,请将节点上的内核版本升级至 3.11 或更高版本。

黑盒监控

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

前提条件

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

操作步骤

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

    提示:黑盒监控是集群级别的功能。单击上方导航栏以切换集群。

  2. 单击 创建黑盒监控项

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

    参数说明
    探测方式ICMP:通过对 目标地址 中输入的域名或 IP 地址进行 ping 探测,以检查服务器的可用性。
    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. 参考以下说明配置相关参数;更多参数信息请参见 创建告警策略

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

  • 资源类型:请选择 集群

  • 单击 添加告警规则

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

    • 黑盒监控项:请选择所需的黑盒监控项。

    • 指标名称:请选择要监测和告警的指标,当前平台支持的指标有 连通性HTTP 状态码

      • 连通性:此指标适用于所有黑盒监控项,其中触发条件 “!= 1” 表示黑盒监控项的目标地址无法到达。

      • HTTP 状态码:当选择的黑盒监控项的探测方式为 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: '{}'                   # 探测时发送的 body 内容
    

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

  2. 通过以下任一方式使配置生效。

    • 通过删除 Blackbox Exporter 组件 cpaas-monitor-prometheus-blackbox-exporter 的 Pod 重启 Blackbox Exporter 组件。

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

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

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

前提条件

  • 必须配置通知策略(需要自动通知警报)。

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

操作步骤

  1. 创建一个名为 example-probe.yaml 的新 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 的 metrics 的 URL,从 features 获取
  module: http_2xx                                       # 探测项模块名称
  targets:
    staticConfig:
      static:
      - http://www.prometheus.io                         # 探测项目标地址
      labels:
        module: http_2xx                                 # 探测项模块名称
        prober: http                                     # 探测项探测方式
  interval: 30s                                          # 探测项间隔
  scrapeTimeout: 10s   
  1. 创建一个名为 example-alerting-rule.yaml 的新 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"}'                   # 探测时携带的 body
      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