#kubernetes #prometheus-operator #hpa
#kubernetes #prometheus-operator #гпа
Вопрос:
У меня есть три пространства имен: мониторинг пространства имен с помощью prometheus-operator, пространство имен rabbitmq с менеджером очередей RabbitMQ и prometheus-adapter, пространство имен worker с приложением, которое просто создает входные данные для модуля RabbitMQ. Я хочу использовать горизонтальный модуль автоматического масштабирования (HPA) для масштабирования рабочего модуля (в пространстве имен worker) с метриками из очереди «task_queue» из модуля RabbitMQ (в пространстве имен rabbitmq). Все эти метрики собираются оператором prometheus (в пространстве имен monitoring) и они отображаются во внешнем интерфейсе prometheus:
Запрос «rabbitmq_queue_messages» в prometheus-url: 8080/graph:
rabbitmq_queue_messages{durable="true",endpoint="metrics",instance="x.x.x.x:9419",job="rabbitmq-server",namespace="rabbitmq",pod="rabbitmq-server-0",queue="task_queue",service="rabbitmq-server",vhost="/"}
RabbitMQ, Prometheus-operator и Prometheus-adapter были установлены из helm charts
RabbitMQ (значения.у yaml есть пароль и включить метрики в 9419 для очистки):
helm install --namespace rabbitmq rabbitmq-server stable/rabbitmq
--set extraPlugins=rabbitmq_prometheus
-f charts/default/rabbitmq/values.yaml
Prometheus-адаптер:
helm upgrade --install --namespace rabbitmq prometheus-adapter stable/prometheus-adapter
--set prometheus.url="http://pmt-server-prometheus-oper-prometheus.monitoring.svc"
--set prometheus.port="9090"
Prometheus-operator:
helm upgrade --install --namespace monitoring pmt-server stable/prometheus-operator
--set prometheusOperator.createCustomResource=false
-f charts/default/values.yaml
Значения Prometheus.yaml:
prometheus:
additionalServiceMonitors:
- name: rabbitmq-svc-monitor
selector:
matchLabels:
app: rabbitmq
namespaceSelector:
matchNames:
- rabbitmq
endpoints:
- port: metrics
interval: 10s
path: /metrics
Пользовательские метрики в порядке:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/rabbitmq/services/rabbitmq-server/rabbitmq_queue_messages" | jq .
{
"kind": "MetricValueList",
"apiVersion": "custom.metrics.k8s.io/v1beta1",
"metadata": {
"selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/rabbitmq/services/rabbitmq-server/rabbitmq_queue_messages"
},
"items": [
{
"describedObject": {
"kind": "Service",
"namespace": "rabbitmq",
"name": "rabbitmq-server",
"apiVersion": "/v1"
},
"metricName": "rabbitmq_queue_messages",
"timestamp": "2020-08-20T12:15:39Z",
"value": "0",
"selector": null
}
]
}
И вот мой hpa.yaml:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: rabbitmq-queue-worker-hpa
namespace: worker
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: worker
minReplicas: 1
maxReplicas: 50
metrics:
- type: Object
object:
metric:
name: rabbitmq_queue_messages
describedObject:
apiVersion: "/v1"
kind: Service
name: rabbitmq-server.rabbitmq.svc.cluster.local
target:
type: Value
value: 100
But the hpa don’t work as kubectl describe shows:
kubectl describe hpa/rabbitmq-queue-worker-hpa -n worker
Name: rabbitmq-queue-worker-hpa
Namespace: worker
Labels: app.kubernetes.io/managed-by=Helm
Annotations: meta.helm.sh/release-name: rabbitmq-scaling-demo-app
meta.helm.sh/release-namespace: worker
CreationTimestamp: Thu, 20 Aug 2020 08:42:32 -0300
Reference: Deployment/worker
Metrics: ( current / target )
"rabbitmq_queue_messages" on Service/rabbitmq-server.rabbitmq.svc.cluster.local (target value): <unknown> / 100
Min replicas: 1
Max replicas: 50
Deployment pods: 1 current / 0 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True SucceededGetScale the HPA controller was able to get the target's current scale
ScalingActive False FailedGetObjectMetric the HPA was unable to compute the replica count: unable to get metric rabbitmq_queue_messages: Service on worker rabbitmq-server.rabbitmq.svc.cluster.local/unable to fetch metrics from custom metrics API: the server could not find the metric rabbitmq_queue_messages for services rabbitmq-server.rabbitmq.svc.cluster.local
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedComputeMetricsReplicas 60m (x12 over 63m) horizontal-pod-autoscaler invalid metrics (1 invalid out of 1), first error is: failed to get object metric value: unable to get metric rabbitmq_queue_messages: Service on worker rabbitmq-server.rabbitmq.svc.cluster.local/unable to fetch metrics from custom metrics API: no custom metrics API (custom.metrics.k8s.io) registered
Warning FailedGetObjectMetric 60m (x13 over 63m) horizontal-pod-autoscaler unable to get metric rabbitmq_queue_messages: Service on worker rabbitmq-server.rabbitmq.svc.cluster.local/unable to fetch metrics from custom metrics API: no custom metrics API (custom.metrics.k8s.io) registered
Warning FailedGetObjectMetric 58m (x3 over 58m) horizontal-pod-autoscaler unable to get metric rabbitmq_queue_messages: Service on worker rabbitmq-server.rabbitmq.svc.cluster.local/unable to fetch metrics from custom metrics API: the server is currently unable to handle the request (get services.custom.metrics.k8s.io rabbitmq-server.rabbitmq.svc.cluster.local)
Warning FailedGetObjectMetric 2m59s (x218 over 57m) horizontal-pod-autoscaler unable to get metric rabbitmq_queue_messages: Service on worker rabbitmq-server.rabbitmq.svc.cluster.local/unable to fetch metrics from custom metrics API: the server could not find the metric rabbitmq_queue_messages for services rabbitmq-server.rabbitmq.svc.cluster.local
I belive that HPA is trying to find the RabbitMq service on worker namespace,
Warning FailedGetObjectMetric 60m (x13 over 63m) horizontal-pod-autoscaler unable to get metric rabbitmq_queue_messages: Service on worker rabbitmq-server.rabbitmq.svc.cluster.local/unable to fetch metrics from custom metrics API: no custom metrics API (custom.metrics.k8s.io) registered
но сервис находится в пространстве имен rabbitmq. Я попытался использовать полное доменное имя службы rabbit (rabbitmq-server.rabbitmq.svc.cluster.local) и просто имя службы (rabbitmq-server). Что я упускаю? Есть ли способ заставить это работать? Дело здесь в том, что у меня есть еще один проект с более чем 10 пространствами имен, и все они используют один и тот же сервер rabbit (в пространстве имен rabbitmq), поэтому позволить им всем вместе в одном пространстве имен будет кошмаром. Спасибо.
Правка 1: Мои пользовательские метрики config.yaml
prometheus:
url: http://pmt-server-prometheus-oper-prometheus.monitoring.svc
port: 9090
rbac:
create: true
serviceAccount:
create: true
service:
port: 443
logLevel: 6
rules:
custom:
- seriesQuery: 'rabbitmq_queue_messages{namespace!="",service!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
service: {resource: "service"}
metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>,queue="task_queue"}) by (<<.GroupBy>>)
И установите адаптер helm с этим файлом:
helm upgrade --install --namespace rabbitmq prometheus-adapter stable/prometheus-adapter -f config.yaml
И это описание HPA, если HPA создается в пространстве имен rabbitmq:
Name: rabbitmq-queue-worker-hpa
Namespace: rabbitmq
Labels: app.kubernetes.io/managed-by=Helm
Annotations: meta.helm.sh/release-name: rabbitmq-scaling-demo-app
meta.helm.sh/release-namespace: worker
CreationTimestamp: Fri, 21 Aug 2020 08:45:25 -0300
Reference: Deployment/worker
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): <unknown> / 80%
Min replicas: 1
Max replicas: 50
Deployment pods: 0 current / 0 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale False FailedGetScale the HPA controller was unable to get the target's current scale: deployments/scale.apps "worker" not found
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedGetScale 9s (x17 over 4m11s) horizontal-pod-autoscaler deployments/scale.apps "worker" not found
Комментарии:
1. Не могли бы вы попробовать создать модуль hpa в том же пространстве имен, что и rabbitmq? Значит, rabbitmq вместо worker? Я полагаю, вы настроили пользовательские метрики в адаптере?
2. Я забыл добавить пользовательские метрики, чтобы ответить на мой вопрос (я добавлю его, отредактировав вопрос, спасибо за предупреждение), но я это настроил. Я попытался создать HPA в пространстве имен rabbitmq, но в этом случае HPA не находит мое рабочее развертывание, поскольку оно находится в рабочем пространстве имен.