我非常高兴地与大家分享一个重要的里程碑 ——Karpenter[1] 已经发布了 1.0 版本。Karpenter 是由 亚马逊网络服务(AWS)[2] 开发的开源 Kubernetes 集群自动扩缩容工具,这一版本的发布标志着 Karpenter 从测试阶段正式迈入稳定阶段,带来了稳定的 API 以及多个新功能。
▲Karpenter 架构图,来源于 Infracloud
Karpenter 的发展历程
Karpenter 最早于 2021 年 11 月推出,迅速发展成为一个全面的 Kubernetes 原生节点生命周期管理器。该项目不仅在业界获得了广泛认可,例如 Slack 采用 Karpenter 的案例 [3],还跻身 AWS GitHub 最受欢迎的前十个开源项目之列。
在 Himanshu Verma 为 Infracloud[4] 撰写的一篇文章中,他详细介绍了 Karpenter 如何消除预配置节点组和资源大小配置的需求,直接使用启动模板管理实例。Karpenter 能够根据需要自动配置新节点,实时响应无法调度的 Pod,通过动态调整集群计算容量,实现性能和成本的最优化。
Karpenter 1.0 的新特性
Karpenter 1.0 版本带来了许多修复和新功能,以下是一些关键特性:
• 增强的中断控制:用户现在可以按原因设置中断预算,允许对节点中断进行更细粒度的控制,适用于资源不足、空闲或漂移等场景。
• 合并策略重命名:“WhenUnderutilized” 策略现已更名为 “WhenEmptyOrUnderutilized”,以增强清晰度。
• 新增合并控制:“consolidateAfter” 参数允许用户指定在添加或移除 Pod 后,Karpenter 等待多长时间再进行节点合并。
• 终止宽限期:新增的 “terminationGracePeriod” 设置,使集群管理员能够更好地控制节点的生命周期和优雅终止。
• 漂移功能推广:漂移功能现在默认启用,用于替换偏离预期状态的节点。
• AMI 选择变化:“amiSelectorTerms” 字段现为必填项,并新增了 “alias” 术语,允许用户选择特定版本的 Amazon EKS 优化 AMI。
• 实例元数据服务(IMDS)访问限制:为了提高安全性,默认情况下阻止 Pod 访问 IMDS。
• Kubelet 配置迁移:Kubelet 设置已迁移到 EC2NodeClass API。
• NodeClaims 不可变更:NodeClaims 创建后无法再修改,以符合预期行为。
• NodePool nodeClassRef 变更:所有 nodeClassRef 字段现为必填项,“apiVersion” 字段已更名为 “group”。
• 指标变更:多个 Prometheus 指标已修改,用户可能需要更新其仪表盘。
此外,Karpenter 1.0 还计划弃用某些注解和基于 ConfigMap 的配置方式。
升级指南与用户反馈
对于使用测试版本的用户,AWS 提供了通过 Kubernetes webhook 转换进行迁移的路径,前提是用户已经使用了最新 API 版本。此过程允许在不替换节点的情况下进行就地 API 升级。然而,建议用户在生产环境之外的环境中仔细查看完整的迁移文档并测试升级过程。
在 X(原 Twitter)上的一段 视频演示 [5] 中,Olalekan Taofeek[6] 详细解释了如何将 Karpenter 从 0.37 版本升级到 1.0 版本,这一版本跨度超出了迁移路径的预期。他指出了几个需要特别注意的重大变化:
・用户数据不再用于 Kubernetes 配置。
・节点池 / 组配置的更改 ——API 版本和字段名称已更改,用户需要更新配置。
・新增了一个 “startup time” 字段,用户需要在工作负载中考虑。
・某些字段已从节点池迁移到节点类配置中。
Karpenter 1.0 的发布受到了广泛好评,Vatsal Bajpai[7] 在 X(原 Twitter)上表示:
"Karpenter 已成为云上 k8s 的关键工具,看到这一点真高兴!"
在 Reddit 的讨论中,用户普遍对这一版本表示赞赏,有人指出 Azure 也有对应的端口 [8],但也有用户 感叹缺乏 GCP 支持 [9]。还有用户 思考是否可以将 Karpenter 的功能完全集成到 EKS 控制平面 [10] 中。
结语
Karpenter 1.0 的发布不仅标志着其从测试阶段的成熟,也为 Kubernetes 集群的自动扩缩容管理带来了更多稳定性和功能性。随着社区的不断壮大和用户反馈的积极响应,Karpenter 有望在未来继续引领 Kubernetes 生态系统的发展。