云原生API网关作为流量入口,对业务流量大小具有最明显的感知,结合K8s的能力与云原生API网关统计的QPS指标,业务应用能够基于业务Pod上的QPS进行弹性伸缩,使后端业务能够按需扩展。本文介绍ACK业务如何应用网关访问日志进行弹性伸缩。
前提条件
操作步骤
在容器服务ACK中部署如下资源。
登录容器服务管理控制台,在左侧导航栏选择 。
在搜索框输入ack-alibaba-cloud-metrics-adapter,单击应用卡片,在详情页右上角单击一键部署。在创建面板进行相关配置,然后单击确定。
在左侧导航选择无状态,单击使用YAML创建资源。选择模板为自定义并使用如下YAML,然后单击创建。
apiVersion: apps/v1 kind: Deployment metadata: name: httpbin-deploy labels: app: httpbin-deploy spec: replicas: 1 selector: matchLabels: app: httpbin template: metadata: labels: app: httpbin spec: containers: - image: kennethreitz/httpbin imagePullPolicy: IfNotPresent name: httpbin ports: - name: http containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: httpbin-svc namespace: default labels: app: httpbin-svc spec: ports: - port: 8080 name: http protocol: TCP targetPort: 80 selector: app: httpbin type: ClusterIP
在云原生API网关中添加服务来源并创建服务。
登录云原生API网关控制台。
在左侧导航栏,选择实例,并在顶部菜单栏选择地域。
在实例页面,单击目标网关实例名称。
在左侧导航栏,选择服务,并单击来源页签。
单击创建来源,选择来源类型为容器服务,并选择已部署应用的ACK集群,然后单击确定。
在左侧导航栏,选择服务,并单击服务页签。
单击创建服务,将创建的服务来源添加到服务列表中,然后单击确定。
创建HTTP API并为其创建路由。具体操作,请参见创建HTTP API,创建路由。
开启日志投递服务。
在左侧导航栏,单击参数配置。
在可观测性参数区域,单击日志投递右侧的图标,在对话框中开启日志投递和兼容 Nginx Ingress选项。
在ACK集群中创建HorizontalPodAutoscaler,并进行相关设置。
包括需要进行弹性伸缩的后端业务应用、弹性伸缩时最小副本数、弹性伸缩时最大副本数、弹性伸缩依据的指标等。示例如下,其中sls.project值为网关控制台参数配置页面显示的日志投递的project名称,sls.ingress.route格式为
<服务命名空间>-<服务名称>-<服务端口号>
。在该示例中,设置当服务Pod平均QPS大于10时进行扩容。apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: higress-hpa spec: scaleTargetRef: apiVersion: apps/v1beta2 kind: Deployment name: httpbin-deploy minReplicas: 1 maxReplicas: 10 metrics: - type: External external: metric: name: sls_ingress_qps selector: matchLabels: sls.project: "aliyun-product-data-xxxxxxxxxxxxx-cn-hangzhou" sls.logstore: "nginx-ingress" sls.ingress.route: "default-httpbin-svc-8080" target: type: AverageValue averageValue: 10
控制QPS通过网关路由对业务应用进行压测,观察HPA的事件进行验证。
使用如下命令进行验证。
kubectl describe hpa higress-hpa
输出如下。
Normal SuccessfulRescale 9m horizontal-pod-autoscaler New size: 3; reason: external metric sls_ingress_qps(&LabelSelector{MatchLabels:map[string]string{sls.ingress.route: default-httpbin-svc-8080,sls.logstore: nginx-ingress,sls.project: aliyun-product-data-xxxxxxxxxxxxxxxx-cn-hangzhou,},MatchExpressions:[]LabelSelectorRequirement{},}) above target Normal SuccessfulRescale 8m45s horizontal-pod-autoscaler New size: 4; reason: external metric sls_ingress_qps(&LabelSelector{MatchLabels:map[string]string{sls.ingress.route: default-httpbin-svc-8080,sls.logstore: nginx-ingress,sls.project: aliyun-product-data-xxxxxxxxxxxxxxxx-cn-hangzhou,},MatchExpressions:[]LabelSelectorRequirement{},}) above target Normal SuccessfulRescale 5m12s horizontal-pod-autoscaler New size: 4; reason: Normal SuccessfulRescale 3m41s horizontal-pod-autoscaler New size: 3; reason: All metrics below target Normal SuccessfulRescale 2m55s horizontal-pod-autoscaler New size: 1; reason: All metrics below target