Использование нескольких механизмов автомасштабирования для автомасштабирования кластера K8s

Aug 20 2020

В недавнем эксперименте я попытался автомасштабировать свой кластер 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 }}

Ответы

3 Rico Aug 20 2020 at 06:26

KEDA не имеет поддержки autoscaler прямого кластера еще так что вы будете иметь некоторую непредсказуемость. По сути, у вас есть две части информации, которые не используются совместно: KEDA и автоматическое масштабирование кластера, и некоторые из них могут не совпадать в определенное время.

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

✌️