通过 TidbMonitor 监控 TiDB 集群
在 v1.1 及更高版本的 TiDB Operator 中,我们可以通过简单的 CR 文件(即 TidbMonitor)来快速建立对 Kubernetes 集群上的 TiDB 集群的监控。
快速上手
注意:
快速上手只是用来作为演示或是测试,请勿将以下配置部署在关键、生产环境。
前置条件
- 已经安装了 Operator
v1.1.0-beta.1
及以上版本,并且已经更新了相关版本的 CRD 文件 - 已经设置了默认的 storageClass,并保证其有足够的 PV(默认情况下需要 6 个 PV)。这可以通过以下指令来验证:
$ kubectl get storageClass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
standard (default) rancher.io/local-path Delete WaitForFirstConsumer false 14h
安装
你可以在 Kubernetes 集群上通过 CR 文件快速建立起一个 TidbMonitor 监控 TiDB 集群。接下来我们可以将以下内容存为 yaml 文件,通过 kubectl apply -f
的方式部署一个 TidbMonitor 组件。
注意:
目前一个 TidbMonitor 只支持监控一个 TidbCluster。
apiVersion: pingcap.com/v1alpha1
kind: TidbMonitor
metadata:
name: basic
spec:
clusters:
- name: basic
prometheus:
baseImage: prom/prometheus
version: v2.11.1
service:
type: NodePort
grafana:
baseImage: grafana/grafana
version: 6.0.1
initializer:
baseImage: pingcap/tidb-monitor-initializer
version: v3.1.0
reloader:
baseImage: pingcap/tidb-monitor-reloader
version: v1.0.1
imagePullPolicy: IfNotPresent
或者你可以通过以下方式快速部署 TidbMonitor:
kubectl apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/basic/tidb-monitor.yaml -n ${namespace}
然后我们通过 kubectl get pod 命令来检查 TidbMonitor 启动完毕:
$ kubectl get pod -l app.kubernetes.io/instance=basic -n ${namespace} | grep monitor
basic-monitor-85fcf66bc4-cwpcn 3/3 Running 0 117s
查看监控面板
运行以下命令查看监控面板:
kubectl -n ${namespace} port-forward svc/basic-grafana 3000:3000 &>/tmp/pf-grafana.log &
然后访问 localhost:3000。
删除监控
kubectl delete tidbmonitor basic -n ${namespace}
持久化监控数据
如果我们需要将 TidbMonitor 的监控数据持久化存储,我们需要在 TidbMonitor 中开启持久化选项:
apiVersion: pingcap.com/v1alpha1
kind: TidbMonitor
metadata:
name: basic
spec:
clusters:
- name: basic
persistent: true
storageClassName: ${storageClassName}
storage: 5G
prometheus:
baseImage: prom/prometheus
version: v2.11.1
service:
type: NodePort
grafana:
baseImage: grafana/grafana
version: 6.0.1
service:
type: NodePort
initializer:
baseImage: pingcap/tidb-monitor-initializer
version: v3.1.0
reloader:
baseImage: pingcap/tidb-monitor-reloader
version: v1.0.1
imagePullPolicy: IfNotPresent
你可以通过以下命令来确认 PVC 情况:
$ kubectl get pvc -l app.kubernetes.io/instance=basic,app.kubernetes.io/component=monitor -n ${namespace}
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
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。
apiVersion: pingcap.com/v1alpha1
kind: TidbMonitor
metadata:
name: basic
spec:
clusters:
- name: basic
kubePrometheusURL: "your-kube-prometheus-url"
alertmanagerURL: "your-alert-manager-url"
prometheus:
baseImage: prom/prometheus
version: v2.11.1
service:
type: NodePort
grafana:
baseImage: grafana/grafana
version: 6.0.1
service:
type: NodePort
initializer:
baseImage: pingcap/tidb-monitor-initializer
version: v3.1.0
reloader:
baseImage: pingcap/tidb-monitor-reloader
version: v1.0.1
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
例子:
apiVersion: pingcap.com/v1alpha1
kind: TidbMonitor
metadata:
name: ingress-demo
spec:
clusters:
- name: demo
persistent: false
prometheus:
baseImage: prom/prometheus
version: v2.11.1
ingress:
hosts:
- exmaple.com
annotations:
foo: "bar"
grafana:
baseImage: grafana/grafana
version: 6.0.1
service:
type: ClusterIP
ingress:
hosts:
- exmaple.com
annotations:
foo: "bar"
initializer:
baseImage: pingcap/tidb-monitor-initializer
version: v3.0.5
reloader:
baseImage: pingcap/tidb-monitor-reloader
version: v1.0.1
imagePullPolicy: IfNotPresent
你可以通过 spec.prometheus.ingress.annotations
与 spec.grafana.ingress.annotations
来设置对应的 Ingress Annotations 的设置。如果你使用的是默认的 Nginx Ingress 方案,你可以在 Nginx Ingress Controller Annotation 了解更多关于 Annotations 的详情。
TidbMonitor
的 Ingress 设置同样支持设置 TLS,以下是一个为 Ingress 设置 TLS 的例子。你可以通过 Ingress TLS 来了解更多关于 Ingress TLS 的资料。
apiVersion: pingcap.com/v1alpha1
kind: TidbMonitor
metadata:
name: ingress-demo
spec:
clusters:
- name: demo
persistent: false
prometheus:
baseImage: prom/prometheus
version: v2.11.1
ingress:
hosts:
- exmaple.com
tls:
- hosts:
- exmaple.com
secretName: testsecret-tls
grafana:
baseImage: grafana/grafana
version: 6.0.1
service:
type: ClusterIP
initializer:
baseImage: pingcap/tidb-monitor-initializer
version: v3.0.5
reloader:
baseImage: pingcap/tidb-monitor-reloader
version: v1.0.1
imagePullPolicy: IfNotPresent
TLS Secret 必须包含名为 tls.crt 和 tls.key 的密钥,这些密钥包含用于 TLS 的证书和私钥,例如:
apiVersion: v1
kind: Secret
metadata:
name: testsecret-tls
namespace: ${namespace}
data:
tls.crt: base64 encoded cert
tls.key: base64 encoded key
type: kubernetes.io/tls
参考
了解 TidbMonitor 更为详细的 API 设置,可以参考 API 文档。