Приложения, работающие на 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, поэтому администраторы кластера должны проявлять осторожность при ее представлении.
Это пример 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"