作者:吴昆
云计算时代,企业可以通过云平台获得大量计算资源,并根据业务发展和流量需求的实时变化,灵活调整使用的资源类型与资源量。阿里云提供了多种弹性资源,如云服务器 ECS 和弹性容器实例 ECI,并且提供不同的付费方式,如包年包月、按量付费和抢占实例等。不同类型和付费方式的实例,在给客户带来更高的灵活性的同时,也对客户的资源管理能力提出了更高的要求。
阿里云容器服务 ACK 通过节点池功能,简化了集群节点的管理与运维,支持自动弹性伸缩,根据业务负载和预设策略自动调整节点数量,可以弹出不同可用区、实例规格和付费方式的 ECS 实例,虚拟节点也可以按需创建 ECI 实例,以此满足多样化的需求场景并优化成本。然而,客户仍需面对如何高效利用和管理这些计算资源的挑战。
面临的挑战主要有以下几点:
1. 差异化控制业务资源使用量
在集群中,配置了包年包月实例和抢占实例,并在资源不足时将业务 Pod 运行在 ECI 实例上。为了确保高优先级的业务能够在稳定的包年包月实例上运行,我们需要限制不同业务在不同类型实例上的资源使用量。
2. 缩容时部分业务 Pod 未释放
默认的缩容策略难以保证优先缩容高峰期扩容出的业务 Pod,导致业务流量高峰过后,在自动伸缩节点池或 ECI 实例上,仍然存在部分业务 Pod 未释放,导致机器无法缩容并持续计费,需要人工进行业务 Pod 迁移。
弹性调度的目标,就是帮助客户解决在使用云上弹性资源时面对的挑战。包括按照多级资源的优先顺序进行调度,以及按照定义的优先顺序进行缩容的能力。
为了解决客户在多级资源管理中面临的难题,阿里云容器服务 ACK 在标准 K8s 调度框架的基础上扩展了弹性调度功能,推出了“自定义弹性资源优先级调度”功能。
该功能提供了差异化调度 ECS 和 ECI 资源的能力,包括:
自定义弹性资源优先级调度策略:
在应用发布或扩容过程中,客户可以按照自定义资源策略,设置应用实例 Pod 被调度到不同类型节点资源的顺序。
逆序缩容:
当客户通过 HPA 缩容业务 Pod 时,可以按照策略中资源优先级的逆序缩容业务,确保弹性资源优先缩容,减少计费。
灵活修改策略:
当策略发生变化时,同步调整已调度的业务 Pod 的优先级。而且,该功能通过自定义资源定义策略实现,无需改动业务 Deployment。
控制业务资源使用量:
通过限制不同业务在不同类型实例的资源使用量,确保高优资源优先供给高优业务使用。
多种资源使用量统计策略:
限制业务资源使用量时,支持多种不同的资源使用量统计策略,如忽略 Terminating 过程中的 Pod 或忽略提交 ResourcePolicy 策略前已调度的 Pod 等。
优化 Deployment 滚动更新: 能够自动将滚动更新过程中新创建的 Pod 视为新的分组,无需在每次更新 Deployment 时同步手动更新 ResourcePolicy。
下面我们将通过两个场景示例介绍弹性调度功能是如何帮助企业优化资源配置,实现降本增效的。
抢占式实例(旧称竞价实例)是一种按需实例,性能与常规 ECS 实例无异,价格根据市场供需关系实时变化,相对于按量付费实例最高能节约 90% 的实例成本。通过合理使用抢占式实例,用户能够极大降低云资源成本。
抢占式实例具有可能被其他出价更高的用户抢占导致实例被回收的特点,不能保证业务的最低运行实例要求,所以用户通常会将抢占式实例和长期包年包月实例配合使用。
在业务流量的高峰期,由 Pod 水平扩缩(HPA)自动扩容出业务 Pod,再由自动伸缩节点池根据处于 Pending 状态的 Pod 实例数扩容出抢占式实例。
在业务流量减少后,抢占式实例中的 Pod 应当被优先回收,使得抢占式实例能够被自动伸缩节点池回收以减少资源开销。目前默认的缩容策略可能会将运行在常驻 ECS 上的 Pod 回收,导致额外开销。
如下图所示,其中 cn-hongkong.192.168.7.147 和 cn-hongkong.192.168.7.148 分别带有 unit=first 和 unit=second 标签,代表优先希望调度到 cn-hongkong.192.168.7.147 上:
缩容到三个 Pod 后:
可以看到 Pod 依然保留在 cn-hongkong.192.168.7.148 上。
为了实现优先回收抢占式实例的效果,可以向集群中提交以下的 ResourcePolicy,以下实例的含义是在调度业务 Pod 时仅在靠前的带有 alibabacloud.com/nodepool-id: example-ecs-nodepool-id 的节点均无法调度 Pod 时,才将 Pod 调度到带有 alibabacloud.com/nodepool-id: example-spot-instance-nodepool-id 的节点上。
策略中假设 ECS 实例和抢占式实例是通过节点池 ID 进行区分的,您也可以通过机型或其他自定义标签进行区分,实际使用时请将变量按需替换:
apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:
name: $example-name
namespace: $example-namespace
spec:
selector:
$example-label-key: $example-label-value
strategy: prefer
units:
- nodeSelector:
alibabacloud.com/nodepool-id: $example-ecs-nodepool-id
resource: ecs
- nodeSelector:
alibabacloud.com/nodepool-id: $example-spot-instance-nodepool-id
resource: ecs
配置后的效果如下:
这个示例中我们提交了一个优先调度到带有 unit=first 标签的节点,之后调度到带有 unit=second 标签的节点的策略。
在扩容时,Pod 在完全使用节点 cn-hongkong.192.168.7.147 上的资源后,将后续业务 Pod 调度到节点 cn-hongkong.192.168.7.148 上。
最后我们将业务 Deployment 缩容为三副本,此时节点 cn-hongkong.192.168.7.148 上的业务 Pod 被优先移除,达到了逆序缩容的效果。在实际使用场景中,在 cn-hongkong.192.168.7.148 上的业务 Pod 被移除后,自动伸缩节点池会自动进行相应节点的回收,从而达到节约成本的效果。
滚动更新是业务上线过程中一项非常重要的流程,为了保障业务在滚动更新过程中不受影响,业务通常会采用“创建后删除”的策略,即等到业务的新副本正常运行了再逐渐清理旧副本,这就使得滚动更新中业务实际消耗的资源量高于运行过程中的资源量,超出使用的资源量可能会影响到集群中其他业务的运行或扩容。
为了限制业务在部分类型资源上的资源使用量,您可以使用 Max 选项,该选项允许限制业务 Pod 在每种资源类型上的数量,从而限制资源使用。启用该功能只需要在 ResourcePolicy 的 Unit 中新增一个 Max 字段:
apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:
name: $example-name
namespace: $example-namespace
spec:
selector:
$example-label-key: $example-label-value
strategy: prefer
units:
- nodeSelector:
alibabacloud.com/nodepool-id: $example-ecs-nodepool-id
resource: ecs
max: $example-max
- nodeSelector:
alibabacloud.com/nodepool-id: $example-spot-instance-nodepool-id
resource: ecs
当设置了 Max 之后,如果业务 Pod 在该 Unit 上运行的 Pod 数量已经达到了 Max,则下一个 Pod 将会被调度到后续的 Unit 上,若已经是最后一个 Unit,则 Pod 会调度失败。
以下是一个使用 Max 限制资源使用的例子,依然给 cn-hongkong.192.168.7.147 和 cn-hongkong.192.168.7.148 分别设置 unit=first 和 unit=second 标签。
不加资源限制时,业务会将高优资源用完再使用下一级,若此时有其他高优应用则无法使用该高优资源。
在该例子中我们提交了一个优先调度到带有 unit=first 标签的节点,之后调度到带有 unit=second 标签的节点的策略,并在一级策略上添加了最多调度一个业务 Pod 的限制,这会将 app=nginx 业务在一级资源上的业务使用限制在 1 个 Pod 的级别。
配置了 ResourcePolicy 之后,可以发现业务在 unit=first 的机器上的资源使用被限制,超出限制的部分被调度在了 unit=second 的机器上,从而实现了业务的资源合理分配。
弹性调度功能通过多级优先级调度、多级资源限制、逆序缩容等能力,帮助企业高效利用云上资源。除了本文介绍的两种基本用法外,阿里云容器服务 ACK 自定义弹性资源优先级调度还支持多种资源统计策略、根据 Label 智能分组等高级特性。通过灵活设置弹性调度,企业可以实现高效的资源配置与成本管理,更好的应对业务增长带来的资源管理挑战。