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

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

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

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

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

Вот как я определил свой 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 (спасибо MWZ за ваш ответ, указав на эту ошибку).

Мне удалось это исправить, создав новый проект, новую учетную запись службы и новый кластер 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.


person Senthuran Ambalavanar    schedule 07.04.2019    source источник
comment
По умолчанию HPA использует процессор из metric-server в кубернетах. K8s не знает, какие метрики вы используете. Вам нужно развернуть собственный адаптер / метрический сервер, например. Найдите ссылку docs.bitnami.com/kubernetes/how- в /   -  person Veerendra Kakumanu    schedule 08.04.2019
comment
Я уже включил адаптер Stackdriver (я использую устаревшую модель ресурсов). Есть еще что-нибудь, что я ошибаюсь, пожалуйста   -  person Senthuran Ambalavanar    schedule 08.04.2019


Ответы (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

Имейте в виду, что:

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

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

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

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

Рекомендуется ставить несколько уникальных ярлыков для таргетинга ваших показателей. В настоящий момент, исходя из показателей, отмеченных в вашем java-клиенте, только pod_id выглядит уникальным, что не может быть использовано из-за отсутствия состояния.

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

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
person daemonsl    schedule 10.04.2019
comment
Спасибо за это предложение! - person Senthuran Ambalavanar; 10.04.2019