0

我在 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%?正因为如此,它也使用了空闲的最大副本数。任何的想法?

4

1 回答 1

1

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

在您的情况下,HPA 似乎假定100m为 CPU 请求(或者您可能有一个 LimitRange 将默认 CPU 请求设置为100m)。您的 Pod 的当前使用率200m约为 200%,这就是 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,因为 80%500m400m


除此之外,您使用的是过时版本的 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

请参阅示例

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

于 2020-03-23T10:29:44.973 回答