ALB Ingress支持根据ALB后端统计的QPS数据进行应用的自动扩容和缩容,保障应用的稳定性以及达到更好的成本控制。本文介绍如何通过ALB Ingress实现基于QPS数据的应用弹性伸缩。
前提条件
已安装alibaba-cloud-metrics-adapter组件,且版本为2.3.0及以上。具体操作,请参见基于阿里云组件指标的容器水平伸缩。
已安装ALB Ingress Controller组件。具体操作,请参见管理ALB Ingress Controller组件。
已安装压力测试工具Apache Benchmark。更多信息,请参见Apache Benchmark。
已在日志服务中创建Project。具体操作,请参见管理Project。
已创建两个不同可用区的交换机,且与集群处于同一VPC。具体操作,请参见创建和管理交换机。
操作流程
步骤一:创建应用和Service
使用以下内容,创建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
执行以下命令,创建测试应用tea和Service。
kubectl apply -f tea.yaml
步骤二:创建ALB Ingress
创建ALBConfig。
使用以下内容,创建alb-test.yaml。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-demo spec: config: name: alb-test addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** - vSwitchId: vsw-uf6nun9tql5t8nh15**** accessLogConfig: logProject: "****" logStore: "alb_****" listeners: - port: 80 protocol: HTTP
zoneMappings:设置ALB Ingress交换机ID,您需要至少指定两个不同可用区交换机ID,且与集群处于同一VPC。
logProject:设置Project名称。
logStore:设置Logstore名称。logStore命名需要以alb_开头,若指定logStore不存在,系统将会自动创建。
执行以下命令,创建ALBConfig。
kubectl apply -f alb-test.yaml
创建IngressClass。
使用以下内容,创建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
执行以下命令,创建IngressClass。
kubectl apply -f alb.yaml
创建ALB Ingress。
使用以下内容,创建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
执行以下命令,创建ALB Ingress。
kubectl apply -f tea-ingress.yaml
执行以下命令,获取ALB Ingress的
ADDRESS
。kubectl get ingress
预期输出:
NAME CLASS HOSTS ADDRESS PORTS AGE tea-ingress alb demo.ingress.top alb-110zvs5nhsvfv*****.cn-chengdu.alb.aliyuncs.com 80 7m5s
步骤三:创建HPA
使用以下内容,创建hpa.yaml。
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: ingress-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment-basic minReplicas: 2 maxReplicas: 10 metrics: - type: External external: metric: name: sls_alb_ingress_qps # sls_alb_ingress_qps是本文实现伸缩使用的指标,表示基于QPS数据实现弹性伸缩。 selector: matchLabels: sls.project: "****" # 替换sls.project值为真实值。 sls.logstore: "alb_****" # 替换sls.logstore值为真实值。 sls.ingress.route: "default-tea-svc-80" # sls.ingress.route参数的格式为<namespace>-<svc>-<port>,例如default-nginx-80。 target: type: AverageValue # type为AverageValue表示QPS要除以Pod的数目进行判断。 averageValue: 2
执行以下命令,创建HPA。
kubectl apply -f hpa.yaml
执行以下命令,查看HPA部署情况。
kubectl get hpa
预期输出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE ingress-hpa Deployment/nginx-deployment-basic 0/2 (avg) 2 10 2 4h34m
执行以下命令,查看HPA配置信息。
kubectl describe hpa ingress-hpa
预期输出:
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
步骤四:验证应用是否随着QPS数据自动扩缩容
验证应用是否随着QPS数据扩容。
执行以下命令,对应用进行压测。
ab -c 5 -n 5000 -H Host:demo.ingress.top http://alb-110zvs5nhsvfv*****.cn-chengdu.alb.aliyuncs.com/tea
执行以下命令,查看应用伸缩情况。
kubectl get hpa
预期输出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE ingress-hpa Deployment/nginx-deployment-basic 12500m/2 (avg) 2 10 10 15m
返回结果中
REPLICAS
为10,表明随着QPS数据增大,应用的Pod扩容到10个。
验证应用是否随着QPS数据缩容。
QPS数据在压测停止后会下降为0,低于测试阈值,HPA会缩容。
待压测停止后,执行以下命令,查看应用伸缩情况。
kubectl get hpa
预期输出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE ingress-hpa Deployment/nginx-deployment-basic 0/2 (avg) 2 10 2 60m
返回结果中
REPLICAS
为2,表明随着QPS数据减少,应用的Pod缩容到2个。