BestEffort算力质量概述

ACS支持创建使用BestEffort算力质量的实例(本文中简称为BestEffort QoS类型实例)。对于短时间运行的Job任务,以及部分扩展性和容错率高的无状态应用,使用BestEffort QoS类型实例可以有效地节约实例使用成本。本文介绍如何在ACS中创建BestEffort QoS类型实例。

应用场景

BestEffort QoS类型实例最适合应用于无状态、可弹性伸缩、高度分布式且对实时性无特殊要求的应用场景。例如可弹性伸缩的Web站点服务、图像渲染、音视频转码、大数据分析和大规模并行计算等。使用BestEffort QoS类型实例可以极大降低计算资源的使用成本。

一般来说,不建议在BestEffort QoS类型实例上运行有状态应用,因为BestEffort QoS类型实例有较大的性能扰动,且可被抢占和驱逐。但是在一些特殊情况下,如果能够满足以下条件,则可以考虑在BestEffort QoS类型实例上运行有状态应用:

  • 具有快速重启能力

  • 使用高可用架构

除非满足上述所有条件,否则仍建议将有状态应用部署到资源有保证的实例上,以确保数据安全和业务连续性。

前提条件

创建ACS集群

创建BestEffort实例

  1. 登录容器计算服务控制台,在左侧导航栏选择集群

  2. 集群页面,单击目标集群ID,然后在左侧导航栏,选择工作负载 > 无状态

  3. 无状态页面,单击使用镜像创建

  4. 创建页面依次填写应用名称副本数量类型标签(可选)、注解(可选)。

  5. 实例类型选择通用型QoS类型选择best-effort

说明

后续步骤,请参见创建无状态工作负载Deployment

释放说明

BestEffort QoS类型实例创建成功后,如果遇到资源库存不足的情况,实例会被回收释放。您可以通过以下方式了解BestEffort QoS类型实例的释放情况。

预释放事件

BestEffort QoS类型实例在释放前约5分钟,会触发KubernetesEvents的BestEffortToBeReleased事件。您可以在日志服务控制台配置BestEffortToBeReleased事件的监控告警,具体操作请参见创建并使用K8s事件中心

重要

收到BestEffort实例即将被释放的事件通知后,您可以充分利用这段时间进行必要的处理,例如检查可能受影响的业务范围、迁移重要的工作负载到其他节点等容灾和恢复措施来确保业务不受实例释放所影响。

通过kubectl describe命令查看Pod详细信息,在返回信息的Events中可以看到预释放事件。

kubectl describe pod nginx-best-effort

示例输出:

Events:
  Type     Reason            Age    From          Message
  ----     ------            ----   ----          -------
  Warning  BestEffortToBeReleased  3m32s  kubelet  Best Effort Instance will be released

通过kubectl get events命令查看事件信息,在返回信息中可以看到预释放事件。

kubectl get events --field-selector=reason=BestEffortToBeReleased

示例输出:

LAST SEEN   TYPE      REASON             OBJECT         MESSAGE
3m39s       Warning   BestEffortToBeReleased   pod/pi-frmr8   Best Effort Instance will be released

释放后Pod状态

BestEffort QoS类型实例释放后,实例信息仍会保留,状态变更为Failed,Failed原因为Preempted。

通过kubectl get pod命令查看Pod信息,在返回信息中可以看到Pod状态已变更。

kubectl get pod nginx-best-effort

示例输出:

NAME       READY   STATUS      RESTARTS   AGE
nginx-best-effort   0/0     Preempted   0          3h5m

通过kubectl describe命令查看Pod详细信息,在返回信息中可以看到Pod状态信息。

kubectl describe pod nginx-best-effort

示例输出:

Status:             Failed
Reason:             Preempted
Message:            The pod is best-effort instance, and have been released at 2024-04-08T12:36Z

最佳实践

BestEffort算力质量实例为动态库存,强烈建议您在生产环境配置库存优先调度策略,在库存不足时由平台自动切换至默认型。更多信息,请参见自定义资源调度策略。以下以Job为例,配置库存优先调度策略。

  1. 使用以下内容,创建一个Job。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: demo-job
      namespace: default
    spec:
      parallelism: 3
      template:
        metadata:
          labels:
            app: stress # 关联ResourcePolicy中spec.selector定义的配置
        spec:
          containers:
          - name: demo-job
            image: registry.cn-hangzhou.aliyuncs.com/acs/stress:v1.0.4
            args:
              - '30s'
            command:
              - sleep
            resources:
              requests:
                cpu: "1"
                memory: "1Gi"
              limits:
                cpu: "1"
                memory: "1Gi"
          restartPolicy: Never
      backoffLimit: 4
  2. 使用以下内容,创建ResourcePolicy,优先使用best-effort算力质量的实例,库存不足时则申请default型。

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: rp-demo
      namespace: default
    spec:
      # 符合该selector条件的Pod将遵循此调度策略
      selector:
        app: stress
      # 以下为资源配置,用于描述调度顺序
      units:
      - resource: acs # resource类型必须指定为acs
        podLabels: # 优先申请"general-purpose"+"best-effort"类型的资源
          alibabacloud.com/compute-class: general-purpose
          alibabacloud.com/compute-qos: best-effort
      - resource: acs # 前者库存不足时,再申请"general-purpose"+"default"类型的资源
        podLabels:
          alibabacloud.com/compute-class: general-purpose
          alibabacloud.com/compute-qos: default