ACS支持创建使用BestEffort算力质量的实例(本文中简称为BestEffort QoS类型实例)。对于短时间运行的Job任务,以及部分扩展性和容错率高的无状态应用,使用BestEffort QoS类型实例可以有效地节约实例使用成本。本文介绍如何在ACS中创建BestEffort QoS类型实例。
应用场景
BestEffort QoS类型实例最适合应用于无状态、可弹性伸缩、高度分布式且对实时性无特殊要求的应用场景。例如可弹性伸缩的Web站点服务、图像渲染、音视频转码、大数据分析和大规模并行计算等。使用BestEffort QoS类型实例可以极大降低计算资源的使用成本。
一般来说,不建议在BestEffort QoS类型实例上运行有状态应用,因为BestEffort QoS类型实例有较大的性能扰动,且可被抢占和驱逐。但是在一些特殊情况下,如果能够满足以下条件,则可以考虑在BestEffort QoS类型实例上运行有状态应用:
具有快速重启能力
使用高可用架构
除非满足上述所有条件,否则仍建议将有状态应用部署到资源有保证的实例上,以确保数据安全和业务连续性。
前提条件
已创建ACS集群。
创建BestEffort实例
登录容器计算服务控制台,在左侧导航栏选择集群。
在集群页面,单击目标集群ID,然后在左侧导航栏,选择
。在无状态页面,单击使用镜像创建。
在创建页面依次填写应用名称、副本数量、类型、标签(可选)、注解(可选)。
实例类型选择通用型,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为例,配置库存优先调度策略。
使用以下内容,创建一个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
使用以下内容,创建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