容器服务支持通过事件驱动的弹性伸缩器组件(KEDA),实现工作负载的弹性伸缩,帮助用户降低使用成本。本文介绍如何基于 API 网关的网络指标,实现工作负载的弹性伸缩。
KEDA 为容器服务 VKE 支持的事件驱动弹性伸缩组件,支持对接多数据源和从 0 伸缩的能力。能够使用 API 网关提供的网络请求指标,实现工作负载缩容到 0 或从 0 扩容,从而有效降低客户业务的闲时用云成本,增强弹性能力,提高产品竞争力。
在集群中部署应用和服务,本文以 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,本文中以域名example.com
为例。详细操作方式,请参见 通过控制台创建 APIG Ingress。
注意
APIG 实例和 VKE 必须绑定同一个 VMP 工作区。
apiVersion: v1 kind: Secret metadata: name: keda-prom-secret namespace: default data: username: "YWRtaW4=" # Base64 编码后的 VMP 工作区用户名。例如本例中,"YWRtaW4="表示 admin password: "YWRtaW4xMjM0" # Base64 编码后的 VMP 工作区密码。例如本例中,"YWRtaW4xMjM0"表示 admin1234
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
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
在监控大盘中可以看到,工作负载创建时配置为 2 个副本,KEDA 弹性伸缩对象创建后,工作负载对应的弹性伸缩指标为 0,所以副本数被调整为 KEDA 弹性伸缩对象 ScaledObject 中idleReplicaCount
的值,即自动缩容为 0。
使用如下命令,通过 APIG Ingress 访问集群中的应用。其中,http://14.***.***.***
为 APIG 实例的外部 IP 地址。获取方式,请参见 获取网关地址。
curl -H "Host: example.com" http://14.***.***.***
预期结果如下,由于后端工作负载的副本数为 0,因此无法访问到对应的应用,系统显示后端错误。
no healthy upstream
同时,在 APIG 控制台或 VMP 控制台查看观测大盘或对应指标,均可见请求数量指标。
当集群中的 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,从而有效降低客户业务的闲时用云成本。
查看弹性伸缩监控大盘,可以看到工作负载扩容和缩容的监控信息。