Se sua aplicação precisar ajustar dinamicamente os recursos computacionais conforme o volume de requisições, use as métricas de QPS do ALB Ingress no Log Service para dimensionar automaticamente os pods da aplicação com HPA.
Pré-requisitos
Certifique-se de que:
O alibaba-cloud-metrics-adapter esteja instalado na versão 2.3.0 ou superior.
O controlador do ALB Ingress esteja instalado.
O Apache Benchmark esteja instalado.
Um projeto do Log Service tenha sido criado.
Dois vSwitches estejam implantados em zonas diferentes da Virtual Private Cloud (VPC) onde seu cluster está localizado.
Como funciona
Crie um Deployment e um Service para sua aplicação.
Configure um ALB Ingress para rotear o tráfego externo para o Service.
Defina um Horizontal Pod Autoscaler (HPA) que monitore a métrica
sls_alb_ingress_qpsdo Log Service.Quando o QPS ultrapassar o limiar definido por pod, o HPA expandirá o Deployment. Se o QPS diminuir, o HPA reduzirá a escala automaticamente.
Etapa 1: Crie uma aplicação e um Service
-
Crie um arquivo chamado
tea.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-basic labels: app: tea spec: replicas: 2 selector: matchLabels: app: tea template: metadata: labels: app: tea spec: containers: - name: tea image: nginx:1.7.9 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: tea-svc namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: tea type: NodePort -
Aplique o manifesto:
kubectl apply -f tea.yaml
Etapa 2: Crie um ALB Ingress
Crie um objeto AlbConfig
-
Localize o projeto do Log Service associado ao seu cluster. No console ACK, abra a página de detalhes do cluster, selecione a aba Cluster Information, encontre Log Service Project e anote o nome do projeto. Crie um arquivo chamado
alb-test.yaml:Campo
Descrição
zoneMappingsPelo menos dois IDs de vSwitch de zonas distintas na mesma VPC.
logProjectNome do projeto do Log Service.
logStoreNome do Logstore. Deve começar com
alb_. Será criado automaticamente caso não exista.apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-demo spec: config: name: alb-test addressType: Internet # Internet-facing ALB zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # Replace with your first vSwitch ID - vSwitchId: vsw-uf6nun9tql5t8nh15**** # Replace with your second vSwitch ID (different zone) accessLogConfig: logProject: "****" # Replace with your Log Service project name logStore: "alb_****" # Replace with your Logstore name; must start with alb_ -
Aplique o manifesto:
kubectl apply -f alb-test.yaml
Crie um IngressClass
-
Crie um arquivo chamado
alb.yaml:apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-demo # Must match the AlbConfig metadata.name above -
Aplique o manifesto:
kubectl apply -f alb.yaml
Crie o Ingress
-
Crie um arquivo chamado
tea-ingress.yaml:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tea-ingress spec: ingressClassName: alb rules: - host: demo.ingress.top http: paths: - path: /tea pathType: Prefix backend: service: name: tea-svc port: number: 80 -
Aplique o manifesto:
kubectl apply -f tea-ingress.yaml -
Obtenha o endereço do ALB atribuído ao Ingress:
kubectl get ingressSaída esperada:
NAME CLASS HOSTS ADDRESS PORTS AGE tea-ingress alb demo.ingress.top alb-110zvs5nhsvfv*****.cn-chengdu.alb.aliyuncs.com 80 7m5sAnote o valor de
ADDRESSpara usar no teste de carga da Etapa 4.
Etapa 3: Crie um HPA
-
Crie um arquivo chamado
hpa.yaml:apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: ingress-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment-basic # The Deployment to scale minReplicas: 2 # Minimum number of pods maxReplicas: 10 # Maximum number of pods metrics: - type: External external: metric: name: sls_alb_ingress_qps # ALB QPS metric from Log Service selector: matchLabels: sls.project: "****" # Replace with your Log Service project name sls.logstore: "alb_****" # Replace with your Logstore name sls.ingress.route: "default-tea-svc-80" # Format: <namespace>-<service-name>-<port> # Example: default-nginx-80 target: type: AverageValue # Scale based on average QPS per pod averageValue: 2 # Scale out when average QPS per pod exceeds 2Este HPA dimensiona o
nginx-deployment-basicentre 2 e 10 pods. A expansão ocorre quando o QPS médio por pod supera 2; a redução acontece quando o QPS cai. -
Aplique o manifesto:
kubectl apply -f hpa.yaml -
Verifique se o HPA foi criado:
kubectl get hpaSaída esperada:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE ingress-hpa Deployment/nginx-deployment-basic 0/2 (avg) 2 10 2 4h34mO QPS está em
0porque ainda não há tráfego para a aplicação. A quantidade de pods encontra-se no mínimo (2). -
(Opcional) Inspecione os detalhes do HPA:
kubectl describe hpa ingress-hpaSaída esperada:
Name: ingress-hpa Namespace: default Labels: <none> Annotations: <none> CreationTimestamp: Tue, 31 Jan 2023 11:35:01 +0800 Reference: Deployment/nginx-deployment-basic Metrics: ( current / target ) "sls_alb_ingress_qps" (target average value): 0 / 2 Min replicas: 2 Max replicas: 10 Deployment pods: 2 current / 2 desired
Etapa 4: Verifique o dimensionamento automático
Verifique a expansão (scale-out)
-
Execute um teste de carga no endereço do ALB obtido na Etapa 2. Substitua o placeholder pelo seu endereço real.
ab -c 5 -n 5000 -H Host:demo.ingress.top http://alb-110zvs5nhsvfv*****.cn-chengdu.alb.aliyuncs.com/tea -
Durante a execução do teste, acompanhe o status do HPA em tempo real:
kubectl get hpa ingress-hpa --watchÀ medida que o QPS ultrapassa o limiar, o número de réplicas aumenta. Pressione Ctrl+C para interromper.
-
Após o teste de carga, confirme a expansão:
kubectl get hpaSaída esperada:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE ingress-hpa Deployment/nginx-deployment-basic 12500m/2 (avg) 2 10 10 15mO campo
REPLICASexibe10, confirmando que o Deployment atingiu a escala máxima.
Verifique a redução (scale-in)
Ao término do teste de carga, o QPS cai para 0 e o HPA reduz a escala do Deployment. Esse processo possui uma janela de estabilização de aproximadamente 5 minutos; portanto, aguarde antes de verificar.
kubectl get hpa
Saída esperada:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
ingress-hpa Deployment/nginx-deployment-basic 0/2 (avg) 2 10 2 60m
O valor de REPLICAS retornou para 2, confirmando a redução da escala do Deployment.
Próximos passos
Ajuste as políticas de expansão e redução configurando o campo
behaviorna especificação do HPA.Dimensione com base em outras métricas da Alibaba Cloud.