Kubernetes Anwendungsskalierung basierend auf Metriken von Prometheus



Eine häufige Situation: Sie haben mehrere Anwendungen, von denen eine tagsüber eine Spitzenlast aufweist und zu anderen Zeiten niemand darauf zugreift (oder auf die nur selten zugegriffen wird). Andere Anwendungen können nachts Cluster-Strom verbrauchen. Als Beispiel für solche Anwendungen können wir Webdienste, einige Datenhandler, anführen.

Wie üblich reichen Clusterressourcen überhaupt nicht aus. Sie müssen sich etwas einfallen lassen, um die Ressourcennutzung zu optimieren, und Kubernetes ist dafür großartig. Es verfügt über einen horizontalen Pod-Autoscaler , mit dem Sie Anwendungen basierend auf Metriken skalieren können.



Metriken werden normalerweise vom Metrikserver bereitgestellt . Als Nächstes werde ich über das Ersetzen des Metrikservers durch Prometheus sprechen (da Prometheus die vom Metrikserver bereitgestellten Daten implementiert und wir einen zusätzlichen Link entfernen) und darüber, wie unsere Anwendungen in Kubernetes basierend auf Metriken von Prometheus skaliert werden.

Installieren Sie zunächst den Prometheus-Operator . Persönlich verwende ich vorgefertigte Manifeste . Sie können das Diagramm für Helm verwenden (aber ich habe die Leistung nicht überprüft). Entfernen Sie auch den Metrikserver, falls vorhanden. Überprüfen Sie danach, ob alles ordnungsgemäß funktioniert.



# kubectl get --raw "/apis/metrics.k8s.io/v1beta1/" | jq { "kind": "APIResourceList", "apiVersion": "v1", "groupVersion": "metrics.k8s.io/v1beta1", "resources": [ { "name": "nodes", "singularName": "", "namespaced": false, "kind": "NodeMetrics", "verbs": [ "get", "list" ] }, { "name": "pods", "singularName": "", "namespaced": true, "kind": "PodMetrics", "verbs": [ "get", "list" ] } ] } 

Wenden Sie dann Manifeste aus diesem Verzeichnis an . Dadurch wird der Prometheus-Adapter installiert. Ich habe ein Diagramm gefunden , das diese Manifeste enthält, es aber nicht überprüft. Danach sollten Sie den Befehl korrekt ausführen:

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

(Es wird eine sehr große Liste geben, daher werde ich sie hier nicht auflisten.)

Um zu verstehen, was die URLsmetrics.k8s.io und custom.metrics.k8s.io bedeuten, kann Ihnen die Dokumentation helfen.

Wenn etwas nicht funktioniert, schauen Sie wie gewohnt in die Protokolle. Sie können auch nach einer Lösung für Probleme suchen.

Richten Sie jetzt die automatische Skalierung ein.

Ich habe eine Anwendung, die viele Prozessorressourcen verbraucht und die Warteschlange bedient. Sobald die Warteschlangengröße einen bestimmten Schwellenwert überschreitet, möchte ich die Anzahl der Herde im Replikatsatz erhöhen, um die Warteschlange schneller zu verarbeiten. Sobald die Größe unter dem Schwellenwert liegt, sollten Clusterressourcen freigegeben werden.

Um zu verstehen, wie Regeln für den Prometheus-Adapter geschrieben werden, müssen Sie dieses Dokument und die zugehörigen Seiten sorgfältig lesen. So sieht es bei mir aus.

Bitte an Prometheus

 wqueue_tube_total_size{tube="dmload-legacy"} 

es gibt zurück:

 wqueue_tube_total_size{endpoint="pprof-port",instance="10.116.2.237:8542",job="wqueue-pprof",namespace="default",pod="wqueue-b9fdd9455-66mwm",service="wqueue-pprof",tube="dmload-legacy"} 32 

Und ich schreibe die folgende Regel für Prometheus-Adapter:

 - seriesQuery: wqueue_tube_total_size{tube="dmload-legacy"} resources: overrides: namespace: resource: namespace tube: resource: service name: {as: "wqueue_tube_total_size_dmload_legacy"} metricsQuery: wqueue_tube_total_size{tube="dmload-legacy"} 

Es sollte beachtet werden, dass ich den Röhrenparameter im Betrieb abbilden muss, um dann hpa in der Beschreibung zu verwenden.

Hpa-Konfiguration:

 --- kind: HorizontalPodAutoscaler apiVersion: autoscaling/v2beta1 metadata: name: dmload-v3-legacy namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: dmload-v3-legacy minReplicas: 2 maxReplicas: 20 metrics: - type: Object object: metricName: wqueue_tube_total_size_dmload_legacy target: apiVersion: v1 kind: Service name: dmload-legacy targetValue: 30 

Hier wqueue_tube_total_size_dmload_legacy ich darauf hin, dass sobald die Anzahl der Jobs in der Warteschlange wqueue_tube_total_size_dmload_legacy 30 überschreitet, Pods hinzugefügt werden, bis es 20 gibt, und wenn targetValue unter 30 fällt, dann auf 2 reduzieren.

Wir bewerben uns und sehen, was passiert. Mein System arbeitet mehrere Tage und reduziert im Moment nur die Anzahl der Herde:

 # kubectl describe hpa dmload-v3-legacy Name: dmload-v3-legacy Namespace: default Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"autoscaling/v2beta1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"dmload-v3-legacy","namespace":"d... CreationTimestamp: Thu, 24 Jan 2019 16:16:43 +0300 Reference: Deployment/dmload-v3-legacy Metrics: ( current / target ) "wqueue_tube_total_size_dmload_legacy" on Service/dmload-legacy: 14 / 30 Min replicas: 2 Max replicas: 20 Deployment pods: 15 current / 14 desired Conditions: Type Status Reason Message ---- ------ ------ ------- AbleToScale True SucceededRescale the HPA controller was able to update the target scale to 14 ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from Service metric wqueue_tube_total_size_dmload_legacy ScalingLimited False DesiredWithinRange the desired count is within the acceptable range Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulRescale 59m (x14 over 40h) horizontal-pod-autoscaler New size: 13; reason: All metrics below target Normal SuccessfulRescale 59m (x13 over 40h) horizontal-pod-autoscaler New size: 12; reason: All metrics below target Normal SuccessfulRescale 57m (x14 over 40h) horizontal-pod-autoscaler New size: 11; reason: All metrics below target Normal SuccessfulRescale 56m (x14 over 40h) horizontal-pod-autoscaler New size: 10; reason: All metrics below target Normal SuccessfulRescale 56m (x11 over 38h) horizontal-pod-autoscaler New size: 8; reason: All metrics below target Normal SuccessfulRescale 55m (x6 over 36h) horizontal-pod-autoscaler New size: 7; reason: All metrics below target Normal SuccessfulRescale 47m (x103 over 40h) horizontal-pod-autoscaler (combined from similar events): New size: 20; reason: Service metric wqueue_tube_total_size_dmload_legacy above target Normal SuccessfulRescale 3m38s (x19 over 41h) horizontal-pod-autoscaler New size: 17; reason: All metrics below target Normal SuccessfulRescale 2m8s (x23 over 41h) horizontal-pod-autoscaler New size: 16; reason: All metrics below target Normal SuccessfulRescale 98s (x20 over 40h) horizontal-pod-autoscaler New size: 15; reason: All metrics below target Normal SuccessfulRescale 7s (x18 over 40h) horizontal-pod-autoscaler New size: 14; reason: All metrics below target 

Alles, was beschrieben wurde, wurde auf Kubernetes 1.13.2 ausgeführt.

Fazit


In diesem kurzen Artikel habe ich gezeigt, wie Anwendungen in einem Kubernetes-Cluster mithilfe von Metriken von Prometheus automatisch skaliert werden.

Die Prometheus-Operator-Komponenten wurden konfiguriert und die erforderlichen Manifeste erstellt.

Basierend auf der Metrik von Prometheus zur Größe der Warteschlange stellte sich heraus, dass die Anzahl der Pods, die diese Warteschlange verarbeiten, erhöht oder verringert wurde.


(Die Grafik zeigt, wie sich die Anzahl der Herde in Abhängigkeit von der Größe der Warteschlange ändert.)

Vielen Dank für Ihre Aufmerksamkeit!

Source: https://habr.com/ru/post/de442638/


All Articles