Использование нескольких механизмов автомасштабирования для автомасштабирования кластера 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 и автоматическое масштабирование кластера, и некоторые из них могут не совпадать в определенное время.

На мой взгляд, лучше всего замедлить автомасштабирование всего, чтобы позволить автоматическому масштабированию устранить любые несоответствия. Например, вы можете использовать такие вещи, как кулдаун в группе автомасштабирования, чтобы избежать нехватки ресурсов.

✌️

Другие вопросы по тегам