概述
云原生网关提供了丰富的 Prometheus 监控指标,本文将以指定服务的 QPS 指标为例,介绍如何在 TKE 上利用 KEDA 实现基于云原生 API 网关监控指标的水平伸缩。
操作步骤
配置 Prometheus 采集
您需要使用腾讯云 Prometheus 来采集云原生 API 网关的监控数据,在云原生 API 网关实例的数据观测页面切换到 Prometheus 标签页:

选择关联腾讯云 Prometheus。复制 Prometheus 实例内网地址 IP,通过
static_configs
配置到自建 Prometheus 的采集配置中。代码示例如下:- job_name: apigwhonor_timestamps: truemetrics_path: "/metrics"scheme: httpstatic_configs:- targets: ["10.10.12.23:2100", "10.10.12.144:2100"]
说明:
云原生 API 网关的 metrics 接口地址是:
节点IP:2100/metrics
。如果正常采集,您可以在 Prometheus 中查到以
kong_
开头的监控指标。如下图所示:

部署测试应用到 TKE 集群
您可以参考以下代码部署一个简单的 nginx 应用到 TKE 集群:
apiVersion: apps/v1kind: Deploymentmetadata:name: nginxspec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latest---apiVersion: v1kind: Servicemetadata:name: nginxlabels:app: nginxspec:type: ClusterIPports:- port: 80protocol: TCPtargetPort: 80selector:app: nginx
配置云原生 API 网关
在服务路由中新建服务来源。如下图所示:

根据您的需求添加容器服务的集群。如下图所示:


在服务路由中新建服务。如下图所示:

新建服务时,从 K8S 服务中选择部署了测试应用的集群、命名空间以及服务。如下图所示:


创建完成后,通过导入路由方式创建路由:

根据需求配置规则,详情参考云原生 API 网关的文档。
配置完成后,您可以通过云原生网关访问 TKE 集群中的服务,压测一段时间后,观察
Prometheus
中的监控数据是否正常。配置 KEDA ScaledObject
在安装了 KEDA 的前提下,您可以创建类似以下的
ScaledObject
:apiVersion: keda.sh/v1alpha1kind: ScaledObjectmetadata:name: nginx-scaledobjectspec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: nginxpollingInterval: 15minReplicaCount: 1maxReplicaCount: 100advanced:horizontalPodAutoscalerConfig:behavior:scaleUp:policies:- periodSeconds: 15type: Percentvalue: 900triggers:- type: prometheusmetadata:serverAddress: http://monitoring-kube-prometheus-prometheus.monitoring.svc.cluster.local:9090query: |sum(irate(kong_http_status{service="nginx"}[1m]))threshold: "300"
scaleTargetRef
中填写要被自动扩缩容的工作负载,这里是对 nginx
这个工作负载进行自动扩缩容。serverAddress
中填写 Prometheus
的地址,根据实际情况进行修改。query
中填写查询指标数据的 PromQL,示例中是查 nginx
这个服务在云原生 API 网关中的 QPS 值。threshold
表示扩缩容阈值,300 表示每个 nginx
pod 平均承受 300 QPS 的阈值,实际的平均 QPS 与这个阈值比较来进行相应的扩缩容操作。配置 Ingress
云原生 API 网关除了能在控制台配置路由,还可以通过 Ingress 的方式来配置,在云原生 API 网关实例的 Ingress 页面关联
Kong Ingress Controller
到容器集群后,就可以在集群里直接创建 Ingress 来配置规则了,示例如下:apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: nginxspec:ingressClassName: kongrules:- host: "example.com"http:paths:- path: /pathType: Prefixbackend:service:name: nginxport:number: 80
说明:
ingressClassName
要指定 Kong Ingress Controller
所使用的 IngressClass。然后在 KEDA 的
ScaledObject
里,请根据实际情况修改 PromQL 查询语句写法:sum(irate(kong_http_status{service="test.nginx.pnum-80"}[1m]))
说明:
service
的格式为 <Ingress 所在命名空间>.<引用的 Service 名称>.pnum-<Service 端口>
。