探针管理

目录

功能概述

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

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

WARNING

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

黑盒监控

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

前提条件

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

操作流程

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

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

  2. 点击 创建黑盒监控项

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

    参数说明
    探测方式ICMP:通过 ping 输入的 目标地址 中的域名或 IP 地址,探测服务器是否可用。
    TCP:通过监听 目标地址 中指定的 <domain:port><IP:port>,探测主机的业务端口。
    HTTP:探测输入的 目标地址 中的 URL,检查网站连通性。
    提示:HTTP 探测方式默认仅支持 GET 请求,若需 POST 请求,请参考 自定义 BlackboxExporter 监控模块
    探测间隔探测的时间间隔。
    目标地址探测的目标地址,最长支持 128 个字符。
    目标地址的输入格式根据探测方式不同而不同:
    ICMP:域名或 IP 地址,例如 10.165.94.31
    TCP<domain:port><IP:port>,例如 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. 通过向配置文件的 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. 通过以下任一方式使配置生效。

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

    • 执行以下命令调用 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
  3. 新建 YAML 配置文件,命名为 example-alerting-rule.yaml

  4. 在 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