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_requests
o 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 scaleTargetRef
e describedObject
nos 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/home
nginx_ingress_controller_requests respectivamente, os indicadores são normais
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
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, .Series
representa indicadores originais, .LabelMatchers
representa 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
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
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/
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
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.