Kubernetes HPA не может обнаружить успешно опубликованную пользовательскую метрику из Stackdriver

Я пытаюсь масштабировать Kubernetes Deployment с помощью HorizontalPodAutoscaler, который прослушивает пользовательские метрики через Stackdriver.

У меня есть кластер GKE с включенным адаптером Stackdriver. Я могу опубликовать пользовательский тип метрики в Stackdriver, и ниже показано, как он отображается в обозревателе метрик Stackdriver.

Kubernetes HPA не может обнаружить успешно опубликованную пользовательскую метрику из Stackdriver

Kubernetes HPA не может обнаружить успешно опубликованную пользовательскую метрику из Stackdriver

Вот как я определил свой HPA:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: example-hpa
spec:
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: External
    external:
      metricName: custom.googleapis.com|worker_pod_metrics|baz
      targetValue: 400
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-app-group-1-1

После успешного создания example-hpa выполнение kubectl get hpa example-hpa всегда показывает TARGETS как <unknown> и никогда не определяет значение из пользовательских метрик.

NAME          REFERENCE                       TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
example-hpa   Deployment/test-app-group-1-1   <unknown>/400   1         10        1          18m

Я использую клиент Java, который запускает локально для публикации моих пользовательских показателей. Я дал соответствующие метки ресурсов, как уже упоминалось, здесь (жестко запрограммированные, чтобы они могли без проблем работать в локальной среде). Я следовал этот документ для создания клиента Java.

private static MonitoredResource prepareMonitoredResourceDescriptor() {
        Map<String, String> resourceLabels = new HashMap<>();
        resourceLabels.put("project_id", "<<<my-project-id>>>);
        resourceLabels.put("pod_id", "<my pod UID>");
        resourceLabels.put("container_name", "");
        resourceLabels.put("zone", "asia-southeast1-b");
        resourceLabels.put("cluster_name", "my-cluster");
        resourceLabels.put("namespace_id", "mynamespace");
        resourceLabels.put("instance_id", "");

        return MonitoredResource.newBuilder()
                .setType("gke_container")
                .putAllLabels(resourceLabels)
                .build();
    }

Что я делаю неправильно в вышеупомянутых шагах, пожалуйста? Заранее благодарим за любые предоставленные ответы!


РЕДАКТИРОВАТЬ [РЕШЕНО]: Я думаю, что у меня были некоторые неправильные настройки, так как kubectl describe hpa [NAME] --v=9 показал мне код статуса 403, а также я использовал type: External вместо type: Pods (спасибо МВЗ за ваш ответ, указывающий на эту ошибку).

Мне удалось исправить это, создав новый проект, новую учетную запись службы и новый кластер GKE (практически все с самого начала). Затем я изменил свой файл yaml следующим образом, как объясняет этот документ.

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: test-app-group-1-1
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: test-app-group-1-1
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Pods                 # Earlier this was type: External
    pods:                      # Earlier this was external:
      metricName: baz                               # metricName: custom.googleapis.com|worker_pod_metrics|baz
      targetAverageValue: 20

Теперь я экспортирую как custom.googleapis.com/baz, а НЕ как custom.googleapis.com/worker_pod_metrics/baz. Кроме того, теперь я явно указываю namespace для моего HPA в yaml.

По умолчанию HPA использует процессор от metric-server в kubernetes. K8s не знает, какие показатели вы используете. Вам нужно развернуть собственный адаптер/метрический сервер, например. Проверить ссылку docs.bitnami.com/kubernetes/how-to/…

Veerendra 08.04.2019 09:03

Я уже включил Адаптер стекдрайвера (я использую унаследованная модель ресурсов). Есть ли что-нибудь еще, что я ошибаюсь, пожалуйста

Senthuran Ambalavanar 08.04.2019 16:00
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
2
2
872
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Поскольку вы можете видеть свою пользовательскую метрику в графическом интерфейсе Stackdriver, я предполагаю, что метрики экспортируются правильно. Основываясь на Автоматическое масштабирование развертываний с помощью настраиваемых показателей, я считаю, что вы неправильно определили метрику, которая будет использоваться HPA для масштабирования развертывания.

Пожалуйста, попробуйте использовать этот YAML:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: example-hpa
spec:
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metricName: baz
      targetAverageValue: 400
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-app-group-1-1

Пожалуйста, имейте в виду, что:

The HPA uses the metrics to compute an average and compare it to the target average value. In the application-to-Stackdriver export example, a Deployment contains Pods that export metric. The following manifest file describes a HorizontalPodAutoscaler object that scales a Deployment based on the target average value for the metric.

Действия по устранению неполадок, описанные в страница выше, также могут быть полезны.

Примечание Поскольку указанный выше HPA использует бета-API autoscaling/v2beta1, у меня возникла ошибка при запуске kubectl describe hpa [DEPLOYMENT_NAME]. Я запустил kubectl describe hpa [DEPLOYMENT_NAME] --v=9 и получил ответ в формате JSON.

Я также пробовал этот подход type: Pods вместо type: External, но по какой-то причине это не сработало. Однако мне удалось заставить его работать, создав новый проект, новую учетную запись службы и новый кластер, а также используя type: Pods. Спасибо за Ваш ответ :) . Я думаю, что раньше в моих конфигурациях ролей могли быть ошибки.

Senthuran Ambalavanar 10.04.2019 09:24

Хорошей практикой является использование нескольких уникальных меток для таргетинга ваших показателей. Прямо сейчас, основываясь на метриках, помеченных в вашем Java-клиенте, только pod_id выглядит уникальным, который нельзя использовать из-за его природы без сохранения состояния.

Итак, я бы посоветовал вам попробовать ввести универсальный идентификатор развертывания/метрики.

resourceLabels.put("<identifier>", "<could-be-deployment-name>");

После этого вы можете попробовать изменить HPA примерно так:

kind: HorizontalPodAutoscaler
metadata:
  name: example-hpa
spec:
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: External
    external:
      metricName: custom.googleapis.com|worker_pod_metrics|baz
      metricSelector:
        matchLabels:
          # define labels to target
          metric.labels.identifier: <deployment-name>
      # scale +1 whenever it crosses multiples of mentioned value
      targetAverageValue: "400"
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-app-group-1-1

Кроме того, эта установка не имеет проблем и должна работать гладко.

Вспомогательная команда, чтобы увидеть, какие метрики доступны для HPA:

 kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/custom.googleapis.com|worker_pod_metrics|baz" | jq

Спасибо за это предложение!

Senthuran Ambalavanar 10.04.2019 10:13

Другие вопросы по теме