使用 Prometheus 和 GreptimeDB 监控 Kubernetes 指标
本指南演示如何建立一个完整的 Kubernetes 监控解决方案, 该方案使用 Prometheus 收集指标, 使用 GreptimeDB 作为长期存储后端。
什么是 Kubernetes 监控
Kubernetes 监控指的是从 Kubernetes 集群中收集、分析和处理指标和日志。 它是检查容器化应用程序和基础设施的健康状况、性能和资源利用率的关键。
Kubernetes 主要监控以下信息:
- 资源指标:节点、Pod 和容器的 CPU、内存、磁盘和网络使用情况
- 集群健康:集群组件如 kube-apiserver、etcd 和 controller-manager 的状态
- 应用程序指标:在集群中运行的应用程序指标
- 事件和日志:用于故障诊断的 Kubernetes 事件和容器日志
有效的监控可以帮助你:
- 在问题影响用户之前检测和诊断问题
- 优化资源利用率并降低成本
- 基于历史趋势进行容量规划
- 确保 SLA 合规性
- 排查性能瓶颈
架构概览
监控架构由以下组件组成:
组件:
- kube-state-metrics:导出关于 Kubernetes 对象(部署、Pod、服务等)的集群级指标
- Node Exporter:从每个 Kubernetes 节点导出硬件和操作系统级指标
- Prometheus Operator:使用 Kubernetes 自定义资源自动化 Prometheus 部署和配置
- GreptimeDB:Prometheus 指标的长期存储后端,具有高压缩率和查询性能
- Grafana:为存储在 GreptimeDB 中的指标提供仪表板和可视化
前提条件
在开始之前,确保你拥有:
- 一个运行中的 Kubernetes 集群(版本 >= 1.18)
- 已配置 kubectl以访问你的集群
- 已安装 Helm v3.0.0 或更高版本
- 足够的集群资源(至少 2 个 CPU 核心和 4GB 可用内存)
安装 GreptimeDB
GreptimeDB 被作为 Prometheus 指标的长期存储后端, 请参考部署 GreptimeDB 集群文档了解如何部署。
验证 GreptimeDB 的部署
部署 GreptimeDB 后,验证集群是否正常运行中。
在本指南中,我们假设 GreptimeDB 集群部署在 greptime-cluster 命名空间,名称为 greptimedb。
kubectl -n greptime-cluster get greptimedbclusters.greptime.io greptimedb
NAME         FRONTEND   DATANODE   META   FLOWNODE   PHASE     VERSION   AGE
greptimedb   1          2          1      1          Running   v0.17.2   33s
检查 Pod 状态:
kubectl get pods -n greptime-cluster
NAME                                  READY   STATUS    RESTARTS    AGE
greptimedb-datanode-0                 1/1     Running   0           71s
greptimedb-datanode-1                 1/1     Running   0           97s
greptimedb-flownode-0                 1/1     Running   0           64s
greptimedb-frontend-8bf9f558c-7wdmk   1/1     Running   0           90s
greptimedb-meta-fc4ddb78b-nv944       1/1     Running   0           87s
访问 GreptimeDB
可以将 frontend 服务的端口转发到本地来连接 GreptimeDB。
GreptimeDB 支持多种协议,其中 MySQL 协议默认使用端口 4002。
kubectl port-forward -n greptime-cluster svc/greptimedb-frontend 4002:4002
使用 MySQL 客户端连接 GreptimeDB:
mysql -h 127.0.0.1 -P 4002
存储分区
为了提高查询性能并降低存储成本,
GreptimeDB 会基于 Prometheus 指标标签自动创建列,并将指标存储在物理表中,默认使用的物理表名为 greptime_physical_table。
在上方我们部署了具有多个 datanode 节点的 GreptimeDB 集群,
你可以对表进行分区将数据分布到各个 datanode 节点上,以获得更好的可扩展性和性能。
在此 Kubernetes 监控场景中,
可以使用 namespace 标签作为分区键。
例如,对于 kube-public、kube-system、monitoring、default、greptime-cluster 和 etcd-cluster 等命名空间,
你可以基于命名空间的首字母创建分区方案:
CREATE TABLE greptime_physical_table (
  greptime_value DOUBLE NULL,
  namespace STRING PRIMARY KEY,
  greptime_timestamp TIMESTAMP TIME INDEX,
)
PARTITION ON COLUMNS (namespace) (
  namespace < 'f',
  namespace >= 'f' AND namespace < 'g',
  namespace >= 'g' AND namespace < 'k',
  namespace >= 'k'
)
ENGINE = metric
WITH (
  "physical_metric_table" = ""
);
有关 Prometheus 指标存储和查询性能优化的更多信息, 请参阅使用 metric engine 提高效率指南。
GreptimeDB 中的 Prometheus URL
GreptimeDB 在 HTTP 上下文 /v1/prometheus/ 下提供了兼容 Prometheus 的 API,
使其能够与现有的 Prometheus 工作流程无缝集成。
你需要 GreptimeDB 服务地址来配置 Prometheus。 由于 GreptimeDB 在 Kubernetes 集群内运行,所以使用内部集群地址。
GreptimeDB frontend 服务地址遵循以下模式:
<greptimedb-name>-frontend.<namespace>.svc.cluster.local:<port>
在本指南中:
- GreptimeDB 集群名称:greptimedb
- 命名空间:greptime-cluster
- Frontend 端口:4000
因此服务地址为:
greptimedb-frontend.greptime-cluster.svc.cluster.local:4000
Prometheus 的完整 Remote Write URL 为:
http://greptimedb-frontend.greptime-cluster.svc.cluster.local:4000/v1/prometheus/write
此 URL 包含:
- 服务端点:greptimedb-frontend.greptime-cluster.svc.cluster.local:4000
- API 路径:/v1/prometheus/write
安装 Prometheus
现在 GreptimeDB 正常运行中, 我们将安装 Prometheus 收集指标并将其发送到 GreptimeDB。
添加 Prometheus Community Helm 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
安装 kube-prometheus-stack
kube-prometheus-stack 是 一个综合的监控解决方案,包括
Prometheus、Grafana、kube-state-metrics 和 node-exporter 组件。
此 stack 自动发现和监控所有 Kubernetes 命名空间,
收集来自集群组件、节点和工作负载的指标。
在此部署中, 我们将配置 Prometheus 使用 GreptimeDB 作为 Remote Write 目标长期存储指标数据, 并配置 Grafana 的默认 Prometheus 数据源使用 GreptimeDB。
创建一个 kube-prometheus-values.yaml 文件,包含以下配置:
# 配置 Prometheus 远程写入到 GreptimeDB
prometheus:
  prometheusSpec:
    remoteWrite:
      - url: http://greptimedb-frontend.greptime-cluster.svc.cluster.local:4000/v1/prometheus/write
# 配置 Grafana 使用 GreptimeDB 作为默认 Prometheus 数据源
grafana:
  datasources:
    datasources.yaml:
      apiVersion: 1
      datasources:
        - name: Prometheus
          type: prometheus
          url: http://greptimedb-frontend.greptime-cluster.svc.cluster.local:4000/v1/prometheus
          access: proxy
          editable: true
此配置文件为以下用途指定了GreptimeDB 服务地址:
- Prometheus Remote Write:将收集的指标发送到 GreptimeDB 进行长期存储
- Grafana 数据源:将 GreptimeDB 配置为仪表板查询的默认 Prometheus 数据源
使用 Helm 和自定义配置文件安装 kube-prometheus-stack:
helm install kube-prometheus prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --create-namespace \
  --values kube-prometheus-values.yaml
验证安装
检查所有 Prometheus 组件是否正在运行:
kubectl get pods -n monitoring
NAME                                                     READY   STATUS    RESTARTS       AGE
alertmanager-kube-prometheus-kube-prome-alertmanager-0   2/2     Running        0          60s
kube-prometheus-grafana-78ccf96696-sghx4                 3/3     Running        0          78s
kube-prometheus-kube-prome-operator-775fdbfd75-w88n7     1/1     Running        0          78s
kube-prometheus-kube-state-metrics-5bd5747f46-d2sxs      1/1     Running        0          78s
kube-prometheus-prometheus-node-exporter-ts9nn           1/1     Running        0          78s
prometheus-kube-prometheus-kube-prome-prometheus-0       2/2     Running        0          60s
验证监控状态
使用 MySQL protocol 查询 GreptimeDB,验证 Prometheus 指标是否已写入。
SHOW TABLES;
你应该能看到为各种 Prometheus 指标创建的表名。
+---------------------------------------------------------------------------------+
| Tables                                                                          |
+---------------------------------------------------------------------------------+
| :node_memory_MemAvailable_bytes:sum                                             |
| ALERTS                                                                          |
| ALERTS_FOR_STATE                                                                |
| aggregator_discovery_aggregation_count_total                                    |
| aggregator_unavailable_apiservice                                               |
| alertmanager_alerts                                                             |
| alertmanager_alerts_invalid_total                                               |
| alertmanager_alerts_received_total                                              |
| alertmanager_build_info                                                         |
| ......                                                                          |
+---------------------------------------------------------------------------------+
1553 rows in set (0.18 sec)
使用 Grafana 进行可视化
Grafana 包含在 kube-prometheus-stack 中, 并预配置了 Prometheus 作为数据源的仪表盘。
访问 Grafana
将 Grafana 服务的端口转发到本地以访问 Web 界面:
kubectl port-forward -n monitoring svc/kube-prometheus-grafana 3000:80
获取管理员凭证
使用 kubectl 检索登录使用的 admin 密码:
kubectl get secret --namespace monitoring kube-prometheus-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
登录 Grafana
- 打开浏览器并导航到 http://localhost:3000
- 使用以下凭证登录:
- 用户名:admin
- 密码:从上一步检索到的密码
查看预配置的仪表板
登录后,导航到仪表板以探索预配置的 Kubernetes 监控仪表板:
- Kubernetes / Compute Resources / Cluster:集群范围的资源利用率概览
- Kubernetes / Compute Resources / Namespace (Pods):按命名空间分解的资源使用情况
- Kubernetes / Compute Resources / Node (Pods):节点级资源监控
- Node Exporter / Nodes:详细的节点硬件和操作系统指标

总结
你现在部署了完整的 Kubernetes 监控解决方案, 使用 Prometheus 收集指标,使用 GreptimeDB 提供高效的长期存储。 该解决方案使你能够:
- 实时监控集群和应用程序健康状况
- 存储指标以进行历史分析和容量规划
- 使用 Grafana 创建丰富的可视化和仪表板
- 使用 PromQL 和 SQL 查询指标
有关 GreptimeDB 和 Prometheus 集成的更多信息,请参阅: