Горизонтальное автоматическое масштабирование без пользовательских метрик - PullRequest
0 голосов
/ 02 апреля 2020

Мы хотим масштабировать наши модули по горизонтали в зависимости от количества сообщений в нашей Kafka Topi c. Стандартное решение - опубликовать sh метрики в API пользовательских метрик Кубернетеса. Однако в соответствии с руководящими принципами компании нам не разрешается использовать API пользовательских метрик Kubernetes. Нам разрешено использовать только функции без прав администратора. Есть ли решение для этого с функциями kubernetes-nativ или нам нужно внедрить индивидуальное решение?

1 Ответ

1 голос
/ 02 апреля 2020

Я не совсем уверен, соответствует ли это вашим потребностям, но вы могли бы использовать Автоматическое масштабирование по показателям, не связанным с объектами Kubernetes .

Приложения, работающие на Kubernetes, могут нуждаться в автоматическое масштабирование, основанное на показателях, которые не имеют очевидной связи с каким-либо объектом в кластере Kubernetes, таких как показатели, описывающие размещенный сервис без прямой корреляции с пространствами имен Kubernetes. В Kubernetes 1.10 и более поздних версиях этот случай использования можно решить с помощью внешних показателей .

Использование внешних показателей требует знания вашей системы мониторинга; настройка аналогична той, которая требуется при использовании пользовательских метрик. Внешние показатели позволяют вам автоматически масштабировать кластер на основе любого показателя c, доступного в вашей системе мониторинга. Просто предоставьте блок metric с name и selector, как указано выше, и используйте тип External metri c вместо Object. Если несколько временных рядов совпадают с metricSelector, сумма их значений используется HorizontalPodAutoscaler. Внешние метрики поддерживают оба целевых типа Value и AverageValue, которые работают точно так же, как и при использовании типа Object.

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

- type: External
 external:
   metric:
     name: queue_messages_ready
     selector: "queue=worker_tasks"
   target:
     type: AverageValue
     averageValue: 30

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

Вы также можете взглянуть на zalando-инкубатор / kube-metrics -adapter и использовать сборщик Prometheus внешние метрики .

Это пример HPA, настроенный для получения метрик на основе запроса Prometheus. Запрос определяется в аннотации metric-config.external.prometheus-query.prometheus/processed-events-per-second, где processed-events-per-second - это имя запроса, которое будет связано с результатом запроса. Соответствующая метка query-name должна быть определена в matchLabels определения metri c. Это позволяет иметь несколько запросов к Prometheus, связанных с одним HPA.

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
 name: myapp-hpa
 annotations:
   # This annotation is optional.
   # If specified, then this prometheus server is used,
   # instead of the prometheus server specified as the CLI argument `--prometheus-server`.
   metric-config.external.prometheus-query.prometheus/prometheus-server: http://prometheus.my->namespace.svc
   # metric-config.<metricType>.<metricName>.<collectorName>/<configKey>
   # <configKey> == query-name
   metric-config.external.prometheus-query.prometheus/processed-events-per-second: |
     scalar(sum(rate(event-service_events_count{application="event-service",processed="true"}[1m])))
spec:
 scaleTargetRef:
   apiVersion: apps/v1
   kind: Deployment
   name: custom-metrics-consumer
 minReplicas: 1
 maxReplicas: 10
 metrics:
 - type: External
   external:
     metric:
       name: prometheus-query
       selector:
         matchLabels:
           query-name: processed-events-per-second
     target:
       type: AverageValue
       averageValue: "10"
...