Kubernetes HPA неправильные метрики? - PullRequest
0 голосов
/ 23 марта 2020

Я создал тестовый кластер 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 Ответ

1 голос
/ 23 марта 2020

targetCPUUtilizationPercentage HPA - это процент запросов ЦП контейнеров целевых модулей. Если вы не укажете какие-либо запросы ЦП в спецификациях вашего 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

См. примеры .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...