Własne metryki

Skalowanie na podstawie metryk aplikacji

flowchart LR; subgraph flaskdemo flaskdemo-1 flaskdemo-2 flaskdemo-N end Prometheus[(Prometheus)] --/metrics--> flaskdemo HPA --get metrics--> Prometheus HPA --scale up/down--> flaskdemo

Kod dostępny w branchu: 5-custom-metrics

Uruchom aplikację z nowego profilu

skaffold dev -p custmetrics

Zobacz czy są dostępne metryki typu custom

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

Dodaj obsługę ingress poprzez dodanie Nginx ingress controller do minikube

minikube addons enable ingress

Zmień host w k8s/custmetrics/ingress.yaml na flaskdemo.MINIKUBE_IP.nip.io gdzie MINIKUBE_IP znajdziesz przez polecenie

minikube ip

Sprawdź czy aplikacja wystawia metryki na standardowej ścieżce /metrics.

Dodaj przekierowanie do Prometheus

kubectl -n monitoring port-forward statefulset/prometheus-kube-prometheus-kube-prome-prometheus 9090:9090

Sprawdź w prometheus (http://localhost:9090) czy widzisz metryki flask_*.

Jeśli brakuje to oznacza, że adapter od prometheus nie dostarcza ich przez custom metrics API. Dodaj reguły zaciągające je z prometheusa - w pliku k8s/prometheus/adapter-values.yaml dodaj na końcu następującą konfigurację:

rules:
    custom:
    - seriesQuery: 'flask_http_request_total{namespace!="",pod!=""}'
      resources:
        overrides:
          namespace: { resource: "namespace" }
          pod: { resource: "pod" }
      name:
        matches: "^(.*)"
        as: "flask_http_request_total"
      metricsQuery: "sum(rate(<<.Series>>{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>)"

i zaaplikuj je

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

Wygeneruj obciążenie - tym razem będzie się liczyć ilość requestów

kubectl run -ti --rm loadtest --image=alpine -- sh -c 'apk add apache2-utils; ab -c 20 -t 60   http://flaskdemo/'

Dodaj nowy dashboard w grafanie z dwoma panelami:

  1. Pierwszy z zapytaniem dotyczącym ilości requestów do flaska: rate(flask_http_request_total{namespace!="",pod!=""}[1m])
  2. Drugi z zapytaniem o ilość gotowych replik z deploymentu: kube_deployment_status_replicas_available{deployment="flaskdemo"}

Zmień parametry dotyczące skalowania w dół - w pliku k8s/custmetrics/hpa.yaml:

  • zmień stabilizationWindowSeconds na 0
  • zwiększ ilość maxReplicas
  • opcjonalnie zmień też periodSeconds na mniejszą wartość (np. 10)

Powtórz testy i porównaj jak się zachowuje HPA.