Kubernetes HPA 指标错误?

Kubernetes HPA wrong metrics?

我已经在 Google Cloud 上创建了一个 GKE 测试集群。它有 3 个节点和 2 vCPUs / 8 GB RAM。我已经在上面部署了两个 java 应用程序

这是 yaml 文件:

apiVersion: apps/v1            
kind: Deployment
metadata:                    
  name: myapi           
spec:
  selector:                                                                          
    matchLabels:
      app: myapi
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: myapi
    spec:
      containers:
      - image: eu.gcr.io/myproject/my-api:latest
        name: myapi
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: myapi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myfrontend
spec:
  selector:
    matchLabels:
      app: myfrontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: myfrontend
    spec:
      containers:
      - image: eu.gcr.io/myproject/my-frontend:latest
        name: myfrontend
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: myfrontend
---

然后我想添加一个具有以下详细信息的 HPA:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: myfrontend
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myfrontend
  minReplicas: 2
  maxReplicas: 5
  targetCPUUtilizationPercentage: 50
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: myapi
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapi
  minReplicas: 2
  maxReplicas: 4
  targetCPUUtilizationPercentage: 80
---

如果我检查 kubectl top pods 它会显示一些非常奇怪的指标:

NAME                         CPU(cores)   MEMORY(bytes)   
myapi-6fcdb94fd9-m5sh7      194m         1074Mi          
myapi-6fcdb94fd9-sptbb      193m         1066Mi          
myapi-6fcdb94fd9-x6kmf      200m         1108Mi          
myapi-6fcdb94fd9-zzwmq      203m         1074Mi          
myfrontend-788d48f456-7hxvd   0m           111Mi           
myfrontend-788d48f456-hlfrn   0m           113Mi   

HPA 信息:

NAME        REFERENCE              TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
myapi      Deployment/myapi      196%/80%   2         4         4          32m
myfrontend   Deployment/myfrontend   0%/50%     2         5         2          32m

但是如果我检查其中一个节点的正常运行时间,它会显示一个较低的值:

[myapi@myapi-6fcdb94fd9-sptbb /opt/]$ uptime
 09:49:58 up 47 min,  0 users,  load average: 0.48, 0.64, 1.23

知道为什么它显示完全不同的东西。为什么 hpa 显示当前 CPU 利用率的 200%?正因为如此,它在空闲时也使用了最大的副本。有什么想法吗?

HPA 的 targetCPUUtilizationPercentage 是目标容器 CPU requests 的百分比 Pods。如果您未在 Pod 规范中指定任何 CPU 请求,则 HPA 无法进行计算。

在您的情况下,HPA 似乎假定 100m 作为 CPU 请求(或者您可能有一个 LimitRange 将默认 CPU 请求设置为 100m ).您 Pods 的当前使用量约为 200m,这就是 HPA 显示利用率约为 200% 的原因。

要正确设置 HPA,您需要为 Pods 指定 CPU 请求。类似于:

      containers:
      - image: eu.gcr.io/myproject/my-api:latest
        name: myapi
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: myapi
        resources:
          requests:
            cpu: 500m

或您的 Pods 需要的任何值。如果将 targetCPUUtilizationPercentage 设置为 80,则 HPA 将在 400m 使用时触发升级操作,因为 500m 的 80% 是 400m.


除此之外,您使用的是过时版本的 Horizo​​ntalPodAutoscaler:

对于 v2beta2 版本,规范看起来有点不同。类似于:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: myapi
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapi
  minReplicas: 2
  maxReplicas: 4
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80

参见 examples

但是,上述 CPU 使用机制仍然适用。