【KEDA】基于ELB服务事件进行弹性伸缩
【摘要】 一、背景在现代的微服务架构中,应用的负载往往具有突发性和不可预测性。传统的基于 CPU 或内存的弹性伸缩策略,在应对突发的应用层流量(如大量 HTTP 请求)时,可能会因为响应不够及时而导致服务延迟增加甚至不可用。为了更精准、快速地响应业务负载变化,我们需要一种更细粒度的弹性伸缩策略。华为云的弹性负载均衡器(ELB)会实时上报其四层查询速率(QPS)到云监控服务(Cloud Eye)。KE...
一、背景
在现代的微服务架构中,应用的负载往往具有突发性和不可预测性。传统的基于 CPU 或内存的弹性伸缩策略,在应对突发的应用层流量(如大量 HTTP 请求)时,可能会因为响应不够及时而导致服务延迟增加甚至不可用。为了更精准、快速地响应业务负载变化,我们需要一种更细粒度的弹性伸缩策略。华为云的弹性负载均衡器(ELB)会实时上报其四层查询速率(QPS)到云监控服务(Cloud Eye)。KEDA 的 huawei-cloudeye 触发器能够直接读取这些指标,从而实现基于真实业务流量的无服务器化弹性伸缩,确保应用始终具备足够的处理能力,同时在低峰期自动缩容以节省成本。
二、方案架构

三、简介
KEDA 会周期性地通过华为云 API 从 Cloud Eye 获取指定 ELB 实例的 mb_l4_qps 指标。当该指标值超过或低于预设的阈值时,KEDA 会自动调整其关联的 Kubernetes Deployment 的副本数量,从而实现弹性伸缩。
四、前提条件
- 一个已部署 KEDA 的 Kubernetes 集群。
- 一个正在运行的、由 ELB(共享型或独享型)提供四层(TCP/UDP)流量接入的 Kubernetes 应用 (Deployment)。
- 获取华为云账号的 IAM 访问密钥(AccessKey 和 SecretKey),并确保该账号具备查询 Cloud Eye 监控数据的权限。
五、约束条件
keda 2.18版本存在bug无法读取IdentityEndpoint参数,本次案例中部署的keda为2.16版本
六、操作步骤
步骤一:创建k8s secret来存储访问华为云API所需的凭证
apiVersion: v1
kind: Secret
metadata:
name: keda-huawei-secrets
namespace: keda # 建议与应用在同一命名空间
type: Opaque
data:
IdentityEndpoint: aHR0cHM6Ly9pYW0ubXlodWF3ZWljbG91ZC5jb20vdjM= #<Base64 编码后的 Identity Endpoint,例如 https://iam.xxx.yyy.com/v3>
ProjectID: MGE3MjU1ZTA5YTAwZjM1YTJmZTJjMDAxM2FkNjZkNTE= #<Base64 编码后的项目 ID>
DomainID:MDg4ZGJmYTI2ZDgwMGY0OTBmOWFjMDAxZjcyZjZjMjA= #<Base64 编码后的账号 ID>
Region: Y24tbm9ydGgtNA== #<Base64 编码后的区域名称,例如 cn-east-3>
Domain: aHdzdGFmZl9saWh1aQ== #<Base64 编码后的域名>
AccessKey: SFNUM0ZWSE5DUFZKU1VaRUlYRTE= #<Base64 编码后的 Access Key>
SecretKey: Q1hZcjdqQ0xtWWsyaFp5S2NnWlRDOXdHNmZVajNYc1Zqakp0Um1HMQ== #<Base64 编码后的 Secret Key>
步骤二:创建触发器身份认证(TriggerAuthentication)
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: keda-trigger-auth-huawei-credential
namespace: keda # 与 Secret 在同一命名空间
spec:
secretTargetRef:
- parameter: IdentityEndpoint
name: keda-huawei-secrets
key: IdentityEndpoint
- parameter: ProjectID
name: keda-huawei-secrets
key: ProjectID
- parameter: DomainID
name: keda-huawei-secrets
key: DomainID
- parameter: Region
name: keda-huawei-secrets
key: Region
- parameter: Domain
name: keda-huawei-secrets
key: Domain
- parameter: AccessKey
name: keda-huawei-secrets
key: AccessKey
- parameter: SecretKey
name: keda-huawei-secrets
key: SecretKey
步骤三:创建弹性伸缩规则 (ScaledObject)
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: elb-bps-scaler
namespace: keda # 与应用和 TriggerAuthentication 在同一命名空间
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: elb-nginx # 必填,需要伸缩的应用
minReplicaCount: 2 # 最小副本数,可根据需要调整
maxReplicaCount: 5 # 最大副本数,可根据需要调整
triggers:
- type: huawei-cloudeye
metadata:
# 指定指标来源的命名空间,ELB 指标通常为 SYS.ELB
namespace: SYS.ELB
# 指定监控的 ELB 实例 ID
dimensionName: lbaas_instance_id
dimensionValue: "e52716e5-fef1-4c6a-ac8f-3a81218a2d18" # 必填
# 指定监控的指标名称,此处为每秒连接数
metricName: m4_in_qps
# 设置触发扩容的指标阈值。当QPS 达到或超过此值时,开始扩容。
targetMetricValue: "1"
# (可选) 设置激活伸缩器的阈值。当 BPS 低于此值时,缩容至 minReplicaCount。
#activationTargetMetricValue: "5"
# (可选) 指标的聚合方式,默认为 average
metricFilter: "average"
# (可选) 指标的监控周期,默认为 300 秒
metricPeriod: "300"
# 引用上一步创建的认证信息
authenticationRef:
name: keda-trigger-auth-huawei-credential

七、验证结果
创建一个名为elb-nginx的应用
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
description: ''
workload.cce.io/swr-version: '[{"version":"Private Edition"}]'
labels:
appgroup: ''
version: v1
name: elb-nginx
namespace: keda
spec:
selector:
matchLabels:
app: elb-nginx
version: v1
template:
metadata:
labels:
app: elb-nginx
version: v1
spec:
containers:
- name: container-1
image: '/testapp/nginx:'
imagePullPolicy: IfNotPresent
env:
- name: PAAS_APP_NAME
value: elb-nginx
- name: PAAS_NAMESPACE
value: keda
- name: PAAS_PROJECT_ID
value: 0a7255e09a00f35a2fe2c0013ad66d51
resources:
requests:
cpu: 250m
memory: 512Mi
limits:
cpu: 250m
memory: 512Mi
imagePullSecrets:
- name: default-secret
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
tolerations:
- key: node.kubernetes.io/not-ready
operator: Exists
effect: NoExecute
tolerationSeconds: 300
- key: node.kubernetes.io/unreachable
operator: Exists
effect: NoExecute
tolerationSeconds: 300
initContainers: []
replicas: 2
revisionHistoryLimit: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
progressDeadlineSeconds: 600
---
apiVersion: v1
kind: Service
metadata:
name: elb-nginx-61672
labels:
app: elb-nginx
version: v1
namespace: keda
annotations:
kubernetes.io/elb.class: union
kubernetes.io/elb.id: e52716e5-fef1-4c6a-ac8f-3a81218a2d18
kubernetes.io/elb.lb-algorithm: ROUND_ROBIN
kubernetes.io/elb.health-check-flag: 'on'
kubernetes.io/elb.health-check-option: '{"protocol":"TCP","delay":"5","timeout":"10","max_retries":"3"}'
spec:
selector:
app: elb-nginx
version: v1
externalTrafficPolicy: Cluster
ports:
- name: cce-service-0
targetPort: 80
nodePort: 0
port: 80
protocol: TCP
type: LoadBalancer
loadBalancerIP: 192.168.0.102
压测service,使QPS大于1次/秒
while true; do curl ELB IP:端口; done
当向cloudeye推送数据时,名为elb-nginx的负载会自动触发扩缩容
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)