跳到主要内容

监控数据库

您可按需通过不同的监控工具监控集群状态,本教程使用 Prometheus 和 Grafana 作为监控工作,以配置 PostgreSQL 集群的监控功能为例进行说明。

步骤 1. 安装 Prometheus Operator 和 Grafana

安装 Prometheus Operator 和 Grafana, 监控数据库性能指标。如果您的环境中已有 Prometheus Operator,可跳过本节。

  1. 为监控 Operator 创建新的命名空间。

    kubectl create namespace monitoring
  2. 添加 Prometheus Operator Helm 仓库。

    helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
  3. 安装 Prometheus Operator。

    helm install prometheus-operator prometheus-community/kube-prometheus-stack --namespace monitoring
  4. 验证 Prometheus Operator 是否安装成功。

    kubectl get pods -n monitoring
  5. 连接 Prometheus 和 Grafana 大盘。

    1. 查看 Prometheus 和 Grafana 的服务端口。

      kubectl get svc -n monitoring
    2. 使用 port forward 从本地连接 Prometheus 大盘。

      kubectl port-forward svc/prometheus-operator-kube-p-prometheus -n monitoring 9090:9090

      您也可通过在浏览器中打开 "http://localhost:9090" 地址,连接 Prometheus 大盘。

    3. 从 secret 中获取 Grafana 的连接凭证。

      kubectl get secrets prometheus-operator-grafana -n monitoring -oyaml
    4. 使用 port forward 从本地连接 Grafana 大盘。

      kubectl port-forward svc/prometheus-operator-grafana -n monitoring 3000:80

      您也可通过在浏览器中打开 "http://localhost:3000" 地址,连接 Grafana 大盘。

  6. (可选)配置 PodMonitorServiceMonitor 选择器。

    Prometheus Operator 使用 Prometheus CRD 创建实例,自定义配置 replica、PVC 等其他参数。

    如需更新 PodMonitorServiceMonitor 的配置,您可按需更新 Prometheus CR 文件。

    apiVersion: monitoring.coreos.com/v1
    kind: Prometheus
    metadata:
    spec:
    podMonitorNamespaceSelector: {} # 匹配 PodMonitor 的命名空间
    # 选择用于目标发现的 PodMonitors。空的标签选择器
    # 会匹配所有对象
    podMonitorSelector:
    matchLabels:
    release: prometheus # 确保您的 PodMonitor CR 的标签与此选择器匹配
    serviceMonitorNamespaceSelector: {} # 匹配 ServiceMonitor 的命名空间
    # 选择用于目标发现的 ServiceMonitors。空的标签选择器
    # 会匹配所有对象
    serviceMonitorSelector:
    matchLabels:
    release: prometheus # 确保您的 ServiceMonitor CR 的标签与此选择器匹配

步骤 2. 监控数据库集群

监控集群的方式多种多样,本文档中我们使用 Promethus 和 Grafana 演示如何监控集群。

开启集群的监控 exporter

创建新集群并开启监控 exporter

使用以下命令创建集群,并开启监控 exporter。

创建集群时,请确保 spec.componentSpecs.disableExporter 设为 false

cat <<EOF | kubectl apply -f -
apiVersion: apps.kubeblocks.io/v1
kind: Cluster
metadata:
name: mycluster
namespace: demo
spec:
terminationPolicy: Delete
clusterDef: postgresql
topology: replication
componentSpecs:
- name: postgresql
componentDef: postgresql
serviceVersion: "14.7.2"
disableExporter: false
labels:
apps.kubeblocks.postgres.patroni/scope: mycluster-postgresql
replicas: 2
resources:
limits:
cpu: "0.5"
memory: "0.5Gi"
requests:
cpu: "0.5"
memory: "0.5Gi"
volumeClaimTemplates:
- name: data
spec:
storageClassName: ""
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi

EOF

开启已有集群的监控 exporter

如果您的环境中已有集群,可执行以下命令查看监控 exporter 是否开启。

kubectl get cluster mycluster -o yaml
输出
apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
...
spec:
...
componentSpecs:
...
disableExporter: false

disableExporter 设置为 false 或使用隐式设置(使用默认值),即表示监控 exporter 已启用,这是监控功能正常运行的前提条件。如果输出结果显示 disableExporter: true,您需要将其修改为 false,开启监控 exporter。

请注意更新 disableExporter 字段会导致集群中的所有 Pod 重启。

kubectl patch cluster mycluster -n demo --type "json" -p '[{"op":"add","path":"/spec/componentSpecs/0/disableExporter","value":false}]'

集群运行时,每个 Pod 都拥有一个名为 exporter 的 sidecar 容器,用于运行 postgres-exporter。

创建 PodMonitor

  1. 获取 scrapePathscrapePort

    您可从 Pod 的 exporter 容器中获取 scrapePathscrapePort

    kubectl get po mycluster-postgresql-0 -oyaml | yq '.spec.containers[] | select(.name=="exporter") | .ports '
    输出
    - containerPort: 9187
    name: http-metrics
    protocol: TCP
  2. 创建 PodMonitor

    应用 PodMonitor 文件,监控集群。以下展示了不同引擎的创建示例,您可按需修改相关参数值。

    您也可以在 KubeBlocks Addons 仓库中查看最新版本示例 YAML 文件。

    kubectl apply -f - <<EOF
    apiVersion: monitoring.coreos.com/v1
    kind: PodMonitor
    metadata:
    name: mycluster-pod-monitor
    namespace: monitoring # 说明:此处为 Prometheus operator 所在的 namespace
    labels: # 此处对应 `prometheus.spec.podMonitorSelector` 中设置的标签。
    release: prometheus
    spec:
    jobLabel: kubeblocks-service
    # 定义了从关联的 Kubernetes `Pod` 对象
    # 传递到采集指标上的标签
    # 请按需设置标签
    podTargetLabels:
    - app.kubernetes.io/instance
    - app.kubernetes.io/managed-by
    - apps.kubeblocks.io/component-name
    - apps.kubeblocks.io/pod-name
    podMetricsEndpoints:
    - path: /metrics
    port: http-metrics
    scheme: http
    namespaceSelector:
    matchNames:
    - default
    selector:
    matchLabels:
    app.kubernetes.io/instance: mycluster
    apps.kubeblocks.io/component-name: mysql
    EOF
  3. 连接 Grafana 大盘.

    登录 Grafana 大盘,并导入大盘。

    Grafana 大盘的 APPS / PostgreSQL 文件夹下有预设的大盘模板。您也可以在 Grafana 大盘商店获取更多大盘模板。

备注

请确保 PodMonitor 文件中的标签(如 endpoint 中的 path 和 port 值)设置正确,与您使用的大盘匹配。