You need to enable JavaScript to run this app.
导航
使用 APIG 网络指标实现弹性伸缩
最近更新时间:2025.04.01 10:59:56首次发布时间:2025.04.01 10:59:56
我的收藏
有用
有用
无用
无用

容器服务支持通过事件驱动的弹性伸缩器组件(KEDA),实现工作负载的弹性伸缩,帮助用户降低使用成本。本文介绍如何基于 API 网关的网络指标,实现工作负载的弹性伸缩。

背景信息

KEDA 为容器服务 VKE 支持的事件驱动弹性伸缩组件,支持对接多数据源和从 0 伸缩的能力。能够使用 API 网关提供的网络请求指标,实现工作负载缩容到 0 或从 0 扩容,从而有效降低客户业务的闲时用云成本,增强弹性能力,提高产品竞争力。

前提条件

  • 已创建集群,且集群 Kubernetes 版本为 v1.24 及以上。详情请参见 创建集群
  • 已在集群中安装 keda 组件,详情请参见 安装组件
  • 已在集群中安装 apig-controller 组件,用于对接 API 网关产品。详情请参见 安装组件
  • 已创建 VMP 工作区,并开启 Basic Auth 认证。详情请参见 创建工作区
  • 集群已开启云原生观测,详情请参见 开启观测

操作步骤

步骤一:创建应用和服务

在集群中部署应用和服务,本文以 Nginx 为例,示例代码如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: doc-cn-beijing.cr.volces.com/vke/nginx-demo:v1.0
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
spec:
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  sessionAffinity: None
  type: ClusterIP

步骤二:创建 APIG Ingress

在集群中通过控制台创建 APIG Ingress,本文中以域名example.com为例。详细操作方式,请参见 通过控制台创建 APIG Ingress

步骤三:开启 APIG 实例观测

  1. 登录 API 网关控制台
  2. 在左侧导航栏选择 实例管理,在实例列表中,单击目标实例名称,进入实例详情页面。
  3. 选择 监控信息 页签,单击 立即绑定
    alt
  4. 在弹出的对话框中选择 VMP 工作区,单击 确定。开启 APIG 实例观测,并将监控数据保存在指定的 VMP 工作区中。
    alt

    注意

    APIG 实例和 VKE 必须绑定同一个 VMP 工作区。

步骤四:创建 KEDA 伸缩对象

  1. KEDA 组件安装后,需要使用 Secret 配置 VMP 工作区的 Basic Auth 认证信息,示例如下:
apiVersion: v1
kind: Secret
metadata:
  name: keda-prom-secret
  namespace: default
data:
  username: "YWRtaW4=" # Base64 编码后的 VMP 工作区用户名。例如本例中,"YWRtaW4="表示 admin
  password: "YWRtaW4xMjM0" # Base64 编码后的 VMP 工作区密码。例如本例中,"YWRtaW4xMjM0"表示 admin1234
  1. 为 KEDA 创建鉴权 CRD,用于 KEDA 访问 VMP 工作区。示例如下:
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
  name: keda-prom-creds
  namespace: default
spec:
  secretTargetRef:
    - parameter: username
      name: keda-prom-secret
      key: username
    - parameter: password
      name: keda-prom-secret
      key: password
  1. 创建 KEDA 弹性伸缩对象 ScaledObject,其中:
    • serverAddress为 VMP 工作区的 Query 地址,详情请参见 获取工作区地址
    • query为查询指标,本例中选择sum(rate(istio_requests_total[1m]))指标,即 APIG 请求总数。request_host表示与 APIG 关联的 APIG Ingress 对应的外部访问地址,本文中为example.com
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: apig-scaledobject
  namespace: default
spec:
  scaleTargetRef:
    name: nginx
  pollingInterval: 15
  # for keda trigger 0->1 关键定义
  idleReplicaCount: 0
  # 副本从 1 缩容到 0 的观察窗口期
  cooldownPeriod: 30
  # cooldownPeriod 首次创建之后触发的观察窗口期
  initialCooldownPeriod: 0
  # 最小副本数(HPA)
  minReplicaCount: 1
  # 最大副本数(HPA)
  maxReplicaCount: 2
  triggers:
    - type: prometheus
      metadata:
        serverAddress: http://query.prometheus-cn-beijing.ivolces.com/workspaces/5c0***
        threshold: '1'
        query: sum(rate(istio_requests_total{request_host="example.com"}[1m])) by (request_host)
        authModes: "basic"
      authenticationRef:
        name: keda-prom-creds

结果验证

验证工作负载缩容到 0

  1. 登录 容器服务控制台
  2. 单击左侧导航栏中的 集群
  3. 在集群列表页面,单击需要配置的目标集群。
  4. 在集群管理页面的左侧导航栏中,选择 监控中心 > 监控看板
  5. 在左侧看板列表中选择 工作负载监控 > 无状态负载监控,分别选择命名空间和工作负载后,即可查看指定工作负载的监控大盘。

在监控大盘中可以看到,工作负载创建时配置为 2 个副本,KEDA 弹性伸缩对象创建后,工作负载对应的弹性伸缩指标为 0,所以副本数被调整为 KEDA 弹性伸缩对象 ScaledObject 中idleReplicaCount的值,即自动缩容为 0。
alt

验证工作负载从 0 扩容

使用如下命令,通过 APIG Ingress 访问集群中的应用。其中,http://14.***.***.***为 APIG 实例的外部 IP 地址。获取方式,请参见 获取网关地址

curl -H "Host: example.com" http://14.***.***.***

预期结果如下,由于后端工作负载的副本数为 0,因此无法访问到对应的应用,系统显示后端错误。

no healthy upstream

同时,在 APIG 控制台或 VMP 控制台查看观测大盘或对应指标,均可见请求数量指标。
alt
alt

当集群中的 KEDA 监听到外部指标上升时,会对后端工作负载从 0 开始扩容。工作负载从 0 开始扩容到 Pod 可用的这段时间内,请求依然不会被响应,时间大约为 15~20 秒。

扩容完成后,使用如下命令,即可正常访问到集群中的应用。

curl -H "Host: example.com" http://14.***.***.***

预期结果如下,可以正常通过 APIG Ingress 访问到工作负载。

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

在外部请求结束后,工作负载又会被重新缩容到 0,从而有效降低客户业务的闲时用云成本。
alt

查看弹性伸缩监控大盘,可以看到工作负载扩容和缩容的监控信息。
alt