监视Kubernetes节点上的pod资源使用情况

问题描述 投票:3回答:3

用例/问题

我负责维护一个包含40个节点的kubernetes集群(分为2个区域)。我们有大约100个微服务和平台资源,比如在这个集群中运行的Kafka经纪人。所有微服务都定义了资源请求和限制。然而,它们中的大多数是可突发的并且没有保证RAM。在我们的集群中定义服务的开发人员定义的限制远远大于请求(参见下面的示例),这最终导致在各个节点上出现大量被逐出的pod。我们仍然希望在我们的服务中使用可突发资源,因为我们可以使用可突发资源来节省资金。因此,我需要更好地监控每个节点上运行的所有pod,包含以下信息:

  • 节点名称和CPU / RAM容量
  • 所有pod名称加上 pod资源请求和限制 pods当前的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 nodeskubectl top pods手动计算出来,但在这种规模,不再工作。

注意:我找不到任何现有的解决方案(包括使用kube指标和类似的prometheus + grafana板)。我认为这是可能的,但在Grafana中可视化这些东西真的很难。

kubernetes monitoring
3个回答
4
投票

为此目的,我最终写了一个自己的prometheus出口商。虽然节点导出器提供了使用统计信息,而kube状态度量标准公开了有关kubernetes资源对象的度量标准,但要组合和聚合这些度量标准并不容易,以便它们提供有价值的信息来解决所描述的用例。

使用Kube Eagle(https://github.com/google-cloud-tools/kube-eagle/),您可以轻松创建这样的仪表板(https://grafana.com/dashboards/9871):

Grafana dashboard for Kubernetes resource monitoring

我还写了一篇关于这如何帮助我节省大量硬件资源的中篇文章:https://medium.com/@martin.schneppenheim/utilizing-and-monitoring-kubernetes-cluster-resources-more-effectively-using-this-tool-df4c68ec2053


3
投票

这是一个众所周知的问题,因为仍有一个开放的github issue,社区正在请求开发人员创建一个新命令,该命令将显示pod /容器的总CPU和内存使用情况。请检查此链接,因为社区提供了一些想法和解决方法,看起来它们可能对您的案例有用。

您是否使用了适当的指标,而且您无法看到所需的信息? Here是pod指标的列表,我认为其中一些对你的用例很有用。

即使由于社区和其他一些资源而没有完全功能的解决方案,但有几种方法可以实现您的目标:正如本article所述:

kubectl get nodes --no-headers | awk '{print $1}' | xargs -I {} sh -c 'echo {}; kubectl describe node {} | grep Allocated -A 5 | grep -ve Event -ve Allocated -ve percent -ve -- ; echo'

本文作者也推荐使用CoScale我还没有使用它,但如果其他解决方案失败,似乎值得一试。

我认为另一点是,如果您的开发人员继续分配比所需资源更多的资源,您可能永远无法控制。 Nicola Ben推荐的解决方案可以帮助您缓解这样的问题。


1
投票

如果可以,我建议您使用LimitRangeResourceQuota资源,例如:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: happy-developer-quota
spec:
  hard:
    requests.cpu: 400m
    requests.memory: 200Mi
    limits.cpu: 600m
    limits.memory: 500Mi

对于LimitRange:

 apiVersion: v1
 kind: LimitRange
 metadata:
   name: happy-developer-limit
 spec:
   limits:
   - default:
       cpu: 600m
       memory: 100Mib
     defaultRequest
       cpu: 100m
       memory: 200Mib
     max:
       cpu: 1000m
       memory: 500Mib
     type: Container

这可以防止人们在默认命名空间内创建超小容器或超大容器。

© www.soinside.com 2019 - 2024. All rights reserved.