【KEDA】基于ELB服务事件进行弹性伸缩

举报
可以交个朋友 发表于 2025/12/18 19:12:20 2025/12/18
【摘要】 一、背景在现代的微服务架构中,应用的负载往往具有突发性和不可预测性。传统的基于 CPU 或内存的弹性伸缩策略,在应对突发的应用层流量(如大量 HTTP 请求)时,可能会因为响应不够及时而导致服务延迟增加甚至不可用。为了更精准、快速地响应业务负载变化,我们需要一种更细粒度的弹性伸缩策略。华为云的弹性负载均衡器(ELB)会实时上报其四层查询速率(QPS)到云监控服务(Cloud Eye)。KE...

一、背景

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

二、方案架构

image.png

三、简介

KEDA 会周期性地通过华为云 API 从 Cloud Eye 获取指定 ELB 实例的 mb_l4_qps 指标。当该指标值超过或低于预设的阈值时,KEDA 会自动调整其关联的 Kubernetes Deployment 的副本数量,从而实现弹性伸缩。

四、前提条件

  1. 一个已部署 KEDA 的 Kubernetes 集群。
  2. 一个正在运行的、由 ELB(共享型或独享型)提供四层(TCP/UDP)流量接入的 Kubernetes 应用 (Deployment)。
  3. 获取华为云账号的 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

image.png

七、验证结果

创建一个名为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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。