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_requests
HPA 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 scaleTargetRef
et describedObject
dans 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/home
nginx_ingress_controller_requests respectivement, les indicateurs sont normaux
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
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 ; .Series
représente les indicateurs d'origine, .LabelMatchers
repré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 :
![](https://static001.geekbang.org/infoq/86/865b5b09fea15bca03b8e3cb61784dd9.png)
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
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
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/
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
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.