基于网关QPS实现后端ACK应用的弹性伸缩

云原生API网关作为流量入口,对业务流量大小具有最明显的感知,结合K8s的能力与云原生API网关统计的QPS指标,业务应用能够基于业务Pod上的QPS进行弹性伸缩,使后端业务能够按需扩展。本文介绍ACK业务如何应用网关访问日志进行弹性伸缩。

前提条件

操作步骤

  1. 在容器服务ACK中部署如下资源。

    1. 登录容器服务管理控制台,在左侧导航栏选择市场 > 应用市场

    2. 在搜索框输入ack-alibaba-cloud-metrics-adapter,单击应用卡片,在详情页右上角单击一键部署。在创建面板进行相关配置,然后单击确定

      image

    3. 在左侧导航选择无状态,单击使用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
  2. 在云原生API网关中添加服务来源并创建服务。

    1. 登录云原生API网关控制台

    2. 在左侧导航栏,选择实例,并在顶部菜单栏选择地域。

    3. 实例页面,单击目标网关实例名称。

    4. 在左侧导航栏,选择服务,并单击来源页签。

    5. 单击创建来源,选择来源类型容器服务,并选择已部署应用的ACK集群,然后单击确定

    6. 在左侧导航栏,选择服务,并单击服务页签。

    7. 单击创建服务,将创建的服务来源添加到服务列表中,然后单击确定

  3. 创建HTTP API并为其创建路由。具体操作,请参见创建HTTP API创建路由

  4. 开启日志投递服务。

    1. 在左侧导航栏,单击参数配置

    2. 可观测性参数区域,单击日志投递右侧的图标2.png图标,在对话框中开启日志投递和兼容 Nginx Ingress选项。

      image

  5. 在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
  6. 控制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