Dieser Artikel wurde von der Huawei Cloud Community „ Durchführen von HPA auf dem angegebenen Backend basierend auf Nginx-Ingress-Indikatoren “ geteilt. Der Autor: Sie können Freunde finden.
Hintergrund
In Produktionsszenarien wird der Nginx-Ingress-Verkehr schließlich über Domänennamen und -pfade an verschiedene Anwendungen weitergeleitet. Manchmal sind CPU und Speicher nicht die Leistungsengpässe von Nginx. In diesem Fall nginx_ingress_controller_requests
kann HPA für die entsprechende Anwendung konfiguriert werden, um eine elastische Leistung zu erzielen Geben Sie Back-End-Arbeitslasten basierend auf dem Anforderungsvolumen verschiedener Domänennamen und -pfade an.
Einführung
Umweltvorbereitung
- nginx-ingress wurde bereitgestellt
- Das Cloud-native Überwachungs-Plug-in kube-prometheus-stack wurde installiert (Servermodus). Für Open-Source-Umgebungen konfigurieren Sie die Überwachung bitte selbst.
- Konfigurierter kubectl-Befehl oder Verwendung von Cloudshell
scaleTargetRef
Hinweis: Da der Namespace nicht in den HPA-Regeln und den beiden Feldern angegeben werden kann describedObject
, müssen sich die Indikatorquelle, HPA und das elastische Ziel im selben Namespace befinden, während sich Nginx-Ingress und Business-Workloads im Allgemeinen in unterschiedlichen Namespaces befinden Geben Sie HPA ein, der Namensraum der Indikatorquelle kann ignoriert werden
Schritte
Erstellen Sie den für die Demo erforderlichen elastischen Ziel-Workload, Service und Ingress
apiVersion: apps/v1 Art: Bereitstellung Metadaten: Name: test-hpa Etiketten: App: Test-App Spezifikation: Nachbildungen: 1 Wähler: matchLabels: App: Test-App Vorlage: Metadaten: Etiketten: App: Test-App Spezifikation: Behälter: - Bild: skto/sample-app:v2 Name: Metrikanbieter Häfen: - Name: http ContainerPort: 8080 --- APIVersion: v1 Art: Service Metadaten: Name: Test-App Namespace: Standard Etiketten: App: Test-App Spezifikation: Häfen: - Port: 8080 Name: http Protokoll: TCP ZielPort: 8080 Wähler: App: Test-App Typ: ClusterIP --- apiVersion: apps/v1 Art: Bereitstellung Metadaten: Name: Beispiel-App Etiketten: App: Beispiel-App Spezifikation: Nachbildungen: 1 Wähler: matchLabels: App: Beispiel-App Vorlage: Metadaten: Etiketten: App: Beispiel-App Spezifikation: Behälter: - Bild: skto/sample-app:v2 Name: Metrikanbieter Häfen: - Name: http ContainerPort: 8080 --- APIVersion: v1 Art: Service Metadaten: Name: Beispiel-App Namespace: Standard Etiketten: App: Beispiel-App Spezifikation: Häfen: - Hafen: 80 Name: http Protokoll: TCP ZielPort: 8080 Wähler: App: Beispiel-App Typ: ClusterIP --- apiVersion: networking.k8s.io/v1 Art: Ingress Metadaten: Name: Testeingang Namespace: Standard Spezifikation: ingressClassName: nginx Regeln: - Host: test.example.com http: Pfade: - Backend: Service: Name: Beispiel-App Hafen: Anzahl: 80 Weg: / pathType: ImplementationSpecific - Backend: Service: Name: Test-App Hafen: Nummer: 8080 Pfad: /home pathType: ImplementationSpecific
Die Indikatoren „ Query “ test.example.com/
und „nginx_ingress_controller_requests“ sind normaltest.example.com/home
Erstellen Sie eine APIservices-Ressource vom externen Typ. Es ist normal, dass der Status von APIServices nach der Erstellung „falsch“ ist. Nach dem Hinzufügen von „externalRules“ wird der Status „True“.
apiVersion: apiregistration.k8s.io/v1 Art: APIService Metadaten: Name: v1beta1.external.metrics.k8s.io Spezifikation: Gruppe: external.metrics.k8s.io GruppenprioritätMinimum: 100 insecureSkipTLSVerify: true Dienst: #Geben Sie den Dienst an, der dem Prometheus-Adapter entspricht. Der Adaptername im Huawei CCE-Plug-in lautet „custom-metrics-apiserver“. Name: benutzerdefinierte-Metriken-Apiserver Namensraum: Überwachung Port: 443 Version: v1beta1 Versionspriorität: 100
Fügen Sie die externalRules-Regeln zur Konfigurationszuordnung des Adapters hinzu. Nach der Änderung müssen Sie den prometheus-adapter-Dienst neu starten.
kubectl -n Überwachung configmap user-adapter-config bearbeiten
externe Regeln: - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>) Name: als: ${1}_per_second Übereinstimmungen: ^(.*) Ressourcen: namespaced: false #Ignorieren Sie den Namespace der Indikatorquelle. Diese Konfiguration wendet keine Regeln an seriesQuery: nginx_ingress_controller_requests
seriesQuery : Originalindikator; Sie können den Indikatornamen direkt schreiben oder {labelKey=labelValue} verwenden, um den Originalindikator herauszufiltern.
metricsQuery : Verwenden Sie PromQL zum Filtern und Aggregieren von Indikatoren; .Series
stellt Originalindikatoren dar, .LabelMatchers
stellt die Etikettenfilterung von Indikatoren dar und spezifische Filterregeln können in hpa konfiguriert werden
name : Benennen Sie den Indikator um
Ressourcen : Wird über die API aufgerufen, wenn HPA Indikatoren abfragt. Der Aufrufpfad lautet:

Die Rolle von Ressourcen besteht darin, ${namespace} im Pfad durch den Wert des Namespace-Tags im Indikator zu ersetzen, und unsere Lösung muss den Quell-Namespace des Indikators ignorieren.
Nach dem Neustart des Dienstes „custom-metrics-apiserver“ müssen Sie etwa eine Minute warten und den Befehl ausführen, um zu überprüfen, ob die Indikatoren normal sind.
kubectl get --raw /apis/external.metrics.k8s.io/v1beta1/namespaces/*/nginx_ingress_controller_requests_per_second
Erstellen Sie HPA-Regeln
apiVersion: autoscaling/v2 Art: HorizontalPodAutoscaler Metadaten: Name: Beispiel-hpa Spezifikation: ScaleTargetRef: apiVersion: apps/v1 Art: Bereitstellung Name: Beispiel-App Mindestantworten: 1 maxReplicas: 10 Metriken: - Typ: Extern extern: metrisch: Name: nginx_ingress_controller_requests_per_second Wähler: matchLabels: #Sie können Indikatoren über dieses Feld filtern. Die Label-Filterbedingungen werden hier zu <<.LabelMatchers>> von externalRules hinzugefügt. exported_service: sample-app #Filteranfragen, deren Backend-Dienst sample-app ist Host: test.example.com #Filteranfragen für den Zugriff auf den Domänennamen test.example.com Ziel: Typ: AverageValue #Der externe Indikatortyp unterstützt nur Zielwerte der Typen Value und AverageValue. Durchschnittswert: 30 --- apiVersion: autoscaling/v2 Art: HorizontalPodAutoscaler Metadaten: Name: test-hpa Spezifikation: ScaleTargetRef: apiVersion: apps/v1 Art: Bereitstellung Name: Test-App Mindestantworten: 1 maxReplicas: 10 Metriken: - Typ: Extern extern: metrisch: Name: nginx_ingress_controller_requests_per_second Wähler: matchLabels: exported_service: test-app Host: test.example.com Ziel: Typ: AverageValue Durchschnittswert: 30
Flexible Demo
Verwenden Sie den Befehl, um den Zugriffsdomänennamen und -pfad entsprechend der Beispiel-App einem Stresstest zu unterziehen und die Elastizität normal auszulösen. Bitte konfigurieren Sie die Zuordnung zwischen dem Domänennamen und der ELB-Adresse selbst.
ab -c 50 -n 5000 http://test.example.com/
Verwenden Sie dieselbe Methode, um die Test-App einem Stresstest zu unterziehen und die Elastizität normal auszulösen.
ab -c 50 -n 5000 http://test.example.com/home
Linus hat es sich zur Aufgabe gemacht, zu verhindern, dass Kernel-Entwickler Tabulatoren durch Leerzeichen ersetzen. Sein Vater ist einer der wenigen Führungskräfte, die Code schreiben können, sein zweiter Sohn ist Direktor der Open-Source-Technologieabteilung und sein jüngster Sohn ist ein Open-Source-Core Mitwirkender : Natürliche Sprache wird immer weiter hinter Huawei zurückfallen: Es wird 1 Jahr dauern, bis 5.000 häufig verwendete mobile Anwendungen vollständig auf Hongmeng migriert sind Der Rich - Text-Editor Quill 2.0 wurde mit einer deutlich verbesserten Erfahrung von Ma Huateng und „ Meta Llama 3 “ veröffentlicht Quelle von Laoxiangji ist nicht der Code, die Gründe dafür sind sehr herzerwärmend. Google hat eine groß angelegte Umstrukturierung angekündigt