当前位置: 首页 > 知识库问答 >
问题:

尽管在pod模板中指定了限制并请求资源,但只有一个pod正在消耗所有计算资源

瞿和硕
2023-03-14

我正在根据CPU和内存利用率扩展ML预测。我使用HPA进行pod级别的扩展,我们指定了CPU和内存指标。在创建部署时,我还指定了请求的计算资源和限制。(我粘贴了HPA配置和pod模板配置供参考)

我观察到,虽然我们指定了资源限制和请求,但当我检查每个pod消耗的内存和CPU时,它显示只有一个pod消耗了所有的CPU和内存资源,而其他pod消耗的计算资源非常少。根据我的理解,所有pod应该消耗大约等于资源,所以我们可以说它是缩放的,否则就像在单台机器上运行没有k8的代码一样。

注意:我使用python k8s客户端来创建部署和服务,而不是yaml。

我尝试过调整限制和资源参数,并观察到由于这是ML管道,内存和cpu消耗在某些点上呈指数级增长。

我的HPA配置:-

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  namespace: default
  name: #hpa_name
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: #deployment_name
  minReplicas: 1
  maxReplicas: 40
  metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 80
    - type: Resource
      resource:
        name: memory
        targetAverageValue: 5Gi

我的pod模板代码-

 container = client.V1Container(
        ports=[client.V1ContainerPort(container_port=8080)],
        env=[client.V1EnvVar(name="ABC", value=12345)],
        resources=client.V1ResourceRequirements(
            limits={"cpu": "2", "memory": "22Gi"},
            requests={"cpu": "1", "memory": "8Gi"},
        ),

kubectl top pods的输出

NAME                                                              CPU(cores)   MEMORY(bytes)   
deploy-24b32e5dc388456f8f2263be39ffb5f7-de19236511504877-77c6ds   1m           176Mi           
deploy-24b32e5dc388456f8f2263be39ffb5f7-de19236511504877-7d5n4l   1m           176Mi           
deploy-24b32e5dc388456f8f2263be39ffb5f7-de19236511504877-7dq6c9   14236m       16721Mi         
deploy-24b32e5dc388456f8f2263be39ffb5f7-de19236511504877-7f6nmh   1m           176Mi           
deploy-24b32e5dc388456f8f2263be39ffb5f7-de19236511504877-7fzdc4   1m           176Mi           
deploy-24b32e5dc388456f8f2263be39ffb5f7-de19236511504877-7gvqtj   1m           176Mi           
deploy-24b32e5dc388456f8f2263be39ffb5f7-de19236511504877-7h6ld7   1m           176Mi           
deploy-24b32e5dc388456f8f2263be39ffb5f7-de19236511504877-7j7gv4   1m           176Mi           
deploy-24b32e5dc388456f8f2263be39ffb5f7-de19236511504877-7kxlvh   1m           176Mi           
deploy-24b32e5dc388456f8f2263be39ffb5f7-de19236511504877-7nnn8x   1m           176Mi           
deploy-24b32e5dc388456f8f2263be39ffb5f7-de19236511504877-7pmtnj   1m           176Mi           
deploy-24b32e5dc388456f8f2263be39ffb5f7-de19236511504877-7qflkh   1m           176Mi           
deploy-24b32e5dc388456f8f2263be39ffb5f7-de19236511504877-7s26cj   1m           176Mi           
deploy-24b32e5dc388456f8f2263be39ffb5f7-de19236511504877-7st5lt   1m           176Mi           

通过以上输出,很明显,第三个pod利用了大部分资源,而其他pod则处于恒定的内存和CPU消耗,这非常少。

我的期望是每个pod应该消耗大约等于基于pod模板请求中指定的限制和资源的资源。在这种情况下,CPU消耗应该在1个CPU到2个CPU之间,内存应该在8 Gi到22 Gi之间/少于请求的资源,但不超过定义的限制。

提前感谢任何积分/帮助/提示。

共有1个答案

洪季萌
2023-03-14

根据此问题的RCA(根本原因分析),我们在处理我们的kubernetes集群中的工作负载时通过运行< code>ipvsadm -ln进行了验证,发现只有一个TCP连接是由有效负载建立的,这导致所有工作负载都集中在一个pod中,即使其他pod可用。

我们的应用程序基于遗传资源,而我国的准则第一标准使用HTTP/2。HTTP/2 具有创建单个长期 TCP 连接的功能,并且请求在同一 TCP 连接下进行多路复用,以最大程度地减少 TCP 连接管理开销。因此,有一个长期存在的TCP连接连接到单个Pod,并且由于内存和CPU的HPA峰值,它可以缩放Pod,但负载不会分布。因此,我们需要一些机制来分配负载,仅次于连接级负载平衡(这是 kubernetes 中的默认负载平衡)以请求级负载平衡。

幸运的是,我们找到了下面的解决方案,我们遵循了这一点,它对我们很有效。

https://kubernetes.io/blog/2018/11/07/grpc-load-balancing-on-kubernetes-without-tears/

 类似资料:
  • 我正在我的GTX 1060 6gb上使用Python中的Tensorflow 1.2训练LSTM。 在每个时代,我用这种方法保存模型: 一切正常,但在九个时代之后,当我试图用这种方法保存模型时,我得到了ResourceExhaustedError。 我在培训期间检查了我的资源,但没有耗尽任何资源。 我得到的错误如下: 2017-06-29 12:43:02.865845: W tenstorflo

  • 我为kubernetes api服务器上的POD创建了如下限制 如果我理解正确,如果pod在创建pod时超出了用户定义的资源限制,kubernetes会拒绝pod。所以,我尝试创建一个新的pod,它通过了资源限制,然后我尝试消耗资源达到最大限制资源,但它对pod没有任何影响。LimitsRange和ResourceQuota插件是否包含在本案例中?如果没有,我如何在创建资源吊舱后限制资源吊舱?

  • 假设我们有以下部署: 我们还创建了一个该对象根据CPU平均利用率自动增加/减少Pod的数量。我知道 HPA 会根据资源请求计算 Pod 的数量,但是如果我希望容器能够在水平扩展之前请求更多资源,该怎么办? 我有两个问题: 1) 当定义HPA时,K8是否使用资源限制? 2) 我是否可以告诉 HPA 根据资源限制而不是请求进行扩展?或者作为实现此类控件的一种手段,是否可以将值设置为大于 100%?

  • 当我试图用十个副本部署一个部署时,我得到了这个错误。 0/2个节点可用:1个内存不足,1个节点有pod无法容忍的污点。 我不明白为什么两个节点。是相同的节点,只是相同的问题。 我有很多内存(1GB)可用。 如何在不添加其他节点的情况下修复此错误。 我在部署yaml文件中提供了以下资源: 限制:cpu: 1000m内存:1000Mi请求:cpu: 100m内存:200Mi 服务器: > 主控形状:

  • 我目前在Azure中托管了几十个网站,最近开始在每个web应用的门户刀片中看到“内存资源耗尽”警告: 我在两个S3标准(大型)应用程序服务计划中托管我的网站,我在所有网站上都会收到警告,无论它们在哪个应用程序服务计划上。 有趣的是,当查看任一应用服务计划的内存使用率时,我总是低于40%,内存使用率实际上相当一致。我从未看到峰值或任何接近85%内存使用率的东西。 我的问题是,我是否误解了警告消息?是

  • 我正在Openshift环境中部署一个Spring boot Web应用程序。由于我们在同一个引导项目中使用JSP和CSS等Web组件,因此我们将应用程序部署为Openshift环境中的WAR文件。我还添加了tomcat-embed-jasper来解析这些Web组件并执行WAR文件。 但问题是,当我在Openshift环境中部署它时,应用程序消耗了超过1GB的资源。有什么方法可以减少应用程序的内存