通过 TidbMonitor 监控 TiDB 集群

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

快速上手

注意:

快速上手只是用来作为演示或是测试,请勿将以下配置部署在关键、生产环境。

前置条件

  1. 已经安装了 Operator v1.1.0-beta.1 及以上版本,并且已经更新了相关版本的 CRD 文件
  2. 已经设置了默认的 storageClass,并保证其有足够的 PV(默认情况下需要 6 个 PV)。这可以通过以下指令来验证:
  1. $ kubectl get storageClass
  2. NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
  3. standard (default) rancher.io/local-path Delete WaitForFirstConsumer false 14h

安装

你可以在 Kubernetes 集群上通过 CR 文件快速建立起一个 TidbMonitor 监控 TiDB 集群。接下来我们可以将以下内容存为 yaml 文件,通过 kubectl apply -f 的方式部署一个 TidbMonitor 组件。

注意:

目前一个 TidbMonitor 只支持监控一个 TidbCluster。

  1. apiVersion: pingcap.com/v1alpha1
  2. kind: TidbMonitor
  3. metadata:
  4. name: basic
  5. spec:
  6. clusters:
  7. - name: basic
  8. prometheus:
  9. baseImage: prom/prometheus
  10. version: v2.11.1
  11. service:
  12. type: NodePort
  13. grafana:
  14. baseImage: grafana/grafana
  15. version: 6.0.1
  16. initializer:
  17. baseImage: pingcap/tidb-monitor-initializer
  18. version: v3.1.0
  19. reloader:
  20. baseImage: pingcap/tidb-monitor-reloader
  21. version: v1.0.1
  22. imagePullPolicy: IfNotPresent

或者你可以通过以下方式快速部署 TidbMonitor:

  1. kubectl apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/basic/tidb-monitor.yaml -n ${namespace}

然后我们通过 kubectl get pod 命令来检查 TidbMonitor 启动完毕:

  1. $ kubectl get pod -l app.kubernetes.io/instance=basic -n ${namespace} | grep monitor
  2. basic-monitor-85fcf66bc4-cwpcn 3/3 Running 0 117s

查看监控面板

运行以下命令查看监控面板:

  1. kubectl -n ${namespace} port-forward svc/basic-grafana 3000:3000 &>/tmp/pf-grafana.log &

然后访问 localhost:3000。

删除监控

  1. kubectl delete tidbmonitor basic -n ${namespace}

持久化监控数据

如果我们需要将 TidbMonitor 的监控数据持久化存储,我们需要在 TidbMonitor 中开启持久化选项:

  1. apiVersion: pingcap.com/v1alpha1
  2. kind: TidbMonitor
  3. metadata:
  4. name: basic
  5. spec:
  6. clusters:
  7. - name: basic
  8. persistent: true
  9. storageClassName: ${storageClassName}
  10. storage: 5G
  11. prometheus:
  12. baseImage: prom/prometheus
  13. version: v2.11.1
  14. service:
  15. type: NodePort
  16. grafana:
  17. baseImage: grafana/grafana
  18. version: 6.0.1
  19. service:
  20. type: NodePort
  21. initializer:
  22. baseImage: pingcap/tidb-monitor-initializer
  23. version: v3.1.0
  24. reloader:
  25. baseImage: pingcap/tidb-monitor-reloader
  26. version: v1.0.1
  27. imagePullPolicy: IfNotPresent

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

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

设置 kube-prometheus 与 AlertManager

在部分情况下,你可能需要 TidbMonitor 同时获取 Kubernetes 上的监控指标。你可以通过设置 TidbMonitor.Spec.kubePrometheusURL 来使其获取 kube-prometheus metrics,了解 kube-prometheus

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

  1. apiVersion: pingcap.com/v1alpha1
  2. kind: TidbMonitor
  3. metadata:
  4. name: basic
  5. spec:
  6. clusters:
  7. - name: basic
  8. kubePrometheusURL: "your-kube-prometheus-url"
  9. alertmanagerURL: "your-alert-manager-url"
  10. prometheus:
  11. baseImage: prom/prometheus
  12. version: v2.11.1
  13. service:
  14. type: NodePort
  15. grafana:
  16. baseImage: grafana/grafana
  17. version: 6.0.1
  18. service:
  19. type: NodePort
  20. initializer:
  21. baseImage: pingcap/tidb-monitor-initializer
  22. version: v3.1.0
  23. reloader:
  24. baseImage: pingcap/tidb-monitor-reloader
  25. version: v1.0.1
  26. imagePullPolicy: IfNotPresent

开启 Ingress

环境准备

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

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

使用 Ingress 访问 TidbMonitor

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

以下是一个开启了 Prometheus 与 Grafana Ingress 的 TidbMonitor 例子:

  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.11.1
  12. ingress:
  13. hosts:
  14. - exmaple.com
  15. annotations:
  16. foo: "bar"
  17. grafana:
  18. baseImage: grafana/grafana
  19. version: 6.0.1
  20. service:
  21. type: ClusterIP
  22. ingress:
  23. hosts:
  24. - exmaple.com
  25. annotations:
  26. foo: "bar"
  27. initializer:
  28. baseImage: pingcap/tidb-monitor-initializer
  29. version: v3.0.5
  30. reloader:
  31. baseImage: pingcap/tidb-monitor-reloader
  32. version: v1.0.1
  33. imagePullPolicy: IfNotPresent

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

TidbMonitor 的 Ingress 设置同样支持设置 TLS,以下是一个为 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.11.1
  12. ingress:
  13. hosts:
  14. - exmaple.com
  15. tls:
  16. - hosts:
  17. - exmaple.com
  18. secretName: testsecret-tls
  19. grafana:
  20. baseImage: grafana/grafana
  21. version: 6.0.1
  22. service:
  23. type: ClusterIP
  24. initializer:
  25. baseImage: pingcap/tidb-monitor-initializer
  26. version: v3.0.5
  27. reloader:
  28. baseImage: pingcap/tidb-monitor-reloader
  29. version: v1.0.1
  30. imagePullPolicy: IfNotPresent

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

参考

了解 TidbMonitor 更为详细的 API 设置,可以参考 API 文档