HPA Kubernetes не может обнаружить успешно опубликованную пользовательскую метрику от Stackdriver - PullRequest
2 голосов
/ 07 апреля 2019

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

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

enter image description here

enter image description here

Вот как я определил мой 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.

Ответы [ 2 ]

2 голосов
/ 08 апреля 2019

Так как вы можете увидеть свою пользовательскую метрику в графическом интерфейсе 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.

1 голос
/ 10 апреля 2019

Хорошей практикой является размещение некоторых уникальных меток для целевых показателей. В настоящее время, основываясь на показателях, помеченных в вашем 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
...