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 ответ
В 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:
В версии 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
См. Примеры.
Однако описанный выше механизм использования ЦП все еще применяется.