基于 CLB 监控指标的水平伸缩

最近更新时间:2025-08-13 17:42:11

我的收藏

业务场景

TKE 上的业务流量通常通过 CLB(腾讯云负载均衡器)进行接入。有时候,您希望工作负载能够根据 CLB 的监控指标进行伸缩,例如:
1. 长连接场景(如游戏房间、在线会议):每个用户对应一条连接,工作负载里的每个 Pod 处理的连接数上限相对固定。这时可以根据 CLB 连接数指标进行伸缩。
2. HTTP 协议的在线业务:工作负载里的单个 Pod 所能支撑的 QPS 相对固定。这时可以根据 CLB 的 QPS(每秒请求数) 指标进行伸缩。

keda-tencentcloud-clb-scaler 介绍

KEDA 有很多内置的触发器,但没有腾讯云 CLB 的,不过 KEDA 支持 external 类型的触发器来对触发器进行扩展,keda-tencentcloud-clb-scaler 是基于腾讯云 CLB 监控指标的 KEDA External Scaler,可实现基于 CLB 连接数、QPS 和带宽等指标的弹性伸缩。

操作步骤

准备访问密钥

需要准备一个腾讯云账号的访问密钥(SecretID、SecretKey),具体操作可参考 子账号访问密钥管理,要求账号至少具有以下权限:
{
"version": "2.0",
"statement": [
{
"effect": "allow",
"action": [
"clb.DescribeLoadBalancers",
"monitor.DescribeProductList",
"monitor.GetMonitorData",
"monitor.DescribeBaseMetrics"
],
"resource": [
"*"
]
}
]
}

安装 keda-tencentcloud-clb-scaler

helm repo add clb-scaler https://imroc.github.io/keda-tencentcloud-clb-scaler
helm upgrade --install clb-scaler clb-scaler/clb-scaler -n keda \\
--set region="ap-chengdu" \\
--set credentials.secretId="xxx" \\
--set credentials.secretKey="xxx"
请将 region 修改为您的 CLB 所在地域(一般与集群所在地域相同),地域列表详情请参见 地域与可用区
credentials.secretId 和 credentials.secretKey 是您腾讯云账户的密钥对,用于访问和获取 CLB 的监控数据。请将其替换为您自己的密钥对。

部署工作负载

您可以使用以下用于测试的工作负载 YAML 样例:
apiVersion: v1 kind: Service metadata: labels: app: httpbin name: httpbin spec: ports: - port: 8080 protocol: TCP targetPort: 80 selector: app: httpbin type: LoadBalancer --- apiVersion: apps/v1 kind: Deployment metadata: name: httpbin spec: replicas: 1 selector: matchLabels: app: httpbin template: metadata: labels: app: httpbin spec: containers: - image: kennethreitz/httpbin:latest name: httpbin
配置好 YAML 文件后执行以下命令进行部署:
kubectl apply -f httpbin.yaml
部署完成后,将自动创建相应的公网 CLB 接入流量,您可以使用以下命令获取对应的 CLB ID:
$ kubectl get svc httpbin -o jsonpath='{.metadata.annotations.service\\.kubernetes\\.io/loadbalance-id}'
lb-********
记录下获取到的 CLB ID,这将在后续的 KEDA 配置中使用。

使用 ScaledObject 配置基于 CLB 监控指标的弹性伸缩

配置方法

基于 CLB 的监控指标通常用于在线业务,使用 KEDA 的 ScaledObject 配置弹性伸缩,配置 external 类型的 trigger,并传入所需的 metadata,主要包含以下字段:
scalerAddress 是 keda-operator 调用 keda-tencentcloud-clb-scaler 时使用的地址。
loadBalancerId 是 CLB 的实例 ID。
metricName 是 CLB 的监控指标名称,公网和内网的大部分指标相同。
threshold 是扩缩容的指标阈值,即会通过比较 metricValue / Pod 数量 与 threshold 的值来决定是否扩缩容。
listener 是唯一可选的配置,指定监控指标的 CLB 监听器,格式:协议/端口。

配置示例一:基于 CLB 连接数指标的弹性伸缩

apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: httpbin spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: httpbin pollingInterval: 15 minReplicaCount: 1 maxReplicaCount: 100 triggers: - type: external metadata: # highlight-start scalerAddress: clb-scaler.keda.svc.cluster.local:9000 loadBalancerId: lb-xxxxxxxx metricName: ClientConnum # 连接数指标 threshold: "100" # 每个 Pod 处理 100 条连接 listener: "TCP/8080" # 可选,指定监听器,格式:协议/端口 # highlight-end

配置示例二:基于 CLB QPS指标的弹性伸缩

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: httpbin
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: httpbin
pollingInterval: 15
minReplicaCount: 1
maxReplicaCount: 100
triggers:
- type: external
metadata:
# highlight-start
scalerAddress: clb-scaler.keda.svc.cluster.local:9000
loadBalancerId: lb-xxxxxxxx
metricName: TotalReq # 每秒请求数指标
threshold: "500" # 平均每个 Pod 支撑 500 QPS
listener: "TCP/8080" # 可选,指定监听器,格式:协议/端口
# highlight-end

执行命令

完成 YAML 文件配置后,执行以下命令部署配置,示例使用 ScaledObject.yaml 文件:
kubectl apply -f ScaledObject.yaml