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

时间:2019-09-15 18:11:19

标签: api kubernetes containers autoscaling horizontal-scaling


问题1。)
给出了一个多容器Pod,其中所有容器都具有定义的CPU请求:
Kubernetes水平容器自动缩放器如何计算多容器容器的CPU利用率?
它平均吗? ((((500m cpu req + 50m cpu req)/ 2)* X%HPA目标cpu利用率
是否添加它们? ((500m cpu req + 50m cpu req)* X%HPA目标cpu利用率
它会单独跟踪吗? (500m cpu需求* X%HPA目标cpu利用率=目标#1,50m cpu需求* x%HPA目标cpu利用率=目标#2。)

问题2。)
考虑到多容器容器的情况,其中一个容器具有已定义的CPU请求,而其他容器具有空白的CPU请求:
Kubernetes Horizo​​ntal Pod Autoscaler如何计算多容器Pod的CPU利用率?

就像只有一个容器吊舱一样起作用吗?

问题3。)
问题1和2的答案是否会根据HPA API版本而改变?
我注意到图表版本为1.10.2的稳定/ nginx-ingress舵图为我部署了HPA规格:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler

(我注意到apiVersion:自动缩放/ v2beta2现在存在)

背景信息:
我最近遇到了一个意外的野性缩放问题/在将sidecar(2nd容器)添加到nginx入口控制器部署(通常是带有单个容器的容器)之后,在最小和最大容器之间不断地来回切换。在我的情况下,它是一个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

I have an HPA (apiVersion: autoscaling/v1) with: 
- min 3 replicas (to preserve HA during rolling updates)
- targetCPUUtilizationPercentage = 150%

我突然发现我的配置错误导致了意外的野性扩展,原因是两个原因:

  1. 我实际上不了解当吊舱有多个容器时HPA的工作原理
  2. 我不知道如何深入了解正在发生的事情。

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

这是我对当我有1个容器(暂时忽略上述部署规范中的第2个容器)时HPA(autoscaling / v1)的工作方式的理解:
当所有Pod的CPU利用率平均值从我的正常预期负载500m或更小变为750m(150%x 500m请求)时,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的电流匹配)

现在它也是一个基本比例数学问题,可以求解目标静态值:
(5%/ 56m)=(100%/ x m)-> x = 56 * 100/5 = 1120m目标cpu
(注意:此HPA与上面提到的部署没有关联,这就是为什么数量没有了。)

2 个答案:

答案 0 :(得分:1)

基于其他case的stackoverflow社区成员的答案

  

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

您已经获得了更多信息,上面的链接中有示例。


基于文档

Horizontal Pod Autoscaler根据观察到的CPU利用率(或具有beta支持,以及其他一些由应用程序提供的指标),自动缩放复制控制器,部署或副本集中的Pod数量。 )。

所以基本上:

apiVersion自动缩放/ v1 HPA基于 cpu

apiVersion自动缩放/ v2beta2基于 cpu,内存,自定义指标

更多信息here

答案 1 :(得分:0)

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

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
}