如果您的应用需要根据单位时间内收到的请求数量动态地调整计算资源总量,您可以使用ALB实例统计的QPS数据为应用的Pod设置弹性伸缩。
阅读前提示
阅读本文前,推荐您阅读创建ALB Ingress了解ALB Ingress的基础使用方法。
工作原理
QPS(Queries Per Second)指的是每秒钟收到的请求数量。ALB实例可以通过日志服务记录客户端的访问数据。HPA(Horizontal Pod Autoscaler)可以根据访问记录,对Service的QPS数据进行观测,并对相应的工作负载(Deployment、StatefulSet等)进行扩缩容。
前提条件
已安装alibaba-cloud-metrics-adapter组件,且版本为2.3.0及以上。具体操作,请参见部署alibaba-cloud-metrics-adapter组件。
已安装压力测试工具Apache Benchmark。具体操作,请参见官方文档Compiling and Installing。
已通过kubectl工具连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
已创建两个不同可用区的交换机,并且与集群处于同一VPC。具体操作,请参见创建和管理交换机。
步骤一:创建AlbConfig并关联日志Project
查看集群关联的日志Project。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择集群信息。
在集群资源页签下,找到日志服务 Project资源,记录右侧的日志Project名称。
创建AlbConfig。
创建并拷贝以下内容到alb-qps.yaml中,并在
accessLogConfig
字段中填入日志Project相关的信息。apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-qps spec: config: name: alb-qps addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # 虚拟交换机的ID - vSwitchId: vsw-uf6nun9tql5t8nh15**** accessLogConfig: logProject: <LOG_PROJECT> # 集群关联的日志项目名称 logStore: <LOG_STORE> # 自定义日志库名称,必须以“alb_“开头 listeners: - port: 80 protocol: HTTP
字段说明如下:
字段
取值类型
说明
logProject
string
SLS日志项目的名称。
默认值:
""
。logStore
string
SLS日志库的名称,必须以
alb_
开头。如果不存在此日志库,则会自动创建。SLS日志库的配置示例,请参见开启日志服务访问日志。默认值:
""
。执行以下命令,创建AlbConfig。
kubectl apply -f alb-qps.yaml
预期输出:
albconfig.alibabacloud.com/alb-qps created
步骤二:创建示例资源
除了AlbConfig外,ALB Ingress还需要Deployment、Service、IngressClass、Ingress这4种资源才能正常工作,您可以使用以下的示例快速创建这4种资源。
使用以下内容,创建qps-quickstart.yaml。
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: qps-ingressclass spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-qps # 与AlbConfig的名称一致 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: qps-ingress spec: ingressClassName: qps-ingressclass # 与Ingress Class的名称一致 rules: - host: demo.alb.ingress.top # 替换为您的域名 http: paths: - path: /qps pathType: Prefix backend: service: name: qps-svc port: number: 80 --- apiVersion: v1 kind: Service metadata: name: qps-svc namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: qps-deploy type: NodePort --- apiVersion: apps/v1 kind: Deployment metadata: name: qps-deploy labels: app: qps-deploy spec: replicas: 2 selector: matchLabels: app: qps-deploy template: metadata: labels: app: qps-deploy spec: containers: - name: qps-container image: nginx:1.7.9 ports: - containerPort: 80
执行以下命令,创建示例资源。
kubectl apply -f qps-quickstart.yaml
步骤三:创建HPA
创建qps-hpa.yaml文件,并将以下内容拷贝到该文件中并保存。
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: qps-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: qps-deploy # HPA所控制的工作负载的名称 minReplicas: 2 # 最低Pod数量 maxReplicas: 10 # 最高Pod数量 metrics: - type: External external: metric: name: sls_alb_ingress_qps # QPS数据的指标名称,请勿修改 selector: matchLabels: sls.project: <LOG_PROJECT> # 集群关联的日志项目名称 sls.logstore: <LOG_STORE> # 自定义日志库名称 sls.ingress.route: default-qps-svc-80 # Service的路径,参数的格式为<namespace>-<svc>-<port> target: type: AverageValue averageValue: 2 # 指标的预期目标,示例中是所有Pod的平均QPS为2
字段说明如下:
字段
说明
scaleTargetRef
应用所使用的工作负载。示例中使用的是步骤一中创建的名为qps-deployment的Deployment。
minReplicas
该Deployment可缩容的容器数量下限。该值需要设置为大于等于1的整数。
maxRaplicas
该Deployment可扩容的容器数量上限。该值需要大于最小副本数。
external.metric.name
HPA基于的QPS数据的指标,请勿修改。
sls.project
指标所基于的日志项目,与AlbConfig中的内容保持一致。
sls.logstore
指标所基于的日志库,与AlbConfig中的内容保持一致。
sls.ingress.route
Service的路径,格式为<namespace>-<svc>-<port>,示例中为步骤一中创建的名为qps-svc的Service。
external.target
指标的预期目标,本示例中所有Pod的平均QPS为2。HPA会控制Pod的数量,使QPS尽可能接近预期目标。
执行以下命令,创建HPA。
kubectl apply -f qps-hpa.yaml
执行以下命令,查看HPA部署情况。
kubectl get hpa
预期输出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE qps-hpa Deployment/qps-deploy 0/2 (avg) 2 10 2 5m41s
执行以下命令,查看HPA配置信息。
kubectl describe hpa qps-hpa
预期输出:
Name: qps-hpa Namespace: default Labels: <none> Annotations: <none> CreationTimestamp: ******** # HPA的时间戳,可忽略 Reference: Deployment/qps-deployment Metrics: ( current / target ) "sls_alb_ingress_qps" (target average value): 0 / 2 Min replicas: 2 Max replicas: 10 Deployment pods: 2 current / 2 desired
(可选)步骤四:效果验证
验证应用扩容。
执行以下命令,查看Ingress信息。
kubectl get ingress
预期输出:
NAME CLASS HOSTS ADDRESS PORTS AGE qps-ingress qps-ingressclass demo.alb.ingress.top alb-********.alb.aliyuncs.com 80 10m31s
记录下
HOSTS
与ADDRESS
部分的值,以便后续步骤使用。执行以下命令,对应用进行压测。其中的
demo.alb.ingress.top
与alb-********.alb.aliyuncs.com
请替换为在上一步中得到的值。ab -r -c 5 -n 10000 -H Host:demo.alb.ingress.top http://alb-********.alb.aliyuncs.com/qps
执行以下命令,查看应用的伸缩情况。
kubectl get hpa
预期输出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE qps-hpa Deployment/qps-deploy 14375m/2 (avg) 2 10 10 15m
返回结果中
REPLICAS
为10,表明随着QPS数据增大,应用的Pod扩容到10个。
验证应用缩容。
压力测试结束后,执行以下命令,查看应用的伸缩情况。
kubectl get hpa
预期输出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE qps-hpa Deployment/qps-deploy 0/2 (avg) 2 10 2 28m
返回结果中
REPLICAS
为2,表明QPS数据下降到0后,应用缩容到2个Pod。
相关文档
如果需要基于Pod的CPU或内存负载对应用扩缩容,请参见容器水平伸缩(HPA)。
如果需要定时对应用扩缩容,请参见容器定时水平伸缩(CronHPA)。
节点的弹性伸缩,请参见节点伸缩概述。