Создайте HPA для k8s с метриками и pod в разных пространствах имен

#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 не находит мое рабочее развертывание, поскольку оно находится в рабочем пространстве имен.