Gre*_*dge 4 metrics kubernetes prometheus
给定一个 kubernetes 集群:
我喜欢使用度量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。
有办法实现这一点吗?
长话短说
没有直接的方法可以通过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 和两个部署。
更多参考:
如前所述,您可以使用部署中的标签来查明特定部署使用的资源。
假如说:
memory-testing:
ubuntu有 3 个副本ubuntu-additional有 3 个副本app: ubuntuapp: ubuntu-additional1.18.X为什么要指定 Kubernetes 版本?
Kubernetes 1.16 将从 cAdvisor 指标中删除重复的
pod_name指标container_name标签。对于 1.14 和 1.15 版本,所有pod、pod_name、container和container_name均可作为宽限期使用。
这意味着您需要替换如下参数:
pod和pod_namecontainer和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。
之后,您应该能够获取通过标签(实际上是部署)对已用内存求和的查询。
至于:
我想用 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)
| 归档时间: |
|
| 查看次数: |
17069 次 |
| 最近记录: |