按部署名称排列的container_memory_usage_bytes

Gre*_*dge 4 metrics kubernetes prometheus

给定一个 kubernetes 集群:

  1. 普罗米修斯
  2. 节点导出器
  3. kube 状态指标

我喜欢使用度量container_memory_usage_bytes,但选择 bydeployment_name而不是pod。

只要没有部署,像container_memory_usage_bytes{pod_name=~"foo-.+"}if 这样的选择器就很棒。deployment_name=foodeployment_name=foo-bar

我想用 metric 实现同样的目标kube_pod_container_resource_limits_memory_bytes。

有办法实现这一点吗?

Daw*_*ruk 6

长话短说

没有直接的方法可以通过deployment-name.

您可以使用部署的标签查询特定部署的内存使用情况。

使用的查询:

sum(
  kube_pod_labels{label_app=~"ubuntu.*"} * on (pod) group_right(label_app) container_memory_usage_bytes{namespace="memory-testing", container=""}
  ) 
  by (label_app)
Run Code Online (Sandbox Code Playgroud)

有一篇很棒的文章解释了这个查询背后的概念。我鼓励你阅读它:

我在下面的示例中提供了解释。


问题中提到的选择器: container_memory_usage_bytes{pod_name=~"foo-.+"}

.+- 匹配任何字符串但不匹配空字符串

带有像这样的豆荚:

  • foo-12345678-abcde-将匹配(部署foo)
  • foo-deployment-98765432-zyxzy-将匹配(部署foo-deployment)

如上所示,它将匹配两个 Pod 和两个部署。

更多参考:


如前所述,您可以使用部署中的标签来查明特定部署使用的资源。

假如说:

  • 命名空间中有 2 个部署memory-testing:
    • ubuntu有 3 个副本
    • ubuntu-additional有 3 个副本
  • 上述部署的标签与其名称相同(它们可以不同):
    • app: ubuntu
    • app: ubuntu-additional
  • Kubernetes集群版本1.18.X

为什么要指定 Kubernetes 版本?

Kubernetes 1.16 将从 cAdvisor 指标中删除重复的pod_name指标container_name标签。对于 1.14 和 1.15 版本,所有pod、pod_name、container和container_name均可作为宽限期使用。

这意味着您需要替换如下参数:

  • pod和pod_name
  • container和container_name

为了部署 Prometheus 和其他工具来监控集群,我使用了:Github.com:Coreos:Kube-prometheus

部署中的 Podubuntu配置为生成人工负载 ( stress-ng)。这样做是为了展示如何避免所用资源加倍的情况。

命名空间中 pod 使用的资源memory-testing:

sum(
  kube_pod_labels{label_app=~"ubuntu.*"} * on (pod) group_right(label_app) container_memory_usage_bytes{namespace="memory-testing", container=""}
  ) 
  by (label_app)
Run Code Online (Sandbox Code Playgroud)

如果您要使用以下查询来查询 Prometheus:

container_memory_usage_bytes{namespace="memory-testing", pod=~"ubuntu.*"}
Run Code Online (Sandbox Code Playgroud)

您将得到类似于下面的输出(出于示例目的,它被剪切为仅显示一个 pod,默认情况下它将显示ubuntu名称和memory-testing命名空间中的所有 pod):

container_memory_usage_bytes{endpoint="https-metrics",id="/kubepods/besteffort/podb96dea39-b388-471e-a789-8c74b1670c74",instance="192.168.0.117:10250",job="kubelet",metrics_path="/metrics/cadvisor",namespace="memory-testing",node="node1",pod="ubuntu-5b5d6c56f6-cfr9g",service="kubelet"} 308559872
container_memory_usage_bytes{container="POD",endpoint="https-metrics",id="/kubepods/besteffort/podb96dea39-b388-471e-a789-8c74b1670c74/312980f90e6104d021c12c376e83fe2bfc524faa4d4cee6553182d0fa2e007a1",image="k8s.gcr.io/pause:3.2",instance="192.168.0.117:10250",job="kubelet",metrics_path="/metrics/cadvisor",name="k8s_POD_ubuntu-5b5d6c56f6-cfr9g_memory-testing_b96dea39-b388-471e-a789-8c74b1670c74_0",namespace="memory-testing",node="node1",pod="ubuntu-5b5d6c56f6-cfr9g",service="kubelet"} 782336
container_memory_usage_bytes{container="ubuntu",endpoint="https-metrics",id="/kubepods/besteffort/podb96dea39-b388-471e-a789-8c74b1670c74/1b93889a3e7415ad3fa040daf89f3f6bc77e569d85069de518267666ede8e21c",image="ubuntu@sha256:55cd38b70425947db71112eb5dddfa3aa3e3ce307754a3df2269069d2278ce47",instance="192.168.0.117:10250",job="kubelet",metrics_path="/metrics/cadvisor",name="k8s_ubuntu_ubuntu-5b5d6c56f6-cfr9g_memory-testing_b96dea39-b388-471e-a789-8c74b1670c74_0",namespace="memory-testing",node="node1",pod="ubuntu-5b5d6c56f6-cfr9g",service="kubelet"} 307777536
Run Code Online (Sandbox Code Playgroud)

此时,您需要选择要使用的指标。在这个例子中我使用了第一个。如需更深入的了解,请查看以下文章:

如果我们将这些指标汇总起来,sum (QUERY) by (pod)我们报告的已使用资源实际上会增加一倍。

剖析主要查询:

container_memory_usage_bytes{namespace="memory-testing", container=""}
Run Code Online (Sandbox Code Playgroud)

上面的查询将输出每个 Pod 的已用内存指标记录。该container=""参数用于仅获取一条没有container参数的记录(前面提到过)。

kube_pod_labels{label_app=~"ubuntu.*"}
Run Code Online (Sandbox Code Playgroud)

上面的查询将输出包含 pod 的记录,其标签的正则表达式为ubuntu.*

kube_pod_labels{label_app=~"ubuntu.*"} * on (pod) group_right(label_app) container_memory_usage_bytes{namespace="memory-testing", container=""}
Run Code Online (Sandbox Code Playgroud)

上面的查询将匹配podfromkube_pod_labels和podofcontainer_memory_usage_bytes并将 the 添加label_app到每条记录中。

sum (kube_pod_labels{label_app=~"ubuntu.*"} * on (pod) group_right(label_app) container_memory_usage_bytes{namespace="memory-testing", container=""}) by (label_app)
Run Code Online (Sandbox Code Playgroud)

上面的查询将对记录进行求和label_app。

之后,您应该能够获取通过标签(实际上是部署)对已用内存求和的查询。

Grafana Prometheus 查询


至于:

我想用 metric 实现同样的目标 kube_pod_container_resource_limits_memory_bytes。

您可以使用以下查询来获取标记有标签的部署的内存限制(如上例所示),假设部署中的每个 Pod 都具有相同的限制:

kube_pod_labels{label_app="ubuntu-with-limits"} * on (pod) group_right(label_app) kube_pod_container_resource_limits_memory_bytes{namespace="memory-testing", pod=~".*"}
Run Code Online (Sandbox Code Playgroud)

您可以在此查询上应用avg(), mean(),等函数max()来获取将成为您的内存限制的单个数字:

avg(kube_pod_labels{label_app="ubuntu-with-limits"} * on (pod) group_right(label_app) kube_pod_container_resource_limits_memory_bytes{namespace="memory-testing", pod=~".*"}) by (label_app)
Run Code Online (Sandbox Code Playgroud)

如果您使用的话,您的内存限制可能会有所不同VPA。在这种情况下,您可以同时显示所有这些,或者使用 来avg()获取所有“部署”的平均值。

综合资源和限制


作为上述解决方案的解决方法,您可以尝试使用正则表达式,如下所示:

container_memory_usage_bytes{pod=~"^ubuntu-.{6,10}-.{5}"}
Run Code Online (Sandbox Code Playgroud)