Использование нескольких механизмов автомасштабирования для автомасштабирования кластера K8s
В недавнем эксперименте я попытался автомасштабировать свой кластер K8s, используя два механизма: KEDA и HPA (см. Ниже). Я хотел использовать метрики ресурсов HPA OOB для масштабирования моего кластера на основе использования ресурсов модуля (память и ЦП) и KEDA для автоматического масштабирования на основе пользовательских метрик.
Несмотря на то, что мое развертывание прошло успешно, и кластер был исправен и работоспособен. Когда сработало автомасштабирование, кластер вышел из строя! Поды постоянно предоставлялись, а затем отменялись, это состояние продолжалось даже после того, как я остановил трафик в кластере. Мне пришлось дождаться периода остывания, прежде чем он снова станет нормальным.
Официальной документации по этой теме я не нашел, поэтому спросил здесь.
Мои вопросы:
- Можно ли настроить автоматическое масштабирование кластера k8s с использованием нескольких механизмов?
- Если да, то что я сделал не так?
Это было на K8s версии 1.15.11 и KEDA 1.4.1
apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
name: {{ $fullName }}
labels:
deploymentName: {{ $fullName }}
{{- include "deployment.labels" . | nindent 4 }}
spec:
scaleTargetRef:
deploymentName: {{ $fullName }}
pollingInterval: {{ .Values.scaleobject.pollingInterval }}
cooldownPeriod: {{ .Values.scaleobject.cooldownPeriod }}
minReplicaCount: {{ .Values.scaleobject.minReplicaCount }}
maxReplicaCount: {{ .Values.scaleobject.maxReplicaCount }}
triggers:
- type: prometheus
metadata:
serverAddress: {{ tpl .Values.scaleobject.serverAddress . | quote }}
metricName: access_frequency
threshold: "{{ .Values.scaleobject.threshold }}"
query: {{ tpl .Values.scaleobject.query . | quote }}
---
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: resource-utilization-scaling
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ $fullName }}
minReplicas: {{ .Values.scaleobject.minReplicaCount }}
maxReplicas: {{ .Values.scaleobject.maxReplicaCount }}
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: {{ .Values.scaleobject.cpuUtilization }}
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: {{ .Values.scaleobject.memUtilization }}
1 ответ
KEDA не имеет поддержки autoscaler прямого кластера еще так что вы будете иметь некоторую непредсказуемость. По сути, у вас есть две части информации, которые не используются совместно: KEDA и автоматическое масштабирование кластера, и некоторые из них могут не совпадать в определенное время.
На мой взгляд, лучше всего замедлить автомасштабирование всего, чтобы позволить автоматическому масштабированию устранить любые несоответствия. Например, вы можете использовать такие вещи, как кулдаун в группе автомасштабирования, чтобы избежать нехватки ресурсов.
✌️