【问题标题】:Kubernetes HPA wrong metrics?Kubernetes HPA 指标错误?
【发布时间】:2020-07-03 18:39:24
【问题描述】:

我在 Google Cloud 上创建了一个 GKE 测试集群。它有 3 个节点和 2 个 vCPU / 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%?正因为如此,它也使用了空闲的最大副本数。有什么想法吗?

【问题讨论】:

  • 查看已编辑答案中有关 Horizo​​ntalPodAutoscaler 过时版本的说明。

标签: kubernetes google-kubernetes-engine hpa


【解决方案1】:

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

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

要正确设置 HPA,您需要为 Pod 指定 CPU 请求。比如:

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

或者您的 Pod 需要的任何值。如果您将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 使用机制仍然适用。

【讨论】:

    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 2023-03-29
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 2020-07-22
    相关资源
    最近更新 更多