Автоматическое масштабирование горизонтального модуля 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

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

2 ответа

Решение

Решение

Чтобы он заработал, вам необходимо развернуть Stackdriver Custom Metrics Adapter. Ниже приведены команды для его развертывания.

$ 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 в Кубернеце 1.16+

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