【KEDA】基于Deployment滚动更新事件进行弹性伸缩
【摘要】 一、方案概述 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

(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


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