Este artículo es compartido por la comunidad de la nube de Huawei " Realización de HPA en el backend especificado según los indicadores de ingreso de Nginx ". El autor: Puedes hacer amigos.
fondo
En escenarios de producción, el tráfico de entrada de Nginx eventualmente se reenviará a diferentes aplicaciones a través de nombres de dominio y rutas. A veces, la CPU y la memoria no son los cuellos de botella de rendimiento de nginx. En este caso, nginx_ingress_controller_requests
HPA se puede configurar para la aplicación correspondiente en función de los indicadores para lograrlo. especifique cargas de trabajo de back-end en función del volumen de solicitudes de diferentes nombres de dominio y rutas.
Introducción
Preparación ambiental
- nginx-ingress ha sido implementado
- Se ha instalado el complemento de monitoreo nativo de la nube kube-prometheus-stack (modo servidor). El complemento monitorea la entrada de nginx de forma predeterminada. Para entornos de código abierto, configure el monitoreo usted mismo.
- Comando kubectl configurado o use cloudshell
Nota: Dado que el espacio de nombres no se puede especificar en las reglas de HPA scaleTargetRef
y describedObject
en los dos campos, el origen del indicador, HPA y el destino elástico deben estar en el mismo espacio de nombres, mientras que nginx-ingress y las cargas de trabajo empresariales generalmente se encuentran en espacios de nombres diferentes, esta solución utiliza externos; Escriba HPA, el espacio de nombres de la fuente del indicador se puede ignorar
Pasos
Cree la carga de trabajo, el servicio y el ingreso de destino elástico necesarios para la demostración
Versión api: aplicaciones/v1 tipo: Despliegue metadatos: nombre: prueba-hpa etiquetas: aplicación: aplicación de prueba Especificaciones: réplicas: 1 selector: coincidirEtiquetas: aplicación: aplicación de prueba plantilla: metadatos: etiquetas: aplicación: aplicación de prueba Especificaciones: contenedores: - imagen: skto/sample-app:v2 nombre: proveedor de métricas puertos: - nombre: http contenedorPuerto: 8080 --- Versión api: v1 tipo: Servicio metadatos: nombre: aplicación de prueba espacio de nombres: predeterminado etiquetas: aplicación: aplicación de prueba Especificaciones: puertos: - puerto: 8080 nombre:http protocolo: TCP Puerto de destino: 8080 selector: aplicación: aplicación de prueba tipo: IP de clúster --- Versión api: aplicaciones/v1 tipo: Despliegue metadatos: nombre: aplicación de muestra etiquetas: aplicación: aplicación de muestra Especificaciones: réplicas: 1 selector: coincidirEtiquetas: aplicación: aplicación de muestra plantilla: metadatos: etiquetas: aplicación: aplicación de muestra Especificaciones: contenedores: - imagen: skto/sample-app:v2 nombre: proveedor de métricas puertos: - nombre: http contenedorPuerto: 8080 --- Versión api: v1 tipo: Servicio metadatos: nombre: aplicación de muestra espacio de nombres: predeterminado etiquetas: aplicación: aplicación de muestra Especificaciones: puertos: - puerto: 80 nombre:http protocolo: TCP Puerto de destino: 8080 selector: aplicación: aplicación de muestra tipo: IP de clúster --- Versión api: networking.k8s.io/v1 tipo: ingreso metadatos: nombre: ingreso de prueba espacio de nombres: predeterminado Especificaciones: nombre de clase de ingreso: nginx normas: - anfitrión: prueba.ejemplo.com http: caminos: - back-end: servicio: nombre: aplicación de muestra puerto: número: 80 camino: / tipo de ruta: Implementación específica - back-end: servicio: nombre: aplicación de prueba puerto: número: 8080 ruta: /inicio tipo de ruta: Implementación específica
Indicadores de consulta test.example.com/
y test.example.com/home
nginx_ingress_controller_requests respectivamente, los indicadores son normales
Cree un recurso de apiservices de tipo externo; es normal que el estado de apiservices sea falso después de la creación. Después de agregar externalRules, el estado se vuelve verdadero.
Versión de api: apiregistration.k8s.io/v1 tipo: APIService metadatos: nombre: v1beta1.external.metrics.k8s.io Especificaciones: grupo: external.metrics.k8s.io grupoPrioridadMínimo: 100 inseguroSkipTLSVerificar: verdadero servicio: #Especifique el servicio correspondiente a prometheus-adapter. El nombre del adaptador en el complemento Huawei CCE es custom-metrics-apiserver. nombre: métricas-personalizadas-apiserver espacio de nombres: monitoreo puerto: 443 versión: v1beta1 versiónPrioridad: 100
Agregue las reglas externalRules al mapa de configuración del adaptador. Después de la modificación, debe reiniciar el servicio prometheus-adapter.
kubectl -n monitoreo editar mapa de configuración configuración-adaptador de usuario
reglas externas: - métricasQuery: suma(tasa(<<.Series>>{<<.LabelMatchers>>}[2m])) por (<<.GroupBy>>) nombre: como: ${1}_per_segundo coincidencias: ^(.*) recursos: namespaced: false #Ignora el espacio de nombres de la fuente del indicador, esta configuración no aplica reglas serieQuery: nginx_ingress_controller_requests
seriesQuery : indicador original; puede escribir el nombre del indicador directamente o puede usar {labelKey=labelValue} para filtrar el indicador original.
metricsQuery : Utilice PromQL para filtrar y agregar indicadores que .Series
representan indicadores originales, .LabelMatchers
representa el filtrado de etiquetas de indicadores y se pueden configurar reglas de filtrado específicas en hpa;
nombre : Cambiar el nombre del indicador
recursos : llamado a través de API cuando hpa consulta indicadores, la ruta de llamada es:

La función de los recursos es reemplazar ${namespace} en la ruta con el valor de la etiqueta del espacio de nombres en el indicador, y nuestra solución debe ignorar el espacio de nombres de origen del indicador.
Después de reiniciar el servicio custom-metrics-apiserver, debe esperar aproximadamente 1 minuto y ejecutar el comando para verificar si los indicadores son normales.
kubectl get --raw /apis/external.metrics.k8s.io/v1beta1/namespaces/*/nginx_ingress_controller_requests_per_segundo
Crear reglas HPA
Versión de api: ajuste de escala automático/v2 tipo: HorizontalPodAutoscaler metadatos: nombre: muestra-hpa Especificaciones: escalaObjetivoRef: Versión api: aplicaciones/v1 tipo: Despliegue nombre: aplicación de muestra min Respuestas: 1 maxReplicas: 10 métrica: - tipo: externo externo: métrico: nombre: nginx_ingress_controller_requests_per_segundo selector: matchLabels: #Puede filtrar indicadores a través de este campo. Las condiciones de filtrado de etiquetas aquí se agregarán a <<.LabelMatchers>> de externalRules. exported_service: aplicación de muestra #Filtrar solicitudes cuyo servicio backend es aplicación de muestra host: test.example.com #Filtrar solicitudes para acceder al nombre de dominio test.example.com objetivo: tipo: AverageValue # El tipo de indicador externo solo admite valores objetivo de los tipos Value y AverageValue. Valor promedio: 30 --- Versión de api: ajuste de escala automático/v2 tipo: HorizontalPodAutoscaler metadatos: nombre: prueba-hpa Especificaciones: escalaObjetivoRef: Versión api: aplicaciones/v1 tipo: Despliegue nombre: aplicación de prueba min Respuestas: 1 maxReplicas: 10 métrica: - tipo: externo externo: métrico: nombre: nginx_ingress_controller_requests_per_segundo selector: coincidirEtiquetas: servicio_exportado: aplicación de prueba anfitrión: prueba.ejemplo.com objetivo: tipo: Valor Promedio Valor promedio: 30
Demostración flexible
Utilice el comando para realizar una prueba de esfuerzo del nombre de dominio de acceso y la ruta correspondiente a la aplicación de muestra y active la elasticidad normalmente. Configure usted mismo la asignación entre el nombre de dominio y la dirección ELB.
ab -c 50 -n 5000 http://prueba.ejemplo.com/
Utilice el mismo método para realizar una prueba de estrés en la aplicación de prueba y activar la elasticidad normalmente.
ab -c 50 -n 5000 http://test.example.com/home
Haga clic para seguir y conocer las nuevas tecnologías de Huawei Cloud lo antes posible ~
Linus se encargó de evitar que los desarrolladores del kernel reemplazaran las pestañas con espacios. Su padre es uno de los pocos líderes que puede escribir código, su segundo hijo es el director del departamento de tecnología de código abierto y su hijo menor es un núcleo de código abierto. Colaborador Robin Li: El lenguaje natural se convertirá en un nuevo lenguaje de programación universal. El modelo de código abierto se quedará cada vez más atrás de Huawei: tomará 1 año migrar completamente 5,000 aplicaciones móviles de uso común a Hongmeng, que es el lenguaje más propenso. Vulnerabilidades de terceros. Se lanzó el editor de texto enriquecido Quill 2.0 con características, confiabilidad y experiencia de desarrolladores que Ma Huateng y Zhou Hongyi se dieron la mano para "eliminar los rencores". La fuente de Laoxiangji no es el código, las razones detrás de esto son muy conmovedoras. Google anunció una reestructuración a gran escala.