Автоматическое масштабирование горизонтального модуля Google Cloud GKE на основе метрик Kubernetes

введите описание изображения здесь

Я хочу использовать стандартную метрику кубернетов для подсчета полученных байтов на HPA. Использование следующего yaml для достижения этой цели, но получение таких ошибок, как невозможность получения метрик из API пользовательских метрик: не зарегистрирован API пользовательских метрик (custom.metrics.k8s.io)

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: xxxx-hoa
  namespace: xxxxx
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: xxxx-xxx
  minReplicas: 2
  maxReplicas: 6
  metrics:
  - type: Pods
    pods:
      metricName: received_bytes_count
      targetAverageValue: 20k

Если бы у кого-то был опыт использования таких же показателей, это было бы очень полезно.

введите описание изображения здесь


comment
Прежде чем вы сможете использовать пользовательские метрики, вы должны включить мониторинг в своем проекте Google Cloud и установить адаптер Stackdriver. Вы также можете использовать стороннее программное обеспечение, такое как Prometheus. Также вам нужно помнить, что Custom metrics must be exported from your application in a specific format. Не могли бы вы указать, какие шаги вы уже сделали?   -  person PjoterS    schedule 09.11.2020
comment
Я мог просматривать метрики в метрике Explorer, добавил снимок экрана. Я хочу создать HPA для тех же стандартных метрик, которые существуют в метрике. См. Прикрепленный снимок экрана   -  person sankar    schedule 09.11.2020
comment
Вы пробовали решение из моего ответа?   -  person PjoterS    schedule 25.11.2020


Ответы (2)


Решение

Чтобы он заработал, вам необходимо развернуть адаптер пользовательских метрик Stackdriver < / а>. Ниже приведены команды для его развертывания.

$ kubectl create clusterrolebinding cluster-admin-binding \
    --clusterrole cluster-admin --user "$(gcloud config get-value account)"

$ kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml

Позже вам нужно будет использовать правильный Custom Metric, в вашем случае это должно быть kubernetes.io|pod|network|received_bytes_count

Описание

В пользовательских и внешних показателях для автомасштабирования рабочих нагрузок документации, у вас есть информация, которую необходимо развернуть StackDriver Adapter, прежде чем вы сможете получить настраиваемые метрики.

Прежде чем вы сможете использовать пользовательские метрики, вы должны включить мониторинг в своем проекте Google Cloud и установить адаптер Stackdriver в своем кластере.

Следующим шагом является развертывание вашего приложения (я использовал развертывание Nginx для целей тестирования) и создание надлежащего HPA.

В вашем примере HPA у вас есть несколько проблем

apiVersion: autoscaling/v2beta1 ## you can also use autoscaling/v2beta2 if you need more features, however for this scenario is ok
kind: HorizontalPodAutoscaler
metadata:
  name: xxxx-hoa
  namespace: xxxxx # HPA have namespace specified, deployment doesnt have
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1 # apiVersion: apps/v1beta1 is quite old. In Kubernetes 1.16+ it was changed to apps/v1
    kind: Deployment
    name: xxxx-xxx
  minReplicas: 2
  maxReplicas: 6
  metrics:
  - type: Pods
    pods:
      metricName: received_bytes_count # this metrics should be replaced with kubernetes.io|pod|network|received_bytes_count
      targetAverageValue: 20k

В GKE вы можете выбирать между autoscaling/v2beta1 и autoscaling/v2beta2. Ваш случай будет работать с обоими apiVersions, однако, если вы решите использовать autoscaling/v2beta2, вам нужно будет изменить синтаксис манифеста.

Почему kubernetes.io/pod/network/received_bytes_count? Вы ссылаетесь на показатели Kubernetes, и /pod/network/received_bytes_count представлен в этой документации.

Почему | вместо /? Если вы проверите документацию по Stackdriver на Github вы найдете информацию.

Метрики Stackdriver имеют форму путей, разделенных символом /, но API пользовательских метрик запрещает использование символа /. При использовании пользовательских метрик - адаптер Stackdriver либо напрямую через API пользовательских метрик, либо путем указания пользовательской метрики в HPA, замените / символ на |. Например, чтобы использовать custom.googleapis.com/my/custom/metric, укажите custom.googleapis.com | my | custom | metric.

Правильная конфигурация

для v2beta1

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: xxxx-hoa
spec:
  scaleTargetRef:
    apiVersion: apps/v1 # In your case should be apps/v1beta1 but my deployment was created with apps/v1 apiVersion
    kind: Deployment
    name: nginx
  minReplicas: 2
  maxReplicas: 6
  metrics:
  - type: Pods
    pods:
      metricName: "kubernetes.io|pod|network|received_bytes_count"
      targetAverageValue: 20k

для v2beta2

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: xxxx-hoa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 2
  maxReplicas: 6
  metrics:
  - type: Pods
    pods:
      metric:
        name: "kubernetes.io|pod|network|received_bytes_count"
      target:
        type: AverageValue
        averageValue: 20k

Результаты тестов

Conditions:
  Type            Status  Reason            Message
  ----            ------  ------            -------
  AbleToScale     True    SucceededRescale  the HPA controller was able to update the target scale to 2
  ScalingActive   True    ValidMetricFound  the HPA was able to successfully calculate a replica count from pods metric kubernetes.io|pod|network|received_bytes_count
  ScalingLimited  True    TooFewReplicas    the desired replica count is more than the maximum replica count
Events:
  Type    Reason             Age                 From                       Message
  ----    ------             ----                ----                       -------
  Normal  SuccessfulRescale  8m18s               horizontal-pod-autoscaler  New size: 4; reason: pods metric kubernetes.io|pod|network|received_bytes_count above target
  Normal  SuccessfulRescale  8m9s                horizontal-pod-autoscaler  New size: 6; reason: pods metric kubernetes.io|pod|network|received_bytes_count above target
  Normal  SuccessfulRescale  17s                 horizontal-pod-autoscaler  New size: 5; reason: All metrics below target
  Normal  SuccessfulRescale  9s (x2 over 8m55s)  horizontal-pod-autoscaler  New size: 2; reason: All metrics below target

Возможные проблемы с вашей текущей конфигурацией

В HPA вы указали пространство имен, но не в целевом развертывании. И HPA, и развертывание должны иметь одно и то же пространство имен. При такой конфигурации несоответствия вы можете столкнуться с проблемой ниже:

Conditions:
  Type         Status  Reason          Message
  ----         ------  ------          -------
  AbleToScale  False   FailedGetScale  the HPA controller was unable to get the target's current scale: deployments/scale.apps "nginx" not found
Events:
  Type     Reason          Age                  From                       Message
  ----     ------          ----                 ----                       -------
  Warning  FailedGetScale  94s (x264 over 76m)  horizontal-pod-autoscaler  deployments/scale.apps "nginx" not found

В Kubernetes 1.16+ при развертывании используется apiVersion: apps/v1, вы не сможете создать развертывание с apiVersion: apps/v1beta1 в Kubernets 1.16+.

person PjoterS    schedule 18.11.2020
comment
Прекрасный ответ. Спасибо за помощь, извините за задержку с ответом только что вернувшись из отпуска - person sankar; 01.12.2020

autoscaling / v1 - это API для автомасштабирования только в зависимости от загрузки ЦП. Итак, для автомасштабирования на основе других показателей вы должны использовать autoscaling / v2beta2. Я рекомендую вам прочитать этот документ, чтобы проверить версии API.

person Milad Tabrizi    schedule 07.11.2020