要检查每个命名空间使用的内存百分比,您需要一个类似于以下的查询:
sum( container_memory_working_set_bytes{container="", namespace=~".+"} )|
by (namespace) / ignoring (namespace) group_left
sum( machine_memory_bytes{}) * 100
上面的查询应该产生一个类似于这个的图表:
免责声明!
- 上面的屏幕截图来自 Grafana,以获得更好的可见性。
- 此查询不确认可用 RAM 中的更改(节点更改、节点自动缩放等)。
要在 PromQL 中获取一段时间内的指标,您需要使用其他函数,例如:
-
avg_over_time(EXP[time])。
要回到过去并从特定时间点计算资源,您需要使用:
使用上述指针查询应结合到:
avg_over_time( sum(container_memory_working_set_bytes{container="", namespace=~".+"} offset 45m) by (namespace)[120m:]) / ignoring (namespace) group_left
sum( machine_memory_bytes{})
上面的查询将计算每个命名空间使用的内存的平均百分比,并将其除以当前 120 分钟内集群中的所有内存。它也将从当前时间提前 45 分钟开始。
例子:
- 查询运行时间:20:00
avg_over_time(EXPR[2h:])
offset 45 min
以上示例将从 17:15 开始,并将查询运行到 19:15。您可以修改它以包括整个星期:)。
如果您想按命名空间计算 CPU 使用率,可以将此指标替换为以下指标:
-
container_cpu_usage_seconds_total{} - 使用此指标(计数器)时请检查 rate() 函数
machine_cpu_cores{}
您还可以查看此网络指标:
-
container_network_receive_bytes_total - 使用此指标(计数器)时请检查rate() 函数
-
container_network_transmit_bytes_total - 使用此指标(计数器)时请检查 rate() 函数
我在下面提供了更多解释,包括示例(记忆)、测试方法和使用过的查询的剖析。
假设:
- Kubernetes 集群
1.18.6 (Kubespray) 总共有 12GB 内存:
- 具有
2GB 内存的主节点
- 具有
8GB 内存的worker-one 节点
- 具有
2GB 内存的worker-two 节点
- Prometheus 和 Grafana 安装:Github.com: Coreos: Kube-prometheus
- 命名空间
kruk 与单个 ubuntu pod 设置为使用以下命令生成人工负载:
$ stress-ng --vm 1 --vm-bytes <AMOUNT_OF_RAM_USED> --vm-method all -t 60m -v
使用stress-ng 生成了两次人工负载:
- 60 分钟 - 1GB 已用内存
- 60 分钟 - 2GB 已用内存
命名空间kruk在此时间跨度内使用的内存百分比:
- 1GB,约占集群中所有内存的 8.5% (12GB)
- 2GB,约占集群中所有内存的 17.5% (12GB)
来自 Prometheus 查询 kruk 命名空间的负载看起来像这样:
使用avg_over_time(EXPR[time:]) / memory in the cluster 进行的计算显示,在查询人工负载的生成时间时,使用率约为 13% ((17.5+8.5)/2)。这应该表明查询是正确的:
至于使用的查询:
avg_over_time( sum( container_memory_working_set_bytes{container="", namespace="kruk"} offset 1380m )
by (namespace)[120m:]) / ignoring (namespace) group_left
sum( machine_memory_bytes{}) * 100
上面的查询与一开始的查询非常相似,但我做了一些更改以仅显示 kruk 命名空间。
我将查询解释分为两部分(除数/除数)。
股息
container_memory_working_set_bytes{container="", namespace="kruk"}
此指标将输出命名空间kruk 中的内存使用记录。如果您要查询所有命名空间,请查看附加说明:
-
namespace=~".+"
-
container="" container="" 仅在容器值为空时匹配(下面引用的最后一行)。
container_memory_working_set_bytes{container="POD",endpoint="https-metrics",id="/kubepods/podab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b/e249c12010a27f82389ebfff3c7c133f2a5da19799d2f5bb794bcdb5dc5f8bca",image="k8s.gcr.io/pause:3.2",instance="192.168.0.124:10250",job="kubelet",metrics_path="/metrics/cadvisor",name="k8s_POD_ubuntu_kruk_ab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b_0",namespace="kruk",node="worker-one",pod="ubuntu",service="kubelet"} 692224
container_memory_working_set_bytes{container="ubuntu",endpoint="https-metrics",id="/kubepods/podab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b/fae287e7043ff00da16b6e6a8688bfba0bfe30634c52e7563fcf18ac5850f6d9",image="ubuntu@sha256:5d1d5407f353843ecf8b16524bc5565aa332e9e6a1297c73a92d3e754b8a636d",instance="192.168.0.124:10250",job="kubelet",metrics_path="/metrics/cadvisor",name="k8s_ubuntu_ubuntu_kruk_ab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b_0",namespace="kruk",node="worker-one",pod="ubuntu",service="kubelet"} 2186403840
container_memory_working_set_bytes{endpoint="https-metrics",id="/kubepods/podab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b",instance="192.168.0.124:10250",job="kubelet",metrics_path="/metrics/cadvisor",namespace="kruk",node="worker-one",pod="ubuntu",service="kubelet"} 2187096064
您可以在此处阅读有关暂停容器的更多信息:
sum( container_memory_working_set_bytes{container="", namespace="kruk"} offset 1380m )
by (namespace)
此查询将按各自的命名空间汇总结果。 offset 1380m 用于返回过去的测试。
avg_over_time( sum( container_memory_working_set_bytes{container="", namespace="kruk"} offset 1380m )
by (namespace)[120m:])
此查询将从比当前时间早 1380m 开始的指定时间(120m 到现在)内跨命名空间的内存指标计算平均值。
您可以在此处阅读有关avg_over_time() 的更多信息:
除数
sum( machine_memory_bytes{})
此指标将汇总集群中每个节点的可用内存。
EXPR / ignoring (namespace) group_left
sum( machine_memory_bytes{}) * 100
专注于:
其他资源: