使用 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 v1.0.1 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。