【KEDA】基于Deployment滚动更新事件进行弹性伸缩

举报
可以交个朋友 发表于 2025/12/17 18:09:10 2025/12/17
【摘要】 一、方案概述 1. 方案目标基于 Kubernetes(K8s)Deployment 的事件触发机制,通过 KEDA(Kubernetes Event-driven Autoscaling)实现事件驱动型弹性伸缩,解决传统 HPA 依赖指标阈值(如 CPU / 内存使用率)的局限性,支持基于 Deployment 相关事件(如 Pod 就绪状态变更、镜像更新、配置变更等)动态调整 Pod ...

一、方案概述

1. 方案目标

基于 Kubernetes(K8s)Deployment 的事件触发机制,通过 KEDA(Kubernetes Event-driven Autoscaling)实现事件驱动型弹性伸缩,解决传统 HPA 依赖指标阈值(如 CPU / 内存使用率)的局限性,支持基于 Deployment 相关事件(如 Pod 就绪状态变更、镜像更新、配置变更等)动态调整 Pod 副本数,提升资源利用率与服务可用性。

2. 适用场景

  • 服务发布 / 更新场景:Deployment 触发滚动更新时,临时扩容副本数加速更新进度,避免服务中断;
  • Pod 异常场景:Deployment 关联 Pod 频繁重启 / 就绪失败时,自动扩容备用副本,保障服务稳定性;
  • 配置变更场景:Deployment 配置(如 ConfigMap/Secret 挂载)更新后,扩容副本数快速完成配置同步;
  • 自定义事件场景:结合 K8s Event 自定义规则,响应特定 Deployment 事件(如标签变更、注解更新)进行伸缩。

二、前提条件

  • Kubernetes 集群:v1.21+(支持 CustomResourcesDefinition v1、HorizontalPodAutoscaler v2);
  • KEDA:v2.8+(提供事件源适配、伸缩规则编排能力);
  • 集群中已安装Prometheus插件
  • Metrics Server:K8s 指标采集组件,用于 KEDA 伸缩决策的基础指标支撑。

三、环境准备

1. 前置依赖安装

(1)安装 Metrics Server

部署 Metrics Server (适用于 K8s 1.24+)

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

验证安装(确保 Metrics Server 运行正常)

kubectl get pods -n kube-system | grep metrics-server

image.png

(2)安装 KEDA

添加 KEDA Helm 仓库

helm repo add keda https://kedacore.github.io/charts
helm repo update

安装 KEDA 到 keda 命名空间

helm install keda keda/keda --namespace keda --create-namespace

验证 KEDA 组件运行状态(确保 keda-operator、keda-operator-metrics-apiserver 就绪)

kubectl get pods -n keda

2. 权限配置

KEDA 需要具备读取 Deployment、Event、Pod 等资源的权限,通过 ClusterRole 绑定实现:

keda-deployment-event-role.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
    name: keda-deployment-event-reader
rules:
- apiGroups: ["apps"]
  resources: ["deployments", "deployments/status"]
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources: ["events"]
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources: ["pods", "pods/status"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: keda-deployment-event-binding
subjects:
- kind: ServiceAccount
  name: keda-operator
  namespace: keda
roleRef:
  kind: ClusterRole
  name: keda-deployment-event-reader
  apiGroup: rbac.authorization.k8s.io

kubectl apply -f keda-deployment-event-role.yaml

四、核心配置设计

1. 事件源定义(ScaledObject)

KEDA 通过 ScaledObject 关联 Deployment 与事件触发规则,核心配置包含目标 Deployment、事件触发条件、伸缩参数三部分。以下为配置示例:

  • 基于 Deployment 滚动更新事件扩容
  • 当 Deployment 触发滚动更新(事件类型为 DeploymentRollingUpdate)时,自动扩容副本数至目标值,更新完成后缩容:

scaledobject-deployment-rollupdate.yaml

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: deployment-rollupdate-scaler
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app-deployment  # 目标 Deployment 名称
  pollingInterval: 5         # KEDA 轮询事件的间隔(秒)
  cooldownPeriod: 30         # 事件结束后,保持扩容状态的冷却时间(秒)
  minReplicaCount: 2         # 最小副本数
  maxReplicaCount: 10        # 最大副本数
  triggers:
  - type: prometheus
    metadata:
      serverAddress: http://10.247.124.218:9090  # Prometheus 地址
      query: |
        sum(increase(
          kube_deployment_status_replicas_updated{
            namespace="default",
            deployment="my-app-deployment"
          }
          [5m]
        ))
      threshold: "1"                # 触发伸缩的指标阈值
      activationThreshold: "1"      # 激活伸缩的阈值(可选)

五、部署与验证流程

1. 部署目标 Deployment

首先创建需要伸缩的 Deployment(示例应用):

my-app-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    description: ''
    workload.cce.io/swr-version: '[{"version":"Private Edition"}]'
  labels:
    appgroup: ''
    version: v1
  name: my-app-deployment
  namespace: default
spec:
  selector:
    matchLabels:
      app: my-app
      version: v1
  template:
    metadata:
      labels:
        app: my-app
        version: v1
    spec:
      containers:
        - name: container-1
          image: '/testapp/nginx:perl'
          imagePullPolicy: IfNotPresent
          env:
            - name: PAAS_APP_NAME
              value: my-app-deployment
            - name: PAAS_NAMESPACE
              value: default
            - 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: 241
        - key: node.kubernetes.io/unreachable
          operator: Exists
          effect: NoExecute
          tolerationSeconds: 240
      initContainers: []
  replicas: 2
  revisionHistoryLimit: 10
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  progressDeadlineSeconds: 600

kubectl apply -f my-app-deployment.yaml

2. 部署 ScaledObject

选择对应场景的 ScaledObject 配置文件,执行部署:

kubectl apply -f scaledobject-deployment-rollupdate.yaml

3. 验证伸缩效果

(1)触发事件

以场景(滚动更新事件)为例,修改 Deployment镜像版本 触发滚动更新:

(2)查看伸缩状态

查看 ScaledObject 状态(确认事件触发与伸缩状态)

kubectl get scaledobjects.keda.sh deployment-rollupdate-scaler -o yaml

查看 HPA 状态(KEDA 自动创建对应的 HPA)

kubectl get hpa

查看 Deployment 副本数变化

kubectl get deployment my-app-deployment -w

image.png
image.png

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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