业务场景
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 和带宽等指标的弹性伸缩。
操作步骤
安装 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
部署完成后,将自动创建响应的公网 CLB 接入流量,您可以使用以下命令获取对应的 CLB ID:
$ kubectl 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:
scalerAddress: clb-scaler.keda.svc.cluster.local:9000
loadBalancerId: lb-xxxxxxxx
metricName: ClientConnum
threshold: "100"
listener: "TCP/8080"
配置示例二:基于 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:
scalerAddress: clb-scaler.keda.svc.cluster.local:9000
loadBalancerId: lb-xxxxxxxx
metricName: TotalReq
threshold: "500"
listener: "TCP/8080"
本页内容是否解决了您的问题?