Развертывание Kubernetes не уменьшается даже при использовании ниже порогового значения
Мне сложно понять, что происходит с моим горизонтальным автоматическим масштабированием модуля.
Я пытаюсь увеличить масштаб развертывания, если использование памяти или процессора превышает 80%.
Вот мой шаблон HPA:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
Дело в том, что он сидел на 3 репликах в течение нескольких дней, хотя загрузка ниже 80%, и я не понимаю, почему.
$ kubectl get hpa --all-namespaces
NAMESPACE NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
my-ns my-hpa Deployment/my-deployment 61%/80%, 14%/80% 2 10 3 2d15h
Вот вывод команды top:
$ kubectl top pods
NAME CPU(cores) MEMORY(bytes)
my-deployment-86874588cc-chvxq 3m 146Mi
my-deployment-86874588cc-gkbg9 5m 149Mi
my-deployment-86874588cc-nwpll 7m 149Mi
Каждый модуль потребляет примерно 60% запрошенной памяти (таким образом, они ниже целевого показателя 80%):
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "200m"
Вот мое развертывание:
kind: Deployment
apiVersion: apps/v1
metadata:
name: my-deployment
labels:
app: my-app
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: ...
imagePullPolicy: Always
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "200m"
livenessProbe:
httpGet:
path: /liveness
port: 3000
initialDelaySeconds: 10
periodSeconds: 3
timeoutSeconds: 3
readinessProbe:
httpGet:
path: /readiness
port: 3000
initialDelaySeconds: 10
periodSeconds: 3
timeoutSeconds: 3
ports:
- containerPort: 3000
protocol: TCP
Я вручную уменьшаю масштаб до 2-х реплик, и он сразу же возвращается к 3 без причины:
Normal SuccessfulRescale 28s (x4 over 66m) horizontal-pod-autoscaler New size: 3; reason:
Кто-нибудь знает, что происходит?
2 ответа
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
Согласно вашим текущим числам, он никогда не будет уменьшаться, если использование памяти не упадет до половины желаемого процента.
т.е. текущее использование как процессора, так и памяти должно достигать 40%(в вашем случае) или ниже
согласно формуле ниже
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
= ceil[3 * (61/80)]
= ceil[3 * (0.7625)]
= ceil[2.2875]
desiredReplicas = 3
у вас могут быть сомнения, что ваш процессор ниже 40%, почему он не выполняет масштабирование.. но HPA не будет работать таким образом.. он всегда будет искать большее число.
У меня была такая же проблема, потому что, как и вы, я использовал 2 показателя ЦП и память. Ресурс памяти никогда не освобождается приложением так быстро, как это делает ЦП. Как только я удалил ресурс памяти, модули уменьшились, когда использование было меньше.