Realice HPA en el backend especificado según las métricas de Nginx Ingress

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_requestsHPA 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 scaleTargetRefy describedObjecten 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/homenginx_ingress_controller_requests respectivamente, los indicadores son normales

imagen.png

imagen.png

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

imagen.png

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 .Seriesrepresentan indicadores originales, .LabelMatchersrepresenta 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

imagen.png

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

imagen.png

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/

imagen.png

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

imagen.png

 

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

Supongo que te gusta

Origin my.oschina.net/u/4526289/blog/11053992
Recomendado
Clasificación