基于云原生 API 网关监控指标的水平伸缩

最近更新时间:2024-05-24 15:17:01

我的收藏

概述

云原生 API 网关 是腾讯云上基于 Kong 托管的网关产品,提供丰富的七层流量管理功能,也支持将请求转发到 TKE 集群上的服务。
云原生网关提供了丰富的 Prometheus 监控指标,本文将以指定服务的 QPS 指标为例,介绍如何在 TKE 上利用 KEDA 实现基于云原生 API 网关监控指标的水平伸缩。

操作步骤

配置 Prometheus 采集

您可以选择使用腾讯云 Prometheus,也可以使用自建 Prometheus 来采集云原生 API 网关的监控数据,在 云原生 API 网关 - 可观测性 页面选择使用的网关实例,并切换到 Prometheus 页面。
如果您使用腾讯云 Prometheus 服务,可以直接关联腾讯云 Prometheus,如果是自建的 Prometheus,可以在配置自建 Prometheus 下查看网关节点的内网地址列表。如下图所示:


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




部署测试应用到 TKE 集群

您可以参考以下代码部署一个简单的 nginx 应用到 TKE 集群:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest

---

apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
type: ClusterIP
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx

配置云原生 API 网关

云原生 API 网关 - 路由管理 页面新建服务来源。如下图所示:



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



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



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



创建完成后,单击服务名称,进入服务的路由管理页面。在路由管理页面单击新建。如下图所示:



在新建路由页面,根据需要配置路由。如下图所示:



配置完成后,您可以通过云原生网关访问 TKE 集群中的服务,压测一段时间后,观察 Prometheus 中的监控数据是否正常。

配置 KEDA ScaledObject

在安装了 KEDA 的前提下,您可以创建类似以下的 ScaledObject
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: nginx-scaledobject
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
pollingInterval: 15
minReplicaCount: 1
maxReplicaCount: 100
advanced:
horizontalPodAutoscalerConfig:
behavior:
scaleUp:
policies:
- periodSeconds: 15
type: Percent
value: 900
triggers:
- type: prometheus
metadata:
serverAddress: http://monitoring-kube-prometheus-prometheus.monitoring.svc.cluster.local:9090
query: |
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/v1
kind: Ingress
metadata:
name: nginx
spec:
ingressClassName: kong
rules:
- host: "example.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
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 端口>