Материал уровня middle.
Снова про экономию.
У нас есть AWS SQS.
В него прилетает миллион вебхуков с полезным и важным payload.
Бывают пики, бывают нет.
У нас есть AWS EKS и приложение в POD-e, который вычитывает SQS, процессит и всё ок.
Нам надо настроить масштабирование не за счёт CPU/memory usage, а за счёт количества сообщений.
В этом нам помогает KEDA. Опустим этапы установки/настройки/прав и авторизации.
У нас есть готовый манифест
scaledobject.---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
...
spec:
cooldownPeriod: 300
maxReplicaCount: 50
minReplicaCount: 2
pollingInterval: 30
scaleTargetRef:
name: application
triggers:
- authenticationRef:
name: keda-aws-credentials
metadata:
awsRegion: us-east-1
identityOwner: operator
queueLength: "500"
queueURL: https://sqs.us-east-1.amazonaws.com/123456789/sqsname
type: aws-sqs-queue
Всё работает, всё скейлится, всё ок.
В HPA некрасиво выглядят цифры, хочется видеть точное количество мессаджем. Добавляем
metricType---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
...
spec:
...
metricType: Value
И теперь в
kubectl get hpa blablabla видим точное количество мессаджей в TARGETS(а не системы счисления инопланетян).Этого нам мало, нужна точная подстройка.
Читаем дальше доку, у нас есть адвансед настройки.
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
...
spec:
advanced:
horizontalPodAutoscalerConfig:
behavior:
scaleDown:
policies:
- periodSeconds: 15
type: Pods
value: 1
stabilizationWindowSeconds: 300
scaleUp:
policies:
- periodSeconds: 15
type: Pods
value: 1
selectPolicy: Max
stabilizationWindowSeconds: 60
... (остальное так же)
Теперь у нас всё динамически скейлится, прописаны все триггеры, трешхолды.
Всё отлично и бизнес ликует(не вру, прям ликует, сильно помогло).
Однако меня, как рьяного и верного пса девопс церкви, напрягает, что в период высокой нагрузки всё упирается в максимум реплик. Да, можно поставить не 50, а 100, но я думаю, что настройка неверная.
Углубляемся дальше в доку(вру, я ничо не понял и просто спросил ребят-гуру-AWS-технологий в телеге) и вспоминаем про визибл/анвизибл настройки у sqs.
https://keda.sh/docs/2.14/scalers/aws-sqs/
https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html
Окончательно пилим манифест.
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
...
spec:
advanced:
...(тут тоже самое)
metadata:
...
scaleOnInFlight: "false" << - - вот это вот важное нам
...
Отлично. Теперь самая точная и потрясающая настройка.