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