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

Kubernetes Horizontal Pod Autoscaler如何计算多容器Pod的CPU利用率?

赵开诚
2023-03-14


问题1.)
给定多容器pod的场景,其中所有容器都有一个定义的CPU请求
库伯内特斯水平pod自动缩放器将如何计算多容器pod的CPU利用率?它会平均它们吗?(((500mcpu req50mcpu req) /2)*X%HPA目标cpu利用率
它会添加它们吗?((500mcpu req50mcpu req)*X%HPA目标cpu利用率
它会单独跟踪它们吗?(500mcpu req*X%HPA目标cpu利用率=目标#1,50mcpu req*X%HPA目标cpu利用率=目标#2。)

问题2。)
给定多容器pod的场景,其中1个容器有一个定义的CPU请求和其他容器的空白CPU请求:
库伯内特斯水平pod自动缩放器如何计算多容器pod的CPU利用率?
它的工作原理是否就像您只有一个容器pod一样?

问题3。)< br >问题1和问题2的答案是否会因HPA API版本而异?< br >我注意到stable/nginx-ingress头盔图版本1.10.2为我部署了一个HPA,规格如下:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler

(我注意到apiVersion: autoscaling/v2beta2现在已经存在)

背景信息:
我最近遇到了一个问题,在将sidecar(第二个容器)html" target="_blank">添加到nginx入口控制器部署(通常是带有单个容器的pod)后,意外的疯狂扩展/在min和max pod之间不断来回。在我的例子中,它是一个oAuth2代理,尽管我想istio sidecar容器的人可能也会一直遇到这种问题。

apiVersion: apps/v1
kind: Deployment
spec:
  replicas: 3
  template:
    spec:
      containers:
        - name: nginx-ingress-controller #(primary-container)
          resources:
            requests:
              cpu: 500m    #baseline light load usage in my env 
              memory: 2Gi  #according to kubectl top pods
            limits:
              memory: 8Gi  #(oom kill pod if this high, because somethings wrong)
        - name: oauth2-proxy #(newly-added-2nd-sidecar-container)
          resources: 
            requests:
              cpu: 50m
              memory: 50Mi
            limits:
              memory: 4Gi

我的HPA(apiVersion:autoscaling/v1)具有:

    < li >最少3个副本(以在滚动更新期间保留高可用性) < Li > targetcpuuutilizationpercentage = 150%

我突然想到,我的错误配置导致意外的疯狂缩放是由两个问题引起的:

  1. 我实际上不明白当 pod 有多个容器时 HPA 是如何工作的
  2. 我不知道如何深入挖掘以获得正在发生的事情的指标。

解决第一个问题:我集思广益地了解了它在单容器场景中的工作原理(然后意识到我不知道多容器场景,所以我决定问这个问题)

这是我对当我有一个容器(暂时忽略上述部署规范中的第二个容器)时HPA(autoscaling/v1)如何工作的理解:
当所有吊舱的CPU平均利用率从我正常预期的500米或以下负载转移到750米(150%x 500米请求)时,HPA将生成更多副本

为了解决第二个问题:我发现了如何挖掘以查看基于数值的具体指标与基于相对百分比的指标,以帮助弄清楚幕后发生了什么:

bash# kubectl describe horizontalpodautoscaler nginx-ingress-controller -n=ingress | grep Metrics: -A 1
Metrics:                                               ( current / target )
  resource cpu on pods  (as a percentage of request):  5% (56m) / 100%

(注意:kubectl top pods -n=ingress显示5个副本的cpu使用率分别为36m、34m、88m、36m、91m,因此57m电流与56m电流相匹配)

现在,这也是一个基本的比例数学问题,允许求解目标静态值:< br> (5% / 56m) = (100% / x m) -

共有2个答案

长孙哲
2023-03-14

对于问题 2,如果我们查看源代码,我们可以看到它单独查找所有容器,如果容器没有请求,则返回。

func calculatePodRequests(pods []*v1.Pod, resource v1.ResourceName) (map[string]int64, error) {
   requests := make(map[string]int64, len(pods))
   for _, pod := range pods {
      podSum := int64(0)
      for _, container := range pod.Spec.Containers {
         if containerRequest, ok := container.Resources.Requests[resource]; ok {
            podSum += containerRequest.MilliValue()
         } else {
            return nil, fmt.Errorf("missing request for %s", resource)
         }
      }
      requests[pod.Name] = podSum
   }
   return requests, nil
}

佟高澹
2023-03-14

基于stackoverflow社区成员在其他情况下的回答

“HPA将pod cpu利用率计算为pod中所有容器的总cpu使用量除以总请求。我认为文档中没有指定任何地方,但相关代码在这里”

你有更多的信息,在上面的链接中有例子。

根据留档

水平Pod自动缩放器根据观察到的CPU利用率(或者,在beta支持下,在一些其他应用程序提供的指标上)自动缩放复制控制器、部署或副本集中的Pod数量。

所以基本上:

基于cpu的apiVersion自动缩放/v1 HPA。

api版本自动缩放/ v2beta2基于CPU,内存,自定义指标。

更多信息请点击这里

 类似资料:
  • 我想计算 Kubernetes 中单个 Pod 的资源利用率的 CPU 和内存百分比。为此,我使用的是指标服务器API 从metrics服务器,我可以通过以下命令获得利用率 kubectl top pods --all-namespaces 但我想要单个pod的利用率百分比CPU%和MEM%。 从top命令的输出中,不清楚它消耗了多少CPU和内存? 我不想用普罗米修斯算符我看到了一个公式 我可以用

  • 问题内容: 关于如何使用/ proc / stat中的统计信息获取CPU利用率的文章和参考文献很多。但是,它们中的大多数仅使用7个以上的CPU统计信息中的四个(用户,nice,系统和空闲),而忽略了Linux2.6中存在的剩余jiffie CPU计数(iowait,irq,softirq)。 我的问题是:iowait / irq / softirq编号是否也计入前四个编号之一(用户/ nice /

  • 我的目标是创建一个程序,向用户询问金额,询问每年、每月或每天的利率,询问如何复合,然后询问月、日或年的期限。 然后它会打印未来的价值以及获得的总利息。这是我到目前为止所拥有的,数字是不正确的。如果有人能帮助修改它并使其工作,我会非常感激。

  • 如何获取库伯内特斯集群中 CPU 使用率最高的前三个容器? 上面的命令为所有名称空间中的所有pod提供了CPU和内存利用率。如何将其限制在CPU利用率最高的前三个机架上? 此外,我尝试按CPU排序,但似乎排序不起作用。 输出:

  • 我正在我的a集群(10个节点)中运行几个kubernetes pod。每个pod只包含一个托管一个工作进程的容器。我已指定容器的CPU“限制”和“请求”。以下是在节点(crypt12)上运行的一个pod的描述。 以下是我运行“kubectl可描述节点crypt12”时的输出 更新:我在github问题讨论中找到了问题的答案:“kubectl描述节点”中的cpu百分比是“cpu限制/#个内核”。由于

  • 我有这个收入计算器功能 它以一个“投资价值”为基础,根据一个给定的利率,计算收益,在这种情况下,收益限制为5年,有一个for循环。我需要的是每隔1年计算,每隔5年通过计算。 因此,投资价值为1000英镑,利率为10%,它将在5年内获得以下产出 我想要的就是这个