3

问题

从 prometheus 查询来自kube-state-metrics 的指标时重复数据。

运行 3 个kube-state-metrics实例的示例查询和结果:

询问:

kube_pod_container_resource_requests_cpu_cores{namespace="ns-dummy"}

指标

kube_pod_container_resource_requests_cpu_cores{container="appname",endpoint="http",instance="172.232.35.142:8080",job="kube-state-metrics",namespace="ns-dummy",node="ip-172-232-34-25.ec2.internal",pod="app1-appname-6bd9d8d978-gfk7f",service="prom-kube-state-metrics"}
1
kube_pod_container_resource_requests_cpu_cores{container="appname",endpoint="http",instance="172.232.35.142:8080",job="kube-state-metrics",namespace="ns-dummy",node="ip-172-232-35-22.ec2.internal",pod="app2-appname-ccbdfc7c8-g9x6s",service="prom-kube-state-metrics"}
1
kube_pod_container_resource_requests_cpu_cores{container="appname",endpoint="http",instance="172.232.35.17:8080",job="kube-state-metrics",namespace="ns-dummy",node="ip-172-232-34-25.ec2.internal",pod="app1-appname-6bd9d8d978-gfk7f",service="prom-kube-state-metrics"}
1
kube_pod_container_resource_requests_cpu_cores{container="appname",endpoint="http",instance="172.232.35.17:8080",job="kube-state-metrics",namespace="ns-dummy",node="ip-172-232-35-22.ec2.internal",pod="app2-appname-ccbdfc7c8-g9x6s",service="prom-kube-state-metrics"}
1
kube_pod_container_resource_requests_cpu_cores{container="appname",endpoint="http",instance="172.232.37.171:8080",job="kube-state-metrics",namespace="ns-dummy",node="ip-172-232-34-25.ec2.internal",pod="app1-appname-6bd9d8d978-gfk7f",service="prom-kube-state-metrics"}
1
kube_pod_container_resource_requests_cpu_cores{container="appname",endpoint="http",instance="172.232.37.171:8080",job="kube-state-metrics",namespace="ns-dummy",node="ip-172-232-35-22.ec2.internal",pod="app2-appname-ccbdfc7c8-g9x6s",service="prom-kube-state-metrics"}

观察

当 N 个 Pod 运行kube-state-metrics时,每个指标都会出现 Nx 。如果它是单个 pod 运行,我们会得到正确的信息。

可能的解决方案

  1. 缩小到 kube-state-metrics 的单个实例。(可用性降低是一个问题)
  2. 启用分片。(解决重复问题,仍然较少可用)

根据文档,对于水平缩放,我们必须将分片参数传递给 pod。

分片是零索引的。所以我们必须为每个 pod 传递索引和分片总数。

我们正在使用Helm 图表,它被部署为部署。

问题

  1. 如果可能的话,在这种情况下,我们如何将不同的参数传递给不同的 pod?
  2. 考虑到 k8s 工作负载的自我修复特性,我们是否应该担心kube-state-metrics的可用性?
  3. 我们什么时候应该真正将它扩展到多个实例以及如何?
4

1 回答 1

0

您可以使用只有一个副本的“自我修复”部署,kube-state-metric如果容器关闭,部署将启动一个新容器。由于 kube-state-metric并不关注各个 kubernetes 组件的健康状况。只有当您的集群太大并且每秒进行许多对象更改时,它才会影响您。

它不关注单个 Kubernetes 组件的健康状况,而是关注内部各种对象的健康状况,例如部署、节点和 Pod。

对于小型集群,这种方式使用没有问题,但是你确实需要一个高可用的监控平台我推荐你看看这两篇文章: 为kubernetes和 kubernetes监控创建一个设计良好的高可用监控栈

于 2020-01-21T09:30:46.903 回答