Я пытаюсь масштабировать Kubernetes Deployment
с помощью HorizontalPodAutoscaler
, который прослушивает пользовательские метрики через Stackdriver.
У меня есть кластер GKE с включенным адаптером Stackdriver. Я могу опубликовать пользовательский тип метрики в Stackdriver, и ниже показано, как он отображается в обозревателе метрик 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.
Я уже включил Адаптер стекдрайвера (я использую унаследованная модель ресурсов). Есть ли что-нибудь еще, что я ошибаюсь, пожалуйста
Поскольку вы можете видеть свою пользовательскую метрику в графическом интерфейсе 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
. Спасибо за Ваш ответ :) . Я думаю, что раньше в моих конфигурациях ролей могли быть ошибки.
Хорошей практикой является использование нескольких уникальных меток для таргетинга ваших показателей. Прямо сейчас, основываясь на метриках, помеченных в вашем 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
Спасибо за это предложение!
По умолчанию HPA использует процессор от
metric-server
в kubernetes. K8s не знает, какие показатели вы используете. Вам нужно развернуть собственный адаптер/метрический сервер, например. Проверить ссылку docs.bitnami.com/kubernetes/how-to/…