Kubernetes HPA неправильные метрики?

Я создал тестовый кластер GKE в Google Cloud. Он имеет 3 узла с 2 виртуальными ЦП / 8 ГБ ОЗУ. Я развернул на нем два 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, он показывает действительно странные показатели:

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 показывает 200% текущей загрузки ЦП? И из-за этого он также использует максимальное количество реплик в режиме ожидания. Есть идеи?

1 ответ

Решение

В targetCPUUtilizationPercentageHPA - это процент запросов ЦП контейнеров целевых модулей. Если вы не укажете какие-либо запросы ЦП в своих спецификациях Pod, HPA не сможет выполнять свои вычисления.

В вашем случае кажется, что HPA предполагает 100m как запросы ЦП (или, возможно, у вас есть LimitRange, который устанавливает запрос ЦП по умолчанию на 100m). Текущее использование ваших модулей примерно200m и поэтому HPA показывает коэффициент использования около 200%.

Чтобы правильно настроить HPA, вам необходимо указать запросы ЦП для ваших модулей. Что-то типа:

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

Или любое другое значение, которое требуется вашим стручкам. Если вы установитеtargetCPUUtilizationPercentage до 80, HPA запустит операцию масштабирования при 400m использование, потому что 80% 500m является 400m.


Кроме того, вы используете устаревшую версию HorizontalPodAutoscaler:

  • Ваша версия: v1
  • Новейшая версия: v2beta2

В версии 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

См. Примеры.

Однако описанный выше механизм использования ЦП все еще применяется.

Другие вопросы по тегам