Zewnętrzne metryki

Skalowanie na podstawie zewnętrznych metryk

flowchart LR; subgraph tasks task-1 task-2 task-N end Flower -- check jobs queue --> RabbitMQ[(RabbitMQ)] Flower -- check workers --> tasks tasks -- get tasks --> RabbitMQ[(RabbitMQ)] Prometheus[(Prometheus)] --/metrics--> RabbitMQ HPA --get metrics--> Prometheus HPA --scale up/down--> tasks flaskdemo --create tasks--> RabbitMQ

Kod dostępny w branchu: 6-external-metrics

Zmień definicje obiektów ingress jak poprzednio - są dwie definicje w k8s/tasks/*ingress.yaml

Uruchom aplikację z nowego profilu:

skaffold dev -p tasks

Sprawdź czy masz dostęp do dashboardu Flower, gdzie są dostępne statystyki tasków. Dostęp jest po ingress (np. flower.192.168.71.47.nip.io).

Dodaj kilka zadań - wrzuć je curlem:

curl -XPOST flaskdemo.192.168.71.47.nip.io/runtask

Dodaj do grafany dwa nowe panele z zapytyaniami:

  1. Ilość tasków z RabbitMQ czekających na obsługę: rabbitmq_queue_messages_unacked{}
  2. Ilość gotowych replik z workerami: kube_deployment_status_replicas_available{deployment="tasks"}

Dodaj trochę zadań:

for i in {1..50};do curl -XPOST flaskdemo.192.168.71.47.nip.io/runtask;sleep 5;done

Zobacz status HPA i wykresy na grafanie. Czy pody tasks się skalują? Jeśli nie to pewnie przez brakujące reguły eksportujący metryki z prometheus do api Kubernetes.

Dodaj reguły zaciągające je z prometheusa - w pliku k8s/prometheus/adapter-values.yaml dodaj na końcu następującą konfigurację (to jest element rules na tym samym poziomie co custom):

  external:
    - seriesQuery: "rabbitmq_queue_messages_unacked{}"
      resources:
        template: <<.Resource>>
      name:
        matches: ""
        as: "celery_queue_size"
      metricsQuery: <<.Series>>

i zaaplikuj je

kustomize build --enable-helm k8s/prometheus | kubectl apply -f-

Możesz to zweryfikować komendą odpytującą o dostępne elementy zewnętrznego api do metryk:

kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/"

Dodaj trochę dlugich zadań:

for i in {1..50};do curl -XPOST 'http://flaskdemo.192.168.71.47.nip.io/runtask?l=30';sleep 5;done