繁体   English   中英

监控 Kube.netes 节点上的 pod 资源使用情况

[英]Monitoring pod resource usage on Kubernetes nodes

用例/问题

我负责维护一个包含 40 个节点(分为 2 个区域)的 kube.netes 集群。 我们在这个集群中运行了大约 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 nodeskubectl top pods来手动解决这个问题,但在这个规模下它不再起作用了。

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

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

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

用于Kubernetes资源监控的Grafana仪表板

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

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

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

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

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推荐的解决方案可以帮助您缓解这样的问题。

如果可以,我建议您使用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

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

以下 PromQL 查询可能有助于监控每个节点的资源使用情况:

requests.memory相比过度使用的容器 memory

max_over_time(container_memory_usage_bytes{container!=""}[1h])
  > on(namespace,pod,container) group_left()
kube_pod_container_resource_requests{resource="memory"}

此类容器的操作点:将其requests.memory增加到实际 memory 的使用。 这应该会降低 pod 重新调度事件的概率和 OOM 事件的概率。

requests.cpu相比,CPU 过度使用的容器

rate(container_cpu_usage_seconds_total{container!=""}[5m])
  > on(namespace,pod,container) group_left()
kube_pod_container_resource_requests{resource="cpu"}

此类容器的操作点:将其requests.cpu增加到实际 CPU 使用率。 这应该会降低 pod 重新调度事件的概率和 CPU 饥饿的概率。

利用率超过 50% 的容器 memory

max_over_time(container_memory_usage_bytes{container!=""}[1h])
  < on(namespace,pod,container) group_left()
(kube_pod_container_resource_requests{resource="memory"} * 0.5)

此类容器的行动点:将其resquests.memory减少到实际 memory 的使用。 这应该为具有更高 memory 要求的 pod 释放可分配的 memory。

CPU 使用率超过 50% 的容器

rate(container_cpu_usage_seconds_total{container!=""}[5m])
  < on(namespace,pod,container) group_left()
(kube_pod_container_resource_requests{resource="cpu"} * 0.5)

此类容器的行动点:将其requests.cpu减少到实际 CPU 使用率。 这应该为具有更高 CPU 要求的 Pod 释放可分配的 CPU。

利用率超过 50% 的节点 memory

sum(max_over_time(container_memory_usage_bytes{container!=""}[1h])) by (node)
  < on(node)
(kube_node_status_capacity{resource="memory"} * 0.5)

此类节点的操作点:减少这些节点上的可用 memory 或从 Kube.netes 集群中删除此类节点,以增加其余节点上的 memory 利用率。 这将节省 Kube.netes 集群的成本。

CPU 使用率超过 50% 的节点

sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) by (node)
  < on (node)
(kube_node_status_capacity{resource="cpu"} * 0.5)

此类节点的操作要点:减少这些节点上的可用 CPU 内核,或从 Kube.netes 集群中删除此类节点,以提高其余节点上的 CPU 利用率。 这将节省 Kube.netes 集群的成本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM