晏子怡,腾讯云产品经理,目前负责TKE集群、网络及调度模块。
从 K8s 的声明式设计理念谈起
Pod 模板
K8s 最优雅精妙的一个设计理念在于声明式 API 的运用,而 Deployment 又是其中的集大成者。
如果没有 Deployment ,我们需要管理上万的单独 Pod, 为每一个 Pod 设置合适的资源需求,容器镜像版本,Label,Taints 等属性。同时,我们还需要保证每一个业务对应的 Pod 数量在合适的值,来适应流量波动并达到负载均衡。而通过 Deployment 提供的 Pod 模板的能力, 我们可以编排 Pod:模板中的属性值代表我们的期望状态,Deployment 会自动维持管理的 Pod 在我们的期望状态,而这正是 K8s 的使用者真正关心的(我们并不关注从当前状态到理想状态是如何达成的)。
Node 模板
Deployment 提供了 Pod 模板的能力,那节点呢?是否我们也可以提供类似节点模板的能力让客户去管理他们成千上万的节点,无需一遍遍手动配置参数新建节点,反复封锁和驱逐来释放无用节点?基于声明式这一种云原生设计理念,TKE 推出了节点池,用户可以利用节点模板功能,统一管理节点,不需要一遍遍手动填写创建节点参数,也不需要人工计算可以容纳业务流量的节点数目。后续 TKE 会围绕节点池规划自动升级和自动修复功能,用户只需关注节点池内节点是否在期望 K8s 版本以及期望状态即可。
其他生态能力
为了丰富声明式的使用方式,节点池也会规划通过 CRD 来管理节点池,服务偏好 K8s API 的客户。您也可以把节点池和其他云资源统一编排,TKE 与腾讯云 Terraform 团队合作,支持基于 IaC (Infrastructure-as-code) 的理念来编排节点池,该功能即将于 12月底上线。
使用场景
有 TKE 重点客户反馈:由于业务增长,客户每天都需要扩百余台机器,通过节点池只需一键调整数量即可完成扩容,体验比单节点模式好太多(需要填很多参数,并且创建后不好管理)。此外,在内测阶段,云原生团队在与客户的交流过程中,总结了这几类典型问题及解决方案:
场景 | 如何用节点池解决问题 |
---|---|
集群中某些节点想使用自定义镜像,某些节点想使用公共镜像 | 通过节点池来管理,并设置不同的节点池维度操作系统 |
业务具有波峰波谷,需要频繁扩缩容节点 | 设置弹性扩缩容,按需使用资源,全自动运维 |
业务对成本非常敏感 | 创建包年包月节点池/竞价实例节点池,并设置全局扩容算法为 least-waste |
希望调度工作负载到特定机器上,比如 IO 敏感型业务调度到高 IO 型机器上 | 创建特定机型配置的节点池,同时设置 Label 或者 Taints, 为特定工作负载指定对应的亲和性规则 / 容忍,保证工作负载调度到期望节点池 |
工作负载对于特定机型没有要求,对扩容效率较敏感 | 创建特定规格的节点池,同时配置多机型/多子网,加强高可用 |
节点池架构概览
如果您集群中创建了伸缩组,节点池全量之后仍然可以继续使用这些伸缩组。但请注意,节点池全量后 TKE 不会对旧版伸缩组进行后续功能维护及迭代,请您尽快使用 TKE 提供的接口(API/控制台)将伸缩组转换成节点池(节点池覆盖伸缩组的所有功能)。
- 借助节点池的节点模板功能,您可以方便快捷地创建、管理和销毁节点。
- 借助节点池的弹性伸缩功能,您可以实现节点的动态扩缩容。当集群中出现因资源不足而无法调度的实例(Pod)时,自动触发扩容,为您减少人力成本。当满足节点空闲等缩容条件时,自动触发缩容,为您节约资源成本。
节点池产品优势
为了解决以上用户的痛点问题,节点池提供了以下的功能特性。
高可用
您可以为一个节点池配置集群 VPC 下的多个子网,达到跨可用区容灾的效果。另外您可为节点池配置多机型,降低由资源售罄导致扩容失败的风险。
- 多子网策略
- PRIORITY(默认策略),按照子网列表的顺序作为优先级来尝试创建实例
- EQUALITY(均匀打散):每次扩容活动选择当前实例数最少的子网进行扩容
- 多机型策略 支持 10 种机型并支持优先级,按照机型列表的顺序作为优先级来尝试创建实例
- 多子网机型协同策略 如果您为节点池同时配置了多子网和多机型,我们会先保证多机型的策略,后保证多可用区/子网的策略。例如多机型 A、B,多子网1、2、3(PRIORITY 策略),会按照 A1、A2、A3、B1、B2、B3 进行尝试区扩容。如果 A1 售罄,会尝试 A2,而非 B1。
自动化
节点池自动扩缩容依赖 Cluster Autoscaler 实现, 可与 HPA 无缝联动,实现从应用扩缩容到集群扩缩容的平滑过渡。
- 节点池能够在容器不够资源分配的情况下按需扩容
- 能够监控节点的 CPU、内存,自动缩容闲置节点
节点池提供两种扩缩容模式供您按需选择。除了默认的释放模式(扩容时创建节点,缩容时释放节点),节点池还支持与 CVM 关机不收费对接的关机模式(扩容时优先开机已关机节点,缩容时优先关机空闲节点),可以达到秒级热启动的效果,实现更高的扩缩容效率。
易审计
考虑到节点池日常运维的场景,我们也在可观测性方面提供了保障。您可追踪节点池关联的扩缩容活动 (活动相关的触发条件、时间、涉及实例、成功/失败原因),同时您还可以通过事件持久化能力查看 Cluster Autoscaler 相关的集群级别扩缩容记录。
更多细节请查看查看节点池伸缩记录:https://cloud.tencent.com/document/product/457/48538
通过查看伸缩记录,您可在短时间内定位并及时解决问题(例如因资源售罄导致的扩容失败,可以通过跨可用区部署 / 配置多机型来解决)。
省成本
节点池支持多种计费模式 (按量计费 / 包年包月 / 竞价实例),您可按需选择,节约成本。
- 当业务需求增加时,无缝地增加适量 CVM 实例,节省人力成本。
- 当业务需求下降时,自动释放不需要的 CVM 实例,提高设备利用率,为您节省部署和实例成本。
后续节点池会规划围绕竞价实例的增强功能,助力您实现降本增效。
易用性
节点池提供多种扩缩容以及节点管理相关的灵活配置,您可以根据业务性质以及安全考虑自行搭配使用。
- 支持为节点设置缩容保护 您可以标记重要业务节点,标记后节点不会在缩容时被释放。
- 快速迁移已有节点 可手动加入已有节点到同规格的节点池(CPU、内存、GPU、AMD/ARM),实现节点的规范分组管理。同时,手动加入节点将继承节点池的 Label 和 Taints, 且这些节点只能被手动移出节点池,不受弹性扩缩容/调整节点池数目影响。
- 支持灵活的扩缩容参数配置 您可以配置灵活的扩缩容参数,本文将在下一节-扩缩容原理中详细展开。
集群扩缩容原理
弹性扩容原理
集群弹性扩容流程如下:
- CA (Cluster Autoscaler)监测到有因无法调度而 Pending 的 pod
- CA 根据每个节点池的节点模板进行调度判断,挑选合适的节点模板
- 如果 2 中有多个模板合适,CA 采用 expanders 从多个模板挑选最优的一个,并对对应节点池进行扩容。优选算法有如下几个:
- random :随机挑选一个节点池
- Most-pods :挑选能调度最多 pod 的节点池
- Least-waste :挑选调度后剩余资源最少的节点池
- 其他社区expanders(最小成本策略、节点池优先级策略)
- 对指定节点池扩容 (根据多子网多机型策略),提供两种重试策略,提高容错性。
- 快速重试:立即重试,在较短时间内快速重试,连续失败超过一定次数(5次)后不再重试
- 间隔递增重试 :随着连续失败次数的增加,重试间隔逐渐增大,重试间隔从秒级到 1 天不等,1-3 次重试是立刻重试,4-6 次失败间隔 60s,7-10 次 600s, 11-15 次 1800s,16-20 次 3600s,20 次以上是86400s
弹性缩容原理
集群弹性缩容流程如下:
- CA (Cluster Autoscaler)监测到利用率(取 cpu 利用率和 mem 利用率的最大值)低于设定的节点。(可设置 Daemonset 类型不计入 pod 占用资源)
- CA 判断该节点是否符合缩容条件
- 节点空闲时长要求( 默认10分钟)
- 集群扩容缓冲时间要求(默认10分钟)
- 可设置不缩容条件如下
- 含有本地存储的节点
- 含有 Kube-system namespace 下
- 非 DaemonSet 管理的 pod 的节点
- 完全空闲节点可并发缩容,可设置最大并发缩容数。请注意,非完全空闲节点将逐个缩容,降低对业务的影响。
节点池注意事项
节点池底层依赖腾讯云的弹性伸缩产品,我们建议通过节点池控制台/API 来管理节点池,在弹性伸缩控制台操作导致的后果 TKE 无法保障,具体注意事项请参见如下表格:
参考资料
[1]
节点池概述: https://cloud.tencent.com/document/product/457/43719
[2]
创建节点池: https://cloud.tencent.com/document/product/457/43735
[3]
查看节点池: https://cloud.tencent.com/document/product/457/43736
[4]
调整节点池: https://cloud.tencent.com/document/product/457/43737
[5]
删除节点池: https://cloud.tencent.com/document/product/457/43738
[6]
扩缩容相关Q&A: https://cloud.tencent.com/document/product/457/32316
[7]
Cluster Autoscaler FAQ: https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md