Решение
Чтобы он заработал, вам необходимо развернуть адаптер пользовательских метрик Stackdriver < / а>. Ниже приведены команды для его развертывания.
$ 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
в Kubernets 1.16+.
person
PjoterS
schedule
18.11.2020
Custom metrics must be exported from your application in a specific format.
Не могли бы вы указать, какие шаги вы уже сделали? - person PjoterS   schedule 09.11.2020