在ACS集群中Pod使用BestEffort实例时,为应对实例被抢占回收时导致的业务中断的风险,可安装acs-instance-helper组件并添加注解,实现待释放Pod的自动副本轮转和优雅下线。
工作原理
BestEffort实例在释放前5分钟会收到警告事件。若无自动化处理机制,用户需投入大量运维成本(配置事件监听、编写处理脚本等)才能有效利用这个时间窗口。acs-instance-helper组件提供开箱即用的自动释放补偿功能:
自动监听事件:安装组件会在集群内部署一个应用(acs-instance-helper-controller),持续监听来自阿里云底层的实例中断警告,无需进行任何事件配置。
触发轮转更新:收到释放事件后,组件会立即创建新BestEffort实例来替代即将被释放的旧实例。新实例就绪后会自动接入流量,避免服务中断。
实现优雅下线:在触发轮转更新后,旧实例仍有剩余时间(5分钟减去新实例启动时间)来完成优雅下线,处理完当前请求、关闭数据库连接、上报最后的日志和监控数据等,确保业务平稳过渡。
适用范围
ACS集群版本为1.28及以上。
安装组件
在ACS控制台页面,单击目标集群名称,在集群详情页左侧导航栏,选择。
在Helm页面,单击创建。
基本信息:在Chart中搜索acs-instance-helper,勾选搜索结果。
参数配置:Chart版本选择最新版。
配置工作负载
通过注解ops.alibabacloud.com/enable-best-effort-helper: "true"启用BestEffort实例自动释放补偿。此功能开箱即用,默认支持以下工作负载控制器。
ReplicaSet(通常由Deployment创建)。CloneSet(来自apps.kruise.io)。
如需为其他类型的工作负载启用该功能,需进行额外配置,请参考为其他类型工作负载开启组件支持。
控制台
在目标集群左侧导航栏,选择工作负载 > 无状态。
在无状态页面,单击使用YAML创建资源,然后将以下内容复制到模板区域,单击创建。
apiVersion: apps/v1 kind: Deployment metadata: name: app namespace: default spec: replicas: 1 selector: matchLabels: app: app template: metadata: labels: app: app alibabacloud.com/compute-qos: best-effort annotations: # 开启BestEffort实例自动释放补偿功能 ops.alibabacloud.com/enable-best-effort-helper: "true" spec: # 优雅下线时长,建议配置为240秒 terminationGracePeriodSeconds: 240 containers: - image: registry-cn-hangzhou.ack.aliyuncs.com/dev/hello-world:v1 name: main-container resources: limits: cpu: "16" memory: 32Gi restartPolicy: Always重要应用需控制在分钟级完成启动与退出,从而确保整个副本替换过程在5分钟以内,避免因实例被强制回收导致业务受损。
在弹窗中找到目标无状态应用,单击查看,确认Pod状态为
Running。
kubectl
将以下YAML内容保存为app.yaml文件,然后执行
kubectl apply -f app.yaml命令。apiVersion: apps/v1 kind: Deployment metadata: name: app namespace: default spec: replicas: 1 selector: matchLabels: app: app template: metadata: labels: app: app alibabacloud.com/compute-qos: best-effort annotations: # 开启BestEffort实例自动释放补偿功能 ops.alibabacloud.com/enable-best-effort-helper: "true" spec: # 优雅下线时长,建议配置为240秒 terminationGracePeriodSeconds: 240 containers: - image: registry-cn-hangzhou.ack.aliyuncs.com/dev/hello-world:v1 name: main-container resources: limits: cpu: "16" memory: 32Gi restartPolicy: Always重要应用需控制在分钟级完成启动与退出,从而确保整个副本替换过程在5分钟以内,避免因副本提前下线导致业务受损。
确认目标应用Pod状态为
Running。kubectl get pods -l app=app
观察BestEffort实例轮转
等待一段时间后(通常在2小时以上),当 BestEffort实例收到释放通知时,acs-instance-helper会在不修改工作负载的前提下触发副本扩容,创建一个新的实例。
$ kubectl get po NAME READY STATUS RESTARTS AGE app-f4c8bfc4-2q4fr 0/1 Pending 0 1s app-f4c8bfc4-8vlcx 1/1 Running 0 22h $ kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE app 1/1 1 1 22h新实例就绪后开始接入流量,旧实例开始退出,执行优雅下线。此时,通过
kubectl describe命令可以看到两个核心事件:新实例的创建。
旧实例的驱逐和优雅下线。
$ kubectl get po NAME READY STATUS RESTARTS AGE app-f4c8bfc4-2q4fr 1/1 Running 0 2m51s app-f4c8bfc4-8vlcx 1/1 Terminating 0 22h $ kubectl describe po app-f4c8bfc4-8vlcx ... Normal NewInstanceCreationTriggered 2m51s best-effort-helper controller default/app-f4c8bfc4 (apiVersion:apps/v1, kind:ReplicaSet) will create a new instance Warning InstanceEvictedGracefully 3s best-effort-helper besteffort pod is deleted in advance to ensure graceful termination一段时间后,完成实例轮转,只留下新创建的实例。
$ kubectl get po NAME READY STATUS RESTARTS AGE app-f4c8bfc4-2q4fr 1/1 Running 0 6m12s
计费说明
安装 acs-instance-helper 组件将在您的集群中部署一个包含两个副本的 Deployment。每个副本的资源规格为 1 vCPU 和 2 GiB 内存,这将占用集群资源并产生相应费用。详细计费,请参考ACS算力计费说明。
常见问题
为其他类型工作负载(非Deployment)开启acs-instance-helper组件支持
在 acs-instance-helper 组件所属的命名空间下创建一个 ConfigMap,通过customOnlineWorkloads自定义组件需要额外支持的工作负载列表。
将以下YAML内容保存为instance-helper-configmap.yaml文件,然后执行kubectl apply -f instance-helper-configmap.yaml命令创建该ConfigMap。
kind: ConfigMap
apiVersion: v1
metadata:
namespace: kube-system # acs-instance-helper组件所属命名空间
name: acs-instance-helper-global-config
data:
# 自定义工作负载列表(格式为<apiGroup>/<Kind>,多项以英文逗号分隔)
customOnlineWorkloads: foo.io/SomeWorkload,bar.io/AnotherWorkload请确保自定义的工作负载控制器能够通过伸缩维持 Pod 的副本数(当副本数不足时,可以自动补充)。
无法保证所有工作负载都能实现BestEffort实例自动释放补偿,为自定义工作负载启用功能时,请务必进行充分测试。