Effectuer HPA sur le backend spécifié en fonction des métriques Nginx Ingress

Cet article est partagé par la communauté Huawei Cloud « Exécution de HPA sur le backend spécifié en fonction des indicateurs Nginx Ingress ». L'auteur : Vous pouvez vous faire des amis.

arrière-plan

Dans les scénarios de production, le trafic Nginx Ingress sera éventuellement transmis à différentes applications via des noms de domaine et des chemins. Parfois, le processeur et la mémoire ne sont pas des goulots d'étranglement en termes de performances de nginx. Dans ce cas, nginx_ingress_controller_requestsHPA peut être configuré pour l'application correspondante en fonction d'indicateurs à atteindre de manière élastique . spécifiez les charges de travail back-end en fonction du volume de requêtes des différents noms de domaine et chemins d'accès.

Introduction

Préparation environnementale

  • nginx-ingress a été déployé
  • Le plug-in de surveillance natif cloud kube-prometheus-stack a été installé (mode serveur). Le plug-in surveille l'entrée nginx par défaut. Pour les environnements open source, veuillez configurer la surveillance par vous-même.
  • Commande kubectl configurée ou utilisez cloudshell

Remarque : Étant donné que l'espace de noms ne peut pas être spécifié dans les règles HPA scaleTargetRefet describedObjectdans les deux champs, la source de l'indicateur, HPA et la cible élastique doivent se trouver dans le même espace de noms, tandis que les charges de travail nginx-ingress et métier se trouvent généralement dans des espaces de noms différents. Tapez HPA, l'espace de noms de la source de l'indicateur peut être ignoré

Pas

Créez la charge de travail cible élastique, le service et l'entrée requis pour la démo

Version api : apps/v1
genre : Déploiement
métadonnées :
  nom : test-hpa
  Étiquettes:
    application : application de test
spécification :
  répliques : 1
  sélecteur:
    matchLabels :
      application : application de test
  modèle:
    métadonnées :
      Étiquettes:
        application : application de test
    spécification :
      conteneurs :
      -image : skto/sample-app:v2
        nom : fournisseur de métriques
        ports :
        - nom : http
          port du conteneur : 8080
---
Version api : v1
genre : Service
métadonnées :
  nom : application-test
  espace de noms : par défaut
  Étiquettes:
    application : application de test
spécification :
  ports :
    - port : 8080
      nom : http
      protocole : TCP
      Port cible : 8080
  sélecteur:
    application : application de test
  tapez : ClusterIP

---
Version api : apps/v1
genre : Déploiement
métadonnées :
  nom : exemple d'application
  Étiquettes:
    application : exemple d'application
spécification :
  répliques : 1
  sélecteur:
    matchLabels :
      application : exemple d'application
  modèle:
    métadonnées :
      Étiquettes:
        application : exemple d'application
    spécification :
      conteneurs :
      -image : skto/sample-app:v2
        nom : fournisseur de métriques
        ports :
        - nom : http
          port du conteneur : 8080
---
Version api : v1
genre : Service
métadonnées :
  nom : exemple d'application
  espace de noms : par défaut
  Étiquettes:
    application : exemple d'application
spécification :
  ports :
    - port : 80
      nom : http
      protocole : TCP
      Port cible : 8080
  sélecteur:
    application : exemple d'application
  tapez : ClusterIP
---
Version api : networking.k8s.io/v1
genre : Entrée
métadonnées :
  nom : test-entrée
  espace de noms : par défaut
spécification :
  nom de classe d'entrée : nginx
  règles:
    - hébergeur : test.example.com
      http :
        chemins :
          - back-end :
              service:
                nom : exemple d'application
                port:
                  numéro : 80
            chemin: /
            pathType : implémentation spécifique
          - back-end :
              service:
                nom : application-test
                port:
                  numéro : 8080
            chemin : /home
            pathType : implémentation spécifique

Indicateurs Query test.example.com/et test.example.com/homenginx_ingress_controller_requests respectivement, les indicateurs sont normaux

image.png

image.png

Créez une ressource apiservices de type externe ; il est normal que le statut des apiservices soit faux après la création. Après l'ajout de externalRules, le statut devient vrai.

Version api : apiregistration.k8s.io/v1
genre : APIService
métadonnées :
  nom : v1beta1.external.metrics.k8s.io
spécification :
  groupe : external.metrics.k8s.io
  groupPriorityMinimum : 100
  insecureSkipTLSVerify : vrai
  service : #Spécifiez le service correspondant à prometheus-adapter. Le nom de l'adaptateur dans le plug-in Huawei CCE est custom-metrics-apiserver.
    nom : custom-metrics-apiserver
    espace de noms : surveillance
    port : 443
  version : v1bêta1
  versionPriorité : 100

Ajoutez les règles externalRules à la carte de configuration de l'adaptateur. Après modification, vous devez redémarrer le service prometheus-adapter.

kubectl -n surveillance modifier configmap user-adapter-config

image.png

règles externes :
- metricsQuery : sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) par (<<.GroupBy>>)
  nom:
    comme : ${1}_par_seconde
    correspondances : ^(.*)
  ressources:
    namespaced: false #Ignorer l'espace de noms de la source de l'indicateur, cette configuration n'applique pas les règles
  seriesQuery : nginx_ingress_controller_requests

 

seriesQuery : indicateur d'origine ; vous pouvez écrire le nom de l'indicateur directement, ou vous pouvez utiliser {labelKey=labelValue} pour filtrer l'indicateur d'origine.

metricsQuery : utilisez PromQL pour filtrer et agréger les indicateurs ; .Seriesreprésente les indicateurs d'origine, .LabelMatchersreprésente le filtrage des étiquettes des indicateurs et des règles de filtrage spécifiques peuvent être configurées dans hpa.

name : Renommer l'indicateur

resources : Appelé via l'API lorsque hpa interroge des indicateurs, le chemin d'appel est :

 

La fonction des ressources est de remplacer ${namespace} dans le chemin par la valeur de la balise d'espace de noms dans l'indicateur, et notre solution doit ignorer l'espace de noms source de l'indicateur.

Après avoir redémarré le service custom-metrics-apiserver, vous devez attendre environ 1 minute et exécuter la commande pour vérifier si les indicateurs sont normaux.

kubectl get --raw /apis/external.metrics.k8s.io/v1beta1/namespaces/*/nginx_ingress_controller_requests_per_second

image.png

Créer des règles HPA

apiVersion : mise à l'échelle automatique/v2
genre : HorizontalPodAutoscaler
métadonnées :
  nom : échantillon-hpa
spécification :
  scaleTargetRef :
    Version api : apps/v1
    genre : Déploiement
    nom : exemple d'application
  min Réponses : 1
  maxRépliques : 10
  métrique:
    - type : Externe
      externe:
        métrique:
          nom : nginx_ingress_controller_requests_per_second
          sélecteur:
            matchLabels : #Vous pouvez filtrer les indicateurs via ce champ. Les conditions de filtrage des étiquettes ici seront ajoutées à <<.LabelMatchers>> de externalRules.
              exported_service : sample-app #Filtrer les requêtes dont le service backend est sample-app
              hôte : test.example.com #Filtrer les demandes d'accès au nom de domaine test.example.com
        cible:
          type: AverageValue #Le type d'indicateur externe ne prend en charge que les valeurs cibles des types Value et AverageValue.
          Valeur moyenne : 30
---
apiVersion : mise à l'échelle automatique/v2
genre : HorizontalPodAutoscaler
métadonnées :
  nom : test-hpa
spécification :
  scaleTargetRef :
    Version api : apps/v1
    genre : Déploiement
    nom : application-test
  min Réponses : 1
  maxRépliques : 10
  métrique:
    - type : Externe
      externe:
        métrique:
          nom : nginx_ingress_controller_requests_per_second
          sélecteur:
            matchLabels :
              exported_service : application de test
              hôte : test.example.com
        cible:
          tapez : Valeur moyenne
          Valeur moyenne : 30

image.png

Démo flexible

Utilisez la commande pour tester le nom de domaine d'accès et le chemin correspondant à l'exemple d'application, et déclenchez l'élasticité normalement ; veuillez configurer vous-même le mappage entre le nom de domaine et l'adresse ELB ;

ab -c 50 -n 5000 http://test.example.com/

image.png

Utilisez la même méthode pour tester l’application de test et déclencher l’élasticité normalement.

ab -c 50 -n 5000 http://test.example.com/home

image.png

 

Cliquez pour suivre et découvrir les nouvelles technologies de Huawei Cloud dès que possible~

 

Linus a pris sur lui d'empêcher les développeurs du noyau de remplacer les tabulations par des espaces. Son père est l'un des rares dirigeants capables d'écrire du code, son deuxième fils est directeur du département de technologie open source et son plus jeune fils est un noyau open source. contributeur. Robin Li : Le langage naturel deviendra un nouveau langage de programmation universel. Le modèle open source prendra de plus en plus de retard sur Huawei : il faudra 1 an pour migrer complètement 5 000 applications mobiles couramment utilisées vers Java, qui est le langage le plus enclin . vulnérabilités tierces. L'éditeur de texte riche Quill 2.0 a été publié avec des fonctionnalités, une fiabilité et des développeurs. L'expérience a été grandement améliorée. Bien que l'ouverture soit terminée, Meta Llama 3 a été officiellement publié. la source de Laoxiangji n'est pas le code, les raisons derrière cela sont très réconfortantes. Google a annoncé une restructuration à grande échelle.
{{o.name}}
{{m.nom}}

Je suppose que tu aimes

Origine my.oschina.net/u/4526289/blog/11053992
conseillé
Classement