跨多个 Kubernetes 集群监控 TiDB 集群

你可以监控跨多个 Kubernetes 集群的 TiDB 集群,实现从统一全局视图访问监控数据。本文档介绍如何与几种常见的 Prometheus 多集群监控方式进行集成,并使用 Grafana 可视化多集群数据:

Push 方式

Push 方式指利用 Prometheus remote-write 的特性,使位于不同 Kubernetes 集群的 Prometheus 实例将监控数据推送至中心化存储中。

本节所描述的 Push 方式以 Thanos 为例。如果你使用了其他兼容 Prometheus Remote API 的中心化存储方案,只需对 Thanos 相关组件进行替换即可。

前置条件

多个 Kubernetes 集群间的组件满足以下条件:

  • 各 Kubernetes 集群上的 Prometheus(即 TidbMonitor)组件有能力访问 Thanos Receiver 组件。

关于 Thanos Receiver 部署,可参考 kube-thanos 以及 Example

部署架构图

push-thanos-receive.png

部署 TiDB 集群监控

  1. 根据不同 TiDB 集群所在的 Kubernetes 集群,设置以下环境变量:

    • cluster_name:TiDB 集群名称。
    • cluster_namespace:TiDB 集群所在的命名空间。
    • kubernetes_cluster_name:自定义的 Kubernetes 集群名称,在标识 Prometheus 的 externallabels 中使用。
    • storageclass_name:当前集群中的存储。
    • remote_write_urlthanos-receiver 组件的 host,或其他兼容 Prometheus remote API 组件的 host 。
    1. cluster_name="cluster1"
    2. cluster_namespace="pingcap"
    3. kubernetes_cluster_name="kind-cluster-1"
    4. storageclass_name="local-storage"
    5. remote_write_url="http://thanos-receiver:19291/api/v1/receive"
  2. 执行以下指令,创建 TidbMonitor

    1. cat << EOF | kubectl apply -n ${cluster_namespace} -f -
    2. apiVersion: pingcap.com/v1alpha1
    3. kind: TidbMonitor
    4. metadata:
    5. name: ${cluster_name}
    6. spec:
    7. clusters:
    8. - name: ${cluster_name}
    9. namespace: ${cluster_namespace}
    10. externalLabels:
    11. # k8s_clsuter indicates the k8s cluster name, you can change
    12. # the label's name on your own, but you should notice that the
    13. # "cluster" label has been used by the TiDB metrics already.
    14. # For more information, please refer to the issue
    15. # https://github.com/pingcap/tidb-operator/issues/4219.
    16. k8s_clsuter: ${kubernetes_cluster_name}
    17. # add other meta labels here
    18. #region: us-east-1
    19. initializer:
    20. baseImage: pingcap/tidb-monitor-initializer
    21. version: v5.4.0
    22. persistent: true
    23. storage: 100Gi
    24. storageClassName: ${storageclass_name}
    25. prometheus:
    26. baseImage: prom/prometheus
    27. logLevel: info
    28. remoteWrite:
    29. - url: ${remote_write_url}
    30. retentionTime: 2h
    31. version: v2.27.1
    32. reloader:
    33. baseImage: pingcap/tidb-monitor-reloader
    34. version: v1.0.1
    35. imagePullPolicy: IfNotPresent
    36. EOF

Pull 方式

Pull 方式是指从不同 Kubernetes 集群的 Prometheus 实例中拉取监控数据,聚合后提供统一全局视图查询。本文中将其分为:使用 Thanos Query使用 Prometheus Federation

使用 Thanos Query

本节中的示例为每个 Prometheus (TidbMonitor) 组件部署了 Thanos Sidecar,并使用 thanos-query 组件进行聚合查询。如果不需要对监控数据做长期存储,你可以不部署 thanos-store、S3 等组件。

前置条件

需要配置 Kubernetes 的网络和 DNS,使得 Kubernetes 集群满足以下条件:

  • Thanos Query 组件有能力访问各 Kubernetes 集群上的 Prometheus (即 TidbMonitor) 组件的 Pod IP。
  • Thanos Query 组件有能力访问各 Kubernetes 集群上的 Prometheus (即 TidbMonitor) 组件的 Pod FQDN。

关于 Thanos Query 部署, 参考 kube-thanos 以及 Example

部署架构图

pull-thanos-query.png

部署 TiDB 集群监控

  1. 根据不同 TiDB 集群所在的 Kubernetes 集群,设置以下环境变量:

    • cluster_name:TiDB 集群名称。
    • cluster_namespace:TiDB 集群所在的命名空间。
    • kubernetes_cluster_name:自定义的 Kubernetes 集群名称,在标识 Prometheus 的 externallabels 中使用。
    • cluster_domain:当前 Kubernetes 集群的 Cluster Domain
    • storageclass_name:当前 Kubernetes 集群中的存储。
    1. cluster_name="cluster1"
    2. cluster_namespace="pingcap"
    3. kubernetes_cluster_name="kind-cluster-1"
    4. storageclass_name="local-storage"
    5. cluster_domain="svc.local"
  2. 执行以下指令,创建 TidbMonitor

    1. cat <<EOF | kubectl apply -n ${cluster_namespace} -f -
    2. apiVersion: pingcap.com/v1alpha1
    3. kind: TidbMonitor
    4. metadata:
    5. name: ${cluster_name}
    6. spec:
    7. clusters:
    8. - name: ${cluster_name}
    9. namespace: ${cluster_namespace}
    10. externalLabels:
    11. # k8s_clsuter indicates the k8s cluster name, you can change
    12. # the label's name on your own, but you should notice that the
    13. # "cluster" label has been used by the TiDB metrics already.
    14. # For more information, please refer to the issue
    15. # https://github.com/pingcap/tidb-operator/issues/4219.
    16. k8s_clsuter: ${kubernetes_cluster_name}
    17. # add other meta labels here
    18. #region: us-east-1
    19. initializer:
    20. baseImage: pingcap/tidb-monitor-initializer
    21. version: v5.4.0
    22. persistent: true
    23. storage: 20Gi
    24. storageClassName: ${storageclass_name}
    25. prometheus:
    26. baseImage: prom/prometheus
    27. logLevel: info
    28. version: v2.27.1
    29. reloader:
    30. baseImage: pingcap/tidb-monitor-reloader
    31. version: v1.0.1
    32. thanos:
    33. baseImage: quay.io/thanos/thanos
    34. version: v0.22.0
    35. #enable config below if long-term storage is needed.
    36. #objectStorageConfig:
    37. # key: objectstorage.yaml
    38. # name: thanos-objectstorage
    39. imagePullPolicy: IfNotPresent
    40. EOF
  3. 配置 Thanos Query Stores:

    通过静态服务发现的方式,在 Thanos Query 的命令行启动参数中添加 --store=${cluster_name}-prometheus.${cluster_namespace}.svc.${cluster_domain}:10901 来指定 Store 节点,需要对变量值进行替换。如果你使用了其他服务发现方式,请参考 thanos-service-discovery 进行配置。

使用 Prometheus Federation

本节中的示例使用 Federation Prometheus Server 作为数据统一存储与查询的入口,建议在数据规模较小的环境下使用。

前置条件

需要配置 Kubernetes 的网络和 DNS,使得 Kubernetes 集群满足以下条件:

  • Federation Prometheus 组件有能力访问各 Kubernetes 集群上的 Prometheus (即 TidbMonitor) 组件的 Pod IP。
  • Federation Prometheus 组件有能力访问各 Kubernetes 集群上的 Prometheus (即 TidbMonitor) 组件的 Pod FQDN。

部署架构图

pull-prom-federation.png

部署 TiDB 集群监控

  1. 根据不同 TiDB 集群所在的 Kubernetes 集群,设置以下环境变量:

    • cluster_name:TiDB 集群名称。
    • cluster_namespace:TiDB 集群所在的命名空间。
    • kubernetes_cluster_name:自定义的 Kubernetes 集群名称,在标识 Prometheus 的 externallabels 中使用。
    • storageclass_name:当前集群中的存储。
    1. cluster_name="cluster1"
    2. cluster_namespace="pingcap"
    3. kubernetes_cluster_name="kind-cluster-1"
    4. storageclass_name="local-storage"
  2. 执行以下指令,创建 TidbMonitor

    1. cat << EOF | kubectl apply -n ${cluster_namespace} -f -
    2. apiVersion: pingcap.com/v1alpha1
    3. kind: TidbMonitor
    4. metadata:
    5. name: ${cluster_name}
    6. spec:
    7. clusters:
    8. - name: ${cluster_name}
    9. namespace: ${cluster_namespace}
    10. externalLabels:
    11. # k8s_clsuter indicates the k8s cluster name, you can change
    12. # the label's name on your own, but you should notice that the
    13. # "cluster" label has been used by the TiDB metrics already.
    14. # For more information, please refer to the issue
    15. # https://github.com/pingcap/tidb-operator/issues/4219.
    16. k8s_clsuter: ${kubernetes_cluster_name}
    17. # add other meta labels here
    18. #region: us-east-1
    19. initializer:
    20. baseImage: pingcap/tidb-monitor-initializer
    21. version: v5.4.0
    22. persistent: true
    23. storage: 20Gi
    24. storageClassName: ${storageclass_name}
    25. prometheus:
    26. baseImage: prom/prometheus
    27. logLevel: info
    28. version: v2.27.1
    29. reloader:
    30. baseImage: pingcap/tidb-monitor-reloader
    31. version: v1.0.1
    32. imagePullPolicy: IfNotPresent
    33. EOF

配置 Federation Prometheus

关于 Federation 方案,参考 Federation 文档。部署完成后,修改 Prometheus 采集配置,添加需要聚合的 Prometheus (TidbMonitor) 的 host 信息。

  1. scrape_configs:
  2. - job_name: 'federate'
  3. scrape_interval: 15s
  4. honor_labels: true
  5. metrics_path: '/federate'
  6. params:
  7. 'match[]':
  8. - '{__name__=~".+"}'
  9. static_configs:
  10. - targets:
  11. - 'source-prometheus-1:9090'
  12. - 'source-prometheus-2:9090'
  13. - 'source-prometheus-3:9090'

使用 Grafana 可视化多集群监控数据

使用 Prometheus 获取数据后,你可以使用 Grafana 可视化多集群监控数据

  1. 执行以下指令,获取 TiDB 相关组件的 Grafana Dashboards, 其中 version 变量的值为 initializer 镜像版本,应该和 TiDB 版本保持一致,但是目前仅 nightly 版本 Initializer 镜像适用于多 Kubernetes 集群监控。

    1. # set tidb version here
    2. version=nightly
    3. docker run --rm -i -v ${PWD}/dashboards:/dashboards/ pingcap/tidb-monitor-initializer:${version} && \
    4. cd dashboards

    执行上述命令后,可以在当前目录下查看所有组件 dashboard 的 json 定义文件。

  2. 配置 Prometheus 数据源,为了与上述获得的 dashboard json 文件保持一致,需将数据源 Name 字段值配置为 tidb-cluster。如果希望使用已有的数据源,请执行以下指令对上述 dashboard json 文件中的数据源名称进行替换,其中 DS_NAME 变量的值为数据源的名称。

    1. # define your datasource name here.
    2. DS_NAME=thanos
    3. sed -i 's/"datasource": "tidb-cluster"/"datasource": "$DS_NAME"/g' *.json
  3. 在 Grafana 中导入 Dashboard