代码之家  ›  专栏  ›  技术社区  ›  kentor

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

  •  3
  • kentor  · 技术社区  · 6 年前

    用例/问题

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

    • 节点名称和;CPU/RAM容量
      • pod的资源请求;限制
      • pod的当前cpu&ram使用

    案例A:

    resources:
      requests:
        cpu: 100m
        ram: 500Mi
      limits:
        cpu: 6
        ram: 20Gi
    

    案例B: 同一节点上设置了不准确资源限制的服务太多(例如。g。500Mi,但服务经常使用1.5Gi内存)。这种情况发生在我们身上,因为Java开发人员没有注意到Java垃圾收集器只有在使用了75%的可用RAM之后才会开始清理。

    我怎样才能正确地监控这一点,从而识别配置错误的微服务,以防止这种逐出问题?在一个较小的规模,我可以简单地运行 kubectl describe nodes kubectl top pods 手动计算,但在这种规模下,这已经不起作用了。

    注: 我找不到这个问题的任何现有解决方案(包括使用kube metrics和similiar的prometheus+grafana板)。我认为这是可能的,但在格拉法纳想象这些东西真的很难。

    3 回复  |  直到 6 年前
        1
  •  4
  •   aurelius    6 年前

    github issue 社区要求开发人员创建一个新命令,显示pod/container的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 会帮助你缓解类似的问题。

        2
  •  4
  •   kentor    6 年前

    为此,我写了一个自己的普罗米修斯出口商。虽然node exporter提供了使用统计信息,kube state metrics公开了关于kubernetes资源对象的度量,但是要组合和聚合这些度量,以便它们提供有价值的信息来解决所描述的用例并不容易。

    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
  •  1
  •   Nicola Ben    6 年前

    LimitRange ResourceQuota 资源,例如:

    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
    

    推荐文章