Почему Kubernetes HPA не уменьшает масштабирование (память)?
Резюме
в нашем Kubernetes-кластере мы ввели HPA с ограничениями памяти и процессора. Прямо сейчас мы не понимаем, почему у нас 2 реплики одного сервиса.
Рассматриваемая служба использует 57% / 85% памяти и имеет 2 реплики вместо одной. Мы думаем, что это потому, что когда вы суммируете память обоих модулей, она составляет более 85%, но этого не было бы, если бы был только один модуль. Так не мешает ли это уменьшению масштаба? Что мы можем здесь сделать?
Мы также наблюдаем пик использования памяти при развертывании службы. Мы используем сервисы весенней загрузки в aks (лазурном) и думаем, что они могут масштабироваться там, а не падать. Мы что-то упускаем или есть предложения?
Шлем
гпа:
{{- $fullName := include "app.fullname" . -}}
{{- $ := include "app.fullname" . -}}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: {{ $fullName }}-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ include "app.name" . }}
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 50
- type: Resource
resource:
name: memory
targetAverageUtilization: 85
и в развертывании:
# Horizontal-Pod-Auto-Scaler
resources:
requests:
memory: {{ $requestedMemory }}
cpu: {{ $requesteCpu }}
limits:
memory: {{ $limitMemory }}
cpu: {{ $limitCpu }}
с настройками службы по умолчанию:
hpa:
resources:
request:
memory: 500Mi
cpu: 300m
limits:
memory: 1000Mi
cpu: 999m
kubectl get hpa -n dev
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
xxxxxxxx-load-for-cluster-hpa Deployment/xxxxxxxx-load-for-cluster 34%/85%, 0%/50% 1 10 1 4d7h
xxx5-ccg-hpa Deployment/xxx5-ccg 58%/85%, 0%/50% 1 10 1 4d12h
iotbootstrapping-service-hpa Deployment/iotbootstrapping-service 54%/85%, 0%/50% 1 10 1 4d12h
mocks-hpa Deployment/mocks 41%/85%, 0%/50% 1 10 1 4d12h
user-pairing-service-hpa Deployment/user-pairing-service 41%/85%, 0%/50% 1 10 1 4d12h
aaa-registration-service-hpa Deployment/aaa-registration-service 57%/85%, 0%/50% 1 10 2 4d12h
webshop-purchase-service-hpa Deployment/webshop-purchase-service 41%/85%, 0%/50% 1 10 1 4d12h
kubectl описать hpa -n dev
Name: xxx-registration-service-hpa
Namespace: dev
Labels: app.kubernetes.io/managed-by=Helm
Annotations: meta.helm.sh/release-name: vwg-registration-service
meta.helm.sh/release-namespace: dev
CreationTimestamp: Thu, 18 Jun 2020 22:50:27 +0200
Reference: Deployment/xxx-registration-service
Metrics: ( current / target )
resource memory on pods (as a percentage of request): 57% (303589376) / 85%
resource cpu on pods (as a percentage of request): 0% (1m) / 50%
Min replicas: 1
Max replicas: 10
Deployment pods: 2 current / 2 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from memory resource utilization (percentage of request)
ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
Events: <none>
Если необходима дополнительная информация, пожалуйста, спрашивайте!
Большое спасибо, что нашли время!
Ура Робин
1 ответ
Формула для определения желаемого количества реплик:
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
Важной частью вашего вопроса является ceil[...]
обертка функции: всегда округляется до следующей ближайшей реплики. ЕслиcurrentReplicas
равно 2 и desiredMetricValue
составляет 85%, то currentMetricValue
должно быть 42,5% или ниже для запуска уменьшения масштаба.
В вашем примере currentMetricValue
составляет 57%, поэтому вы получаете
desiredReplicas = ceil[2 * (57 / 85)]
= ceil[2 * 0.671]
= ceil[1.341]
= 2
Вы правы, если currentReplicas
были бы 1, HPA также не чувствовал бы необходимости в расширении; фактическое использование должно подняться выше 85%, чтобы вызвать это.