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

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

前提条件

操作步骤

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

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

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

      ack-alibaba-cloud-metrics-adapter.png

    3. 在左侧导航栏选择集群

    4. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

    5. 无状态页面,单击使用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. 在MSE网关中添加服务来源并创建服务。

    1. 登录MSE网关管理控制台,并在顶部菜单栏选择地域。

    2. 在左侧导航栏,选择云原生网关 > 网关列表,单击目标网关名称。

    3. 在左侧导航栏,选择路由管理,然后选择来源页签。

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

    5. 在左侧导航栏,选择路由管理,然后选择服务页签。

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

  3. 为已创建服务添加路由。具体操作,请参见创建路由

  4. 开启日志投递服务。

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

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

      日志投递开启.png

  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