【发布时间】:2019-03-03 13:59:50
【问题描述】:
用例/问题
我负责维护一个有 40 个节点(跨 2 个区域)的 Kubernetes 集群。我们在这个集群中运行了大约 100 个微服务和平台,比如 Kafka 代理。所有微服务都定义了资源请求和限制。然而,它们中的大多数都是可爆裂的,并且没有保证 RAM。在我们的集群中部署他们的服务的开发人员定义的限制远远大于请求(见下面的示例),这最终导致在各个节点上被驱逐了很多 pod。尽管如此,我们仍然希望在我们的服务中使用可爆资源,因为我们可以使用可爆资源来节省资金。因此,我需要更好地监控每个节点上运行的所有 pod,包含以下信息:
- 节点名称和 CPU / RAM 容量
- 所有 pod 名称加上
- pod 的资源请求和限制
- pod 的当前 cpu 和 ram 使用率
这样我可以很容易地识别出两种有问题的服务:
案例 A: 只是设置了巨大资源限制的微服务,因为开发人员只是在测试东西或者懒得去测试/监控他的服务
resources:
requests:
cpu: 100m
ram: 500Mi
limits:
cpu: 6
ram: 20Gi
案例 B: 同一节点上的服务过多,设置的资源限制不准确(例如 500Mi,但服务始终使用 1.5Gi RAM)。这种情况发生在我们身上,因为 Java 开发人员没有注意到 Java 垃圾收集器只会在 75% 的可用 RAM 被使用时才开始清理。
我的问题:
我怎样才能正确监控这一点,从而识别错误配置的微服务,以防止此类驱逐问题?在较小的规模上,我可以简单地运行 kubectl describe nodes 和 kubectl top pods 来手动计算,但在这个规模上,它不再起作用了。
注意:我找不到任何现有的解决方案(包括使用 kube 指标和类似指标的 prometheus + grafana 板)。我认为这是可能的,但在 Grafana 中可视化这些东西真的很难。
【问题讨论】:
-
对于仍在研究此问题的任何人:我为此目的创建了一个名为“kube eagle”的 prometheus 导出器。我打算维护它,一旦我真的对它感到满意,我也会写一些关于它的文章。它对我们有很大帮助,我们每天都在使用它:github.com/google-cloud-tools/kube-eagle
标签: kubernetes monitoring