Führen Sie HPA auf dem angegebenen Backend basierend auf Nginx-Ingress-Metriken durch

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_requestskann 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

scaleTargetRefHinweis: 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

Bild.png

Bild.png

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

Bild.png

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; .Seriesstellt Originalindikatoren dar, .LabelMatchersstellt 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

Bild.png

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

Bild.png

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/

Bild.png

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

Bild.png

 

Klicken Sie hier, um zu folgen und so schnell wie möglich mehr über die neuen Technologien von Huawei Cloud zu erfahren~

 

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
{{o.name}}
{{m.name}}

Ich denke du magst

Origin my.oschina.net/u/4526289/blog/11053992
Empfohlen
Rangfolge