TiDB 集群的监控与告警

    TiDB 通过 Prometheus 和 Grafana 监控 TiDB 集群。在通过 TiDB Operator 创建新的 TiDB 集群时,可以对于每个 TiDB 集群,创建、配置一套独立的监控系统,与 TiDB 集群运行在同一 Namespace,包括 Prometheus 和 Grafana 两个组件。

    TiDB 集群监控中有一些监控系统配置的细节可供参考。

    在 v1.1 及更高版本的 TiDB Operator 中,可以通过简单的 CR 文件(即 TidbMonitor,可参考 )来快速建立对 Kubernetes 集群上的 TiDB 集群的监控。

    注意

    • 需要配置为 TiDB 集群 TidbCluster 的名字。

    可以在 TidbMonitor 中设置 spec.persistenttrue 来持久化监控数据。开启此选项时应将 spec.storageClassName 设置为一个当前集群中已有的存储,并且此存储应当支持将数据持久化,否则会存在数据丢失的风险。配置示例如下:

    你可以通过以下命令来确认 PVC 情况:

    1. kubectl get pvc -l app.kubernetes.io/instance=basic,app.kubernetes.io/component=monitor -n ${namespace}
    1. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
    2. basic-monitor Bound pvc-6db79253-cc9e-4730-bbba-ba987c29db6f 5G RWO standard 51s

    自定义 Prometheus 配置

    用户可以通过自定义配置文件或增加额外的命令行参数,来自定义 Prometheus 配置。

    使用自定义配置文件

    1. 为用户自定义配置创建 ConfigMap 并将 data 部分的键名设置为 prometheus-config
    2. 设置 spec.prometheus.config.configMapRef.namespec.prometheus.config.configMapRef.namespace 为自定义 ConfigMap 的名称与所属的 namespace。
    3. 确认 TidbMonitor 是否已开启动态配置功能,如果未开启该功能,需要重启 TidbMonitor 的 pod 重新加载配置。

    如需了解完整的配置示例,可参考 。

    增加额外的命令行参数

    设置 spec.prometheus.config.commandOptions 为用于启动 Prometheus 的额外的命令行参数。

    如需了解完整的配置示例,可参考 。

    部署 TiDB 集群监控与告警 - 图2注意

    以下参数已由 TidbMonitor controller 自动设置,不支持通过 commandOptions 重复指定:

    • config.file
    • log.level
    • web.enable-admin-api
    • web.enable-lifecycle
    • storage.tsdb.path
    • storage.tsdb.retention
    • storage.tsdb.max-block-duration
    • storage.tsdb.min-block-duration

    访问 Grafana 监控面板

    可以通过 kubectl port-forward 访问 Grafana 监控面板:

    然后在浏览器中打开 ,默认用户名和密码都为 admin

    如果不需要使用 Grafana,可以在部署时将 TidbMonitor 中的 spec.grafana 部分删除。这一情况下需要使用其他已有或新部署的数据可视化工具直接访问监控数据来完成可视化。

    对于需要直接访问监控数据的情况,可以通过 kubectl port-forward 来访问 Prometheus:

    1. kubectl port-forward -n ${namespace} svc/${cluster_name}-prometheus 9090:9090 &>/tmp/portforward-prometheus.log &

    然后在浏览器中打开 http://localhost:9090,或通过客户端工具访问此地址即可。

    也可以设置 spec.prometheus.service.typeNodePort 或者 LoadBalancer,通过 NodePort 或者 LoadBalancer 访问监控数据。

    设置 kube-prometheus 与 AlertManager

    TidbMonitor Grafana 默认内置了 Nodes-Info 与 Pods-Info 监控面板,用于查看 Kubernetes 对应的监控指标。

    如需在 TidbMonitor Grafana 中查看这些监控指标,请进行以下操作:

    1. 手动部署 Kubernetes 集群监控。

      Kubernetes 集群监控有多种部署方式。如果要使用 kube-prometheus 部署, 可以参考 kube-prometheus 文档

    2. 设置 TidbMonitor.spec.kubePrometheusURL 获取 Kubernetes 监控数据。

    同样的,你可以通过设置 TidbMonitor 来将监控推送警报至指定的 。

    1. apiVersion: pingcap.com/v1alpha1
    2. kind: TidbMonitor
    3. metadata:
    4. name: basic
    5. spec:
    6. clusters:
    7. - name: basic
    8. kubePrometheusURL: http://prometheus-k8s.monitoring:9090
    9. alertmanagerURL: alertmanager-main.monitoring:9093
    10. prometheus:
    11. baseImage: prom/prometheus
    12. version: v2.27.1
    13. service:
    14. grafana:
    15. baseImage: grafana/grafana
    16. service:
    17. type: NodePort
    18. initializer:
    19. baseImage: pingcap/tidb-monitor-initializer
    20. version: v5.4.0
    21. reloader:
    22. baseImage: pingcap/tidb-monitor-reloader
    23. version: v1.0.1
    24. prometheusReloader:
    25. baseImage: quay.io/prometheus-operator/prometheus-config-reloader
    26. version: v0.49.0
    27. imagePullPolicy: IfNotPresent

    本节介绍如何为 TidbMonitor 开启 Ingress。Ingress 是一个 API 对象,负责管理集群中服务的外部访问。

    环境准备

    使用 Ingress 前,需要在 Kubernetes 集群中安装 Ingress 控制器,否则仅创建 Ingress 资源无效。你可能需要部署 Ingress 控制器,例如 ingress-nginx。你可以从许多 中进行选择。

    更多关于 Ingress 环境准备,可以参考 Ingress 环境准备

    目前, TidbMonitor 提供了通过 Ingress 将 Prometheus/Grafana 服务暴露出去的方式,你可以通过 了解更多关于 Ingress 的详情。

    你可以通过 spec.prometheus.ingress.annotationsspec.grafana.ingress.annotations 来设置对应的 Ingress Annotations 的设置。如果你使用的是默认的 NGINX Ingress 方案,你可以在 NGINX Ingress Controller Annotation 了解更多关于 Annotations 的详情。

    TidbMonitor 的 Ingress 设置同样支持设置 TLS,以下是一个为 Ingress 设置 TLS 的例子。你可以通过 来了解更多关于 Ingress TLS 的资料。

    1. apiVersion: pingcap.com/v1alpha1
    2. kind: TidbMonitor
    3. metadata:
    4. name: ingress-demo
    5. spec:
    6. clusters:
    7. - name: demo
    8. persistent: false
    9. prometheus:
    10. baseImage: prom/prometheus
    11. version: v2.27.1
    12. ingress:
    13. hosts:
    14. - example.com
    15. tls:
    16. - hosts:
    17. - example.com
    18. secretName: testsecret-tls
    19. grafana:
    20. baseImage: grafana/grafana
    21. version: 7.5.11
    22. service:
    23. type: ClusterIP
    24. initializer:
    25. baseImage: pingcap/tidb-monitor-initializer
    26. version: v5.4.0
    27. reloader:
    28. baseImage: pingcap/tidb-monitor-reloader
    29. version: v1.0.1
    30. prometheusReloader:
    31. baseImage: quay.io/prometheus-operator/prometheus-config-reloader

    TLS Secret 必须包含名为 tls.crt 和 tls.key 的密钥,这些密钥包含用于 TLS 的证书和私钥,例如:

    1. apiVersion: v1
    2. kind: Secret
    3. metadata:
    4. name: testsecret-tls
    5. namespace: ${namespace}
    6. data:
    7. tls.crt: base64 encoded cert
    8. tls.key: base64 encoded key
    9. type: kubernetes.io/tls

    在公有云 Kubernetes 集群中,通常可以配置 Loadbalancer 通过域名访问 Ingress。如果无法配置 Loadbalancer 服务,比如使用了 NodePort 作为 Ingress 的服务类型,可通过与如下命令等价的方式访问服务:

    在随 TiDB 集群部署 Prometheus 时,会自动导入一些默认的告警规则,可以通过浏览器访问 Prometheus 的 Alerts 页面查看当前系统中的所有告警规则和状态。

    目前支持自定义配置告警规则,可以参考下面步骤修改告警规则:

    1. 在为 TiDB 集群部署监控的过程中,设置 spec.reloader.service.typeNodePort 或者 LoadBalancer
    2. 通过 NodePort 或者 LoadBalancer 访问 reloader 服务,点击上方 Files 选择要修改的告警规则文件进行修改,修改完成后 Save

    默认的 Prometheus 和告警配置不能发送告警消息,如需发送告警消息,可以使用任意支持 Prometheus 告警的工具与其集成。推荐通过 管理与发送告警消息。

    如果在你的现有基础设施中已经有可用的 AlertManager 服务,可以参考设置 kube-prometheus 与 AlertManager 设置 spec.alertmanagerURL 配置其地址供 Prometheus 使用;如果没有可用的 AlertManager 服务,或者希望部署一套独立的服务,可以参考官方的部署。

    从 TiDB Operator 1.2 版本起,TidbMonitor 支持跨命名空间的多集群监控。

    使用 YAML 文件配置多集群监控

    无论要监控的集群是否已开启 TLS,你都可以通过配置 TidbMonitor 的 YAML 文件实现。

    配置示例如下:

    1. apiVersion: pingcap.com/v1alpha1
    2. kind: TidbMonitor
    3. metadata:
    4. name: basic
    5. spec:
    6. clusters:
    7. - name: ns1
    8. namespace: ns1
    9. - name: ns2
    10. namespace: ns2
    11. persistent: true
    12. storage: 5G
    13. prometheus:
    14. baseImage: prom/prometheus
    15. version: v2.27.1
    16. service:
    17. type: NodePort
    18. grafana:
    19. baseImage: grafana/grafana
    20. version: 7.5.11
    21. service:
    22. type: NodePort
    23. initializer:
    24. baseImage: pingcap/tidb-monitor-initializer
    25. version: v5.4.0
    26. reloader:
    27. baseImage: pingcap/tidb-monitor-reloader
    28. version: v1.0.1
    29. prometheusReloader:
    30. baseImage: quay.io/prometheus-operator/prometheus-config-reloader
    31. version: v0.49.0
    32. imagePullPolicy: IfNotPresent

    如需了解完整的配置示例,可参考 TiDB Operator 仓库中的。

    使用 Grafana 查看多集群监控

    tidb-monitor-initializer 镜像版本在 < v4.0.14< v5.0.3 范围时,要使用 Grafana 查看多个集群的监控,请在每个 Grafana Dashboard 中进行以下操作:

    1. 点击 Grafana Dashboard 中的 Dashboard settings 选项,打开 Settings 面板。
    2. Settings 面板中,选择 Variables 中的 tidb_cluster 变量,将 tidb_cluster 变量的 Hide 属性设置为空选项。

    如果需要保存对 Grafana Dashboard 的修改, Grafana 必须为 及以上版本,TiDB Operator 必须为 v1.2.0-rc.2 及以上版本。