Execute HPA no back-end especificado com base nas métricas do Nginx Ingress

Este artigo é compartilhado pela Huawei Cloud Community " Executando HPA no back-end especificado com base nos indicadores Nginx Ingress ". O autor: Você pode fazer amigos.

fundo

Em cenários de produção, o tráfego do Nginx Ingress será eventualmente encaminhado para diferentes aplicativos por meio de nomes de domínio e caminhos. Às vezes, a CPU e a memória não são os gargalos de desempenho do nginx. Nesse caso, nginx_ingress_controller_requestso HPA pode ser configurado para o aplicativo correspondente com base em indicadores para atingir a elasticidade. especifique cargas de trabalho de back-end com base no volume de solicitações de diferentes nomes de domínio e caminhos.

Introdução

Preparação ambiental

  • nginx-ingress foi implantado
  • O plug-in de monitoramento nativo da nuvem kube-prometheus-stack foi instalado (modo de servidor). O plug-in monitora o nginx-ingress por padrão. Para ambientes de código aberto, configure o monitoramento por conta própria.
  • Comando kubectl configurado ou use cloudshell

Observação: como o namespace não pode ser especificado nas regras do HPA scaleTargetRefe describedObjectnos dois campos, a origem do indicador, o HPA e o destino elástico precisam estar no mesmo namespace, enquanto o nginx-ingress e as cargas de trabalho de negócios geralmente estão em namespaces diferentes; Digite HPA, o namespace da fonte do indicador pode ser ignorado

Passos

Crie a carga de trabalho, o serviço e a entrada de destino elástico necessários para a demonstração

apiVersão: apps/v1
tipo: implantação
metadados:
  nome: teste-hpa
  rótulos:
    aplicativo: aplicativo de teste
especificação:
  réplicas: 1
  seletor:
    rótulos de correspondência:
      aplicativo: aplicativo de teste
  modelo:
    metadados:
      rótulos:
        aplicativo: aplicativo de teste
    especificação:
      containers:
      - imagem: skto/sample-app:v2
        nome: provedor de métricas
        portos:
        - nome: http
          porta do contêiner: 8080
---
versão api: v1
tipo: Serviço
metadados:
  nome: aplicativo de teste
  espaço para nome: padrão
  rótulos:
    aplicativo: aplicativo de teste
especificação:
  portos:
    - porta: 8080
      nome: http
      protocolo: TCP
      porta de destino: 8080
  seletor:
    aplicativo: aplicativo de teste
  tipo: ClusterIP

---
apiVersão: apps/v1
tipo: implantação
metadados:
  nome: aplicativo de amostra
  rótulos:
    aplicativo: aplicativo de amostra
especificação:
  réplicas: 1
  seletor:
    rótulos de correspondência:
      aplicativo: aplicativo de amostra
  modelo:
    metadados:
      rótulos:
        aplicativo: aplicativo de amostra
    especificação:
      containers:
      - imagem: skto/sample-app:v2
        nome: provedor de métricas
        portos:
        - nome: http
          porta do contêiner: 8080
---
versão api: v1
tipo: Serviço
metadados:
  nome: aplicativo de amostra
  espaço para nome: padrão
  rótulos:
    aplicativo: aplicativo de amostra
especificação:
  portos:
    - porta: 80
      nome: http
      protocolo: TCP
      porta de destino: 8080
  seletor:
    aplicativo: aplicativo de amostra
  tipo: ClusterIP
---
apiVersão: networking.k8s.io/v1
tipo: Entrada
metadados:
  nome: entrada de teste
  espaço para nome: padrão
especificação:
  nome da classe de entrada: nginx
  regras:
    - host: teste.exemplo.com
      http:
        caminhos:
          - Processo interno:
              serviço:
                nome: aplicativo de amostra
                porta:
                  número: 80
            caminho: /
            pathType: Implementação Específica
          - Processo interno:
              serviço:
                nome: aplicativo de teste
                porta:
                  número: 8080
            caminho: /home
            pathType: Implementação Específica

Indicadores Query test.example.com/e test.example.com/homenginx_ingress_controller_requests respectivamente, os indicadores são normais

imagem.png

imagem.png

Crie um recurso apiservices do tipo externo; é normal que o status dos apiservices seja falso após a criação, após adicionar externalRules, o status se torna verdadeiro.

apiVersão: apiregistration.k8s.io/v1
tipo: APIService
metadados:
  nome: v1beta1.external.metrics.k8s.io
especificação:
  grupo: external.metrics.k8s.io
  grupoPrioridadeMínimo: 100
  insecureSkipTLSVerify: verdadeiro
  serviço: #Especifique o serviço correspondente ao adaptador prometheus. O nome do adaptador no plug-in Huawei CCE é custom-metrics-apiserver.
    nome: custom-metrics-apiserver
    namespace: monitoramento
    porta: 443
  versão: v1beta1
  versãoPrioridade: 100

Adicione as regras externalRules ao configmap do adaptador. Após a modificação, você precisa reiniciar o serviço prometheus-adapter.

kubectl -n monitoramento editar configmap user-adapter-config

imagem.png

regras externas:
- métricasQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) por (<<.GroupBy>>)
  nome:
    como: ${1}_por_segundo
    correspondências: ^(.*)
  recursos:
    namespaced: false #Ignora o namespace da fonte do indicador, esta configuração não aplica regras
  seriesQuery: nginx_ingress_controller_requests

 

seriesQuery : indicador original; você pode escrever o nome do indicador diretamente ou pode usar {labelKey=labelValue} para filtrar o indicador original.

métricasQuery : Use PromQL para filtrar e agregar indicadores, .Seriesrepresenta indicadores originais, .LabelMatchersrepresenta filtragem de rótulos de indicadores e regras de filtragem específicas podem ser configuradas no HPA;

name : Renomeie o indicador

recursos : chamado através da API quando o HPA consulta indicadores, o caminho de chamada é:

 

A função dos recursos é substituir ${namespace} no caminho pelo valor da tag namespace no indicador, e nossa solução precisa ignorar o namespace de origem do indicador.

Após reiniciar o serviço custom-metrics-apiserver, é necessário aguardar cerca de 1 minuto e executar o comando para verificar se os indicadores estão normais.

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

imagem.png

Criar regras HPA

apiVersion: escalonamento automático/v2
tipo: HorizontalPodAutoscaler
metadados:
  nome: amostra-hpa
especificação:
  escalaTargetRef:
    apiVersão: apps/v1
    tipo: implantação
    nome: aplicativo de amostra
  min Respostas: 1
  maxReplicas: 10 
  Métricas:
    tipo: Externo
      externo:
        métrica:
          nome: nginx_ingress_controller_requests_per_second
          seletor:
            matchLabels: #Você pode filtrar indicadores através deste campo As condições de filtragem do rótulo aqui serão adicionadas a <<.LabelMatchers>> de externalRules.
              exported_service: sample-app #Filter solicitações cujo serviço de back-end é sample-app
              host: test.example.com #Filter solicitações para acessar o nome de domínio test.example.com
        alvo:
          tipo: O tipo de indicador AverageValue #External suporta apenas valores alvo dos tipos Value e AverageValue.
          valor médio: 30
---
apiVersion: escalonamento automático/v2
tipo: HorizontalPodAutoscaler
metadados:
  nome: teste-hpa
especificação:
  escalaTargetRef:
    apiVersão: apps/v1
    tipo: implantação
    nome: aplicativo de teste
  min Respostas: 1
  maxReplicas: 10
  Métricas:
    tipo: Externo
      externo:
        métrica:
          nome: nginx_ingress_controller_requests_per_second
          seletor:
            rótulos de correspondência:
              exported_service: aplicativo de teste
              host: teste.exemplo.com
        alvo:
          tipo: Valor Médio
          valor médio: 30

imagem.png

Demonstração flexível

Use o comando para testar a resistência do nome de domínio de acesso e do caminho correspondente ao aplicativo de amostra e acione a elasticidade normalmente; configure você mesmo o mapeamento entre o nome de domínio e o endereço ELB;

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

imagem.png

Use o mesmo método para testar a resistência do aplicativo de teste e acionar a elasticidade normalmente.

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

imagem.png

 

Clique para seguir e conhecer as novas tecnologias da Huawei Cloud o mais rápido possível~

 

Linus assumiu a responsabilidade de evitar que os desenvolvedores do kernel substituíssem tabulações por espaços. Seu pai é um dos poucos líderes que sabe escrever código, seu segundo filho é o diretor do departamento de tecnologia de código aberto e seu filho mais novo é um núcleo de código aberto. contribuidor Robin Li: A linguagem natural se tornará uma nova linguagem de programação universal. O modelo de código aberto ficará cada vez mais atrás da Huawei: levará 1 ano para migrar totalmente 5.000 aplicativos móveis comumente usados ​​para Hongmeng. vulnerabilidades de terceiros. O editor de rich text Quill 2.0 foi lançado com recursos, confiabilidade e desenvolvedores. A experiência foi bastante melhorada. fonte de Laoxiangji não é o código, as razões por trás disso são muito comoventes. O Google anunciou uma reestruturação em grande escala.
{{o.nome}}
{{m.nome}}

Acho que você gosta

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