Escalonamento automático horizontal de lareiras Kubernetes e Prometheus para alta disponibilidade e disponibilidade de infraestrutura

Saudação, Khabrovites! A tradução do artigo a seguir foi preparada especificamente para os alunos do curso Infrastructure Platform , baseado em Kubernetes , que iniciará as aulas amanhã. Vamos começar.



Escalonamento automático em Kubernetes


O dimensionamento automático permite aumentar e diminuir automaticamente as cargas de trabalho, dependendo do uso de recursos.

O dimensionamento automático do Kubernetes tem duas dimensões:

  • Autoscaler de cluster, responsável por dimensionar nós;
  • Horizontal Pod Autoscaler (HPA), que dimensiona automaticamente o número de lares em um conjunto de implantação ou réplica.

O dimensionamento automático de cluster pode ser usado em conjunto com o dimensionamento automático da lareira horizontal para controlar dinamicamente os recursos de computação e o grau de simultaneidade do sistema necessário para cumprir os SLAs (acordos de nível de serviço).

O escalonamento automático de cluster é altamente dependente dos recursos do provedor de infraestrutura em nuvem que hospeda o cluster, e o HPA pode operar independentemente do provedor IaaS / PaaS.

Desenvolvimento HPA


O dimensionamento automático da lareira horizontal sofreu grandes mudanças desde a introdução do Kubernetes v1.1. A primeira versão do HPA dimensionou os lares com base no consumo medido da CPU e, posteriormente, no uso da memória. O Kubernetes 1.6 introduziu uma nova API chamada Custom Metrics, que fornecia ao HPA acesso a métricas personalizadas. O Kubernetes 1.7 adicionou um nível de agregação que permite que aplicativos de terceiros estendam a API do Kubernetes registrando-se como complementos da API.

Graças à API de métricas personalizadas e ao nível de agregação, sistemas de monitoramento como o Prometheus podem fornecer métricas específicas de aplicativos ao controlador HPA.

O dimensionamento automático da lareira horizontal é implementado como um loop de controle que consulta periodicamente a API de métricas de recursos (API de métricas de recursos) para obter as principais métricas, como uso de CPU e memória, e a API de métricas personalizadas (API de métricas personalizadas) para métricas específicas de aplicativos.



Abaixo está um guia passo a passo para configurar o HPA v2 para Kubernetes 1.9 e posterior.

  1. Instale o suplemento Metrics Server, que fornece as principais métricas.
  2. Inicie um aplicativo de demonstração para ver como o dimensionamento automático da lareira funciona com base no uso da CPU e da memória.
  3. Implante o Prometheus e o servidor de API personalizado. Registre um servidor de API personalizado no nível de agregação.
  4. Configure o HPA usando métricas personalizadas fornecidas pelo aplicativo de demonstração.

Antes de começar, você deve instalar o Go versão 1.8 (ou posterior) e clonar o repositório k8s-prom- GOPATH no GOPATH :

 cd $GOPATH git clone https://github.com/stefanprodan/k8s-prom-hpa 

1. Configurando o Servidor de Métricas


O Kubernetes Metric Server é o agregador de dados de utilização de recursos dentro do cluster que substitui o Heapster . O servidor de métricas coleta informações de uso da CPU e da memória para nós e lares do kubernetes.summary_api . A API Summary é uma API com eficiência de memória para transmitir métricas de dados Kubelet / cAdvisor para um servidor.



Na primeira versão do HPA, era necessário um agregador Heapster para obter a CPU e a memória. No HPA v2 e no Kubernetes 1.8, apenas um servidor métrico é necessário com o horizontal-pod-autoscaler-use-rest-clients ativado. Esta opção é ativada por padrão no Kubernetes 1.9. O GKE 1.9 vem com um servidor de métricas pré-instalado.

Expanda o servidor de métricas no kube-system nome do kube-system :

 kubectl create -f ./metrics-server 

Após 1 minuto, o metric-server começará a transmitir dados sobre o uso da CPU e da memória por nós e pods.

Exibir métricas do nó:

 kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes" | jq . 

Veja os indicadores de frequência cardíaca:

 kubectl get --raw "/apis/metrics.k8s.io/v1beta1/pods" | jq . 

2. Escalonamento automático baseado no uso da CPU e da memória


Para testar o dimensionamento automático horizontal da lareira (HPA), você pode usar um pequeno aplicativo Web baseado em Golang.

Expanda podinfo no espaço para nome default :

 kubectl create -f ./podinfo/podinfo-svc.yaml,./podinfo/podinfo-dep.yaml 

Entre em podinfo com o podinfo usando o serviço NodePort em http://<K8S_PUBLIC_IP>:31198 .

Especifique um HPA que atenda a pelo menos duas réplicas e dimensione para dez réplicas se a utilização média da CPU exceder 80% ou se o consumo de memória for superior a 200 MiB:

 apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: podinfo spec: scaleTargetRef: apiVersion: extensions/v1beta1 kind: Deployment name: podinfo minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu targetAverageUtilization: 80 - type: Resource resource: name: memory targetAverageValue: 200Mi 

Crie HPA:

 kubectl create -f ./podinfo/podinfo-hpa.yaml 

Após alguns segundos, o controlador HPA entrará em contato com o servidor métrico e receberá informações sobre o uso da CPU e da memória:

 kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE podinfo Deployment/podinfo 2826240 / 200Mi, 15% / 80% 2 10 2 5m 

Para aumentar o uso da CPU, faça um teste de carga com rakyll / hey:

 #install hey go get -u github.com/rakyll/hey #do 10K requests hey -n 10000 -q 10 -c 5 http://<K8S_PUBLIC_IP>:31198/ 

Você pode monitorar eventos HPA da seguinte maneira:

 $ kubectl describe hpa Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulRescale 7m horizontal-pod-autoscaler New size: 4; reason: cpu resource utilization (percentage of request) above target Normal SuccessfulRescale 3m horizontal-pod-autoscaler New size: 8; reason: cpu resource utilization (percentage of request) above target 

Remova o podinfo temporariamente (você precisará reimplementá-lo em uma das próximas etapas deste guia).

 kubectl delete -f ./podinfo/podinfo-hpa.yaml,./podinfo/podinfo-dep.yaml,./podinfo/podinfo-svc.yaml 

3. Configuração do servidor de métricas personalizadas


Para dimensionar com base em métricas personalizadas, são necessários dois componentes. O primeiro - o banco de dados de séries temporais do Prometheus - coleta métricas de aplicativos e as salva. O segundo componente, o k8s-prometheus-adapter , complementa o Kubernetes da API Custom Metrics com métricas fornecidas pelo construtor.



Um espaço para nome dedicado é usado para implantar o Prometheus e o adaptador.

Crie um espaço para nome de monitoring :

 kubectl create -f ./namespaces.yaml 

Expanda Prometheus v2 no namespace de monitoring :

 kubectl create -f ./prometheus 

Gere os certificados TLS necessários para o adaptador Prometheus:

 make certs 

Implemente o adaptador Prometheus para a API de métricas personalizadas:

 kubectl create -f ./custom-metrics-api 

Obtenha uma lista de métricas especiais fornecidas pelo Prometheus:

 kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq . 

Em seguida, extraia os dados de uso do sistema de arquivos para todos os pods no namespace de monitoring :

 kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/monitoring/pods/*/fs_usage_bytes" | jq . 

4. Escalonamento automático com base em métricas personalizadas


Crie o serviço podinfo do podinfo e implemente no espaço para nome default :

 kubectl create -f ./podinfo/podinfo-svc.yaml,./podinfo/podinfo-dep.yaml 

O aplicativo podinfo passará a métrica especial http_requests_total . O adaptador Prometheus removerá o sufixo _total e marcará essa métrica como um contador.

Obtenha o número total de consultas por segundo na API de métricas personalizadas:

 kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/http_requests" | jq . { "kind": "MetricValueList", "apiVersion": "custom.metrics.k8s.io/v1beta1", "metadata": { "selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/%2A/http_requests" }, "items": [ { "describedObject": { "kind": "Pod", "namespace": "default", "name": "podinfo-6b86c8ccc9-kv5g9", "apiVersion": "/__internal" }, "metricName": "http_requests", "timestamp": "2018-01-10T16:49:07Z", "value": "901m" }, { "describedObject": { "kind": "Pod", "namespace": "default", "name": "podinfo-6b86c8ccc9-nm7bl", "apiVersion": "/__internal" }, "metricName": "http_requests", "timestamp": "2018-01-10T16:49:07Z", "value": "898m" } ] } 

A letra m significa milli-units , portanto, por exemplo, 901m é 901 milissegundo.

Crie um HPA que expandirá a implantação do podinfo se o número de solicitações exceder 10 solicitações por segundo:

 apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: podinfo spec: scaleTargetRef: apiVersion: extensions/v1beta1 kind: Deployment name: podinfo minReplicas: 2 maxReplicas: 10 metrics: - type: Pods pods: metricName: http_requests targetAverageValue: 10 

Expanda HPA podinfo no espaço para nome default :

 kubectl create -f ./podinfo/podinfo-hpa-custom.yaml 

Após alguns segundos, o HPA obterá o valor http_requests da API de métricas:

 kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE podinfo Deployment/podinfo 899m / 10 2 10 2 1m 

Aplique a carga para o serviço podinfo com 25 solicitações por segundo:

 #install hey go get -u github.com/rakyll/hey #do 10K requests rate limited at 25 QPS hey -n 10000 -q 5 -c 5 http://<K8S-IP>:31198/healthz 

Após alguns minutos, o HPA começará a dimensionar a implantação:

 kubectl describe hpa Name: podinfo Namespace: default Reference: Deployment/podinfo Metrics: ( current / target ) "http_requests" on pods: 9059m / 10< Min replicas: 2 Max replicas: 10 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulRescale 2m horizontal-pod-autoscaler New size: 3; reason: pods metric http_requests above target 

Com o número atual de solicitações por segundo, a implantação nunca alcançará um máximo de 10 pods. Três réplicas são suficientes para garantir que o número de solicitações por segundo para cada pod seja menor que 10.

Após a conclusão dos testes de carga, o HPA reduzirá a escala de implantação para o número inicial de réplicas:

 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulRescale 5m horizontal-pod-autoscaler New size: 3; reason: pods metric http_requests above target Normal SuccessfulRescale 21s horizontal-pod-autoscaler New size: 2; reason: All metrics below target 

Você deve ter notado que o redimensionador automático não responde imediatamente a alterações nas métricas. Por padrão, eles são sincronizados a cada 30 segundos. Além disso, a escala ocorre apenas se não houver um aumento ou diminuição nas cargas de trabalho durante os últimos 3-5 minutos. Isso ajuda a evitar decisões conflitantes e deixa tempo para conectar o auto-scaler do cluster.

Conclusão


Nem todos os sistemas podem impor a conformidade com o SLA com base apenas na utilização da CPU ou da memória (ou ambas). A maioria dos servidores da Web e servidores móveis para lidar com picos de tráfego precisa de dimensionamento automático com base no número de solicitações por segundo.

Para aplicativos ETL (do Eng. Extract Transform Load - “extração, transformação, carregamento”), o dimensionamento automático pode ser acionado, por exemplo, quando o comprimento limite especificado da fila de trabalhos é excedido.

Em todos os casos, instrumentar aplicativos usando o Prometheus e destacar os indicadores necessários para o dimensionamento automático permitem ajustar aplicativos para melhorar o processamento de picos de tráfego e garantir alta disponibilidade da infraestrutura.

Ideias, perguntas, comentários? Participe da discussão no Slack !

Aqui está esse material. Estamos aguardando seus comentários e até o curso !

Source: https://habr.com/ru/post/pt457742/


All Articles