通过acs-instance-helper组件实现BestEffort实例自动释放补偿

ACS集群中Pod使用BestEffort实例时,为应对实例被抢占回收时导致的业务中断的风险,可安装acs-instance-helper组件并添加注解,实现待释放Pod的自动副本轮转和优雅下线。

工作原理

BestEffort实例在释放前5分钟会收到警告事件。若无自动化处理机制,用户需投入大量运维成本(配置事件监听、编写处理脚本等)才能有效利用这个时间窗口。acs-instance-helper组件提供开箱即用的自动释放补偿功能:

  1. 自动监听事件:安装组件会在集群内部署一个应用(acs-instance-helper-controller),持续监听来自阿里云底层的实例中断警告,无需进行任何事件配置。

  2. 触发轮转更新:收到释放事件后,组件会立即创建新BestEffort实例来替代即将被释放的旧实例。新实例就绪后会自动接入流量,避免服务中断。

  3. 实现优雅下线:在触发轮转更新后,旧实例仍有剩余时间(5分钟减去新实例启动时间)来完成优雅下线,处理完当前请求、关闭数据库连接、上报最后的日志和监控数据等,确保业务平稳过渡。

适用范围

  • ACS集群版本为1.28及以上。

安装组件

  1. ACS控制台页面,单击目标集群名称,在集群详情页左侧导航栏,选择应用 > Helm

  2. Helm页面,单击创建

    1. 基本信息:在Chart中搜索acs-instance-helper,勾选搜索结果。

    2. 参数配置:Chart版本选择最新版。

配置工作负载

通过注解ops.alibabacloud.com/enable-best-effort-helper: "true"启用BestEffort实例自动释放补偿。此功能开箱即用,默认支持以下工作负载控制器。

  • ReplicaSet (通常由 Deployment 创建)。

  • CloneSet (来自 apps.kruise.io)。

如需为其他类型的工作负载启用该功能,需进行额外配置,请参考为其他类型工作负载开启组件支持

控制台

  1. 在目标集群左侧导航栏,选择工作负载 > 无状态

  2. 无状态页面,单击使用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分钟以内,避免因实例被强制回收导致业务受损。

  3. 在弹窗中找到目标无状态应用,单击查看,确认Pod状态为Running。 

kubectl

  1. 获取集群kubeconfig并通过kubectl工具连接集群

  2. 将以下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分钟以内,避免因副本提前下线导致业务受损。

  3. 确认目标应用Pod状态为Running

    kubectl get pods -l app=app

观察BestEffort实例轮转

  1. 等待一段时间后(通常在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
  2. 新实例就绪后开始接入流量,旧实例开始退出,执行优雅下线。此时,通过kubectl describe命令可以看到两个核心事件:

    1. 新实例的创建。

    2. 旧实例的驱逐和优雅下线。

    $ 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
  3. 一段时间后,完成实例轮转,只留下新创建的实例。

    $ 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实例自动释放补偿,为自定义工作负载启用功能时,请务必进行充分测试。