阅读前提示
为了让您更好地了解ACK提供的节点伸缩方案,并结合您的业务诉求进行方案选型,建议您在启用节点伸缩能力前阅读本篇概述。
阅读本文前,推荐您参见Kubernetes官方文档了解手动伸缩、自动伸缩、水平伸缩、垂直伸缩等伸缩概念。
工作原理
在Kubernetes中,节点伸缩的工作原理与传统意义上基于使用率阈值的模型有所差别。这也是从传统IDC或其他编排系统迁移到Kubernetes集群后往往需要解决的问题。
阈值是如何选择与判断的?
在一个集群中,部分热点节点的利用率可能较高,而其他节点的利用率可能较低。
弹出实例后如何缓解压力?
在Kubernetes集群中,应用以Pod为最小单元部署在集群的不同节点上。当一个Pod资源利用率较高时,即使该Pod所在的节点或者集群触发了弹性扩容,但该应用的Pod数量以及Pod对应的Limit并没有发生变化,节点负载的压力也无法转移到新扩容的节点上。
如何判断以及执行实例的缩容?
如果基于资源利用率的方式判断节点是否缩容,那么很有可能出现Request(资源请求)较大、但Usage(实际资源使用)很小的Pod被驱逐。当集群中这种类型的Pod较多时,会占用集群大量的调度资源,导致部分Pod无法调度。
如何判断节点的弹出?
节点伸缩会监听Pod是否处于调度失败的状态,以判断是否需要触发扩容。当Pod由于调度资源不足而调度失败时,节点伸缩会开始模拟调度,计算在开启弹性的节点池中哪个节点池可为这些Pod提供所需的节点资源,并在满足需求时弹出相应的节点。
说明 模拟调度时将一个开启弹性的节点池作为一个的抽象节点,开启弹性的节点池中配置的机型规格对应会成为抽象节点的CPU、内存或GPU的容量,且其配置的Label、Taint也会成为抽象节点的Label与Taint。模拟调度器会在调度模拟时,将该抽象节点纳入调度参考范围。符合调度条件时,调度模拟器会计算所需的节点数目,驱动节点池弹出节点。
如何判断节点的缩容?
节点伸缩仅缩容开启了弹性的节点池中的节点,无法管理静态节点(不在开启了弹性的节点池中的其他节点)。每个节点会单独判断是否进行缩容。当任意一个节点的调度利用率低于所设置的调度阈值时,就会触发缩容判断。此时,节点伸缩会尝试模拟驱逐节点上的负载,判断当前节点是否可以排水。部分特殊的Pod(例如kube-system命名空间的非DaemonSet Pod、PDB控制的Pod等)则会跳过该节点而选择其他的候选节点。当节点发生驱逐时,会先进行排水,将节点上的Pod驱逐到其他的节点,然后再下线该节点。
节点自动伸缩方案
节点自动伸缩指资源层弹性,即当集群的容量规划无法满足应用Pod调度时,自动扩缩节点资源,进行调度容量的补充。节点自动伸缩通过cluster-autoscaler组件,以轮询的方式,周期性地维护和检查集群状态,以发现满足扩缩容条件的情况,从而自动扩缩容集群节点。
伸缩速度与效率
单次伸缩时,标准模式的伸缩速度约为60s,极速模式为50s。
当达到1分钟的伸缩量级时,伸缩速度会遇到瓶颈,并且在不同规模(多节点池)、不同场景(连续伸缩)下,弹性速度也会有比较明显的抖动。例如,当节点池数量超过100时,伸缩速度将衰减为100~150s。
使用轮询式模型,且受制于对集群状态维护的依赖,弹性灵敏度最低为5s。
注意事项
配额与限制
在专有网络下创建的单个路由表可创建的自定义路由数限额是200条。如需更大的配额,请前往配额中心提交申请。关于其他资源的配额限制及升配详情,请参见依赖底层云产品配额限制。
请合理配置开启自动伸缩的节点池的最大实例数,保证此范围内的节点所依赖的资源和配额充足,例如合理规划VPC网段、交换机等网络资源,以避免节点扩容失败。配置开启自动伸缩的节点池的最大实例数,请参见配置实例数量。关于ACK的网络规划,请参见Kubernetes集群网络规划。
节点伸缩功能不支持包年包月付费类型的节点。如需新建开启自动伸缩的节点池,请勿选择付费类型为包年包月。如需为已有节点池开启自动伸缩,请确保节点池内没有包年包月付费类型的节点。
依赖资源的维护
选择绑定EIP时,请勿通过ECS控制台直接删除节点伸缩扩容出的ECS节点,否则会导致EIP无法自动释放。
后续阅读
如在使用节点自动伸缩过程中遇到问题,您可以参见节点自动伸缩常见问题进行自排查。
展开查看节点自动伸缩的FAQ索引
分类 | 二级分类 | 跳转链接 |
节点自动伸缩的扩缩容行为 | 已知限制 |
扩容行为相关 | cluster-autoscaler组件使用哪些调度策略来判断不可调度Pod能否调度到开启了弹性的节点池? cluster-autoscaler组件可模拟判断的资源有哪些? 为什么节点自动伸缩组件无法弹出节点? 如果一个伸缩组内配置了多资源类型的实例规格,弹性伸缩时如何计算这个伸缩组的资源呢? 弹性伸缩时,如何在多个开启弹性的节点池之间进行选择? 开启弹性的节点池如何配置自定义资源?
|
缩容行为相关 | |
拓展支持相关 | cluster-autoscaler组件是否支持CRD? |
自定义的扩缩容行为 | 通过Pod控制扩缩容行为 | |
通过节点控制扩缩容行为 | |
cluster-autoscaler组件相关 | 如何升级cluster-autoscaler组件至最新版本? 哪些操作会触发cluster-autoscaler组件自动更新? ACK托管集群已经完成了角色授权,但节点伸缩活动仍然无法正常运行?
|