概述
云原生网关提供了丰富的 Prometheus 监控指标,本文将以指定服务的 QPS 指标为例,介绍如何在 TKE 上利用 KEDA 实现基于云原生 API 网关监控指标的水平伸缩。
操作步骤
配置 Prometheus 采集
您可以选择使用腾讯云 Prometheus,也可以使用自建 Prometheus 来采集云原生 API 网关的监控数据,在 云原生 API 网关 - 可观测性 页面选择使用的网关实例,并切换到 Prometheus 页面。
如果您使用腾讯云 Prometheus 服务,可以直接关联腾讯云 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 服务中选择部署了测试应用的集群、命名空间以及服务。如下图所示:
创建完成后,单击服务名称,进入服务的路由管理页面。在路由管理页面单击新建。如下图所示:
在新建路由页面,根据需要配置路由。如下图所示:
配置完成后,您可以通过云原生网关访问 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 的方式来配置,在 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 端口>
。