Karpenter 兼容性与升级指南:Kubernetes 版本矩阵、破坏性变更策略与 Release 发布类型全解析
【免费下载链接】karpenter-provider-awsKarpenter is a Kubernetes Node Autoscaler built for flexibility, performance, and simplicity.项目地址: https://gitcode.com/GitHub_Trending/ka/karpenter-provider-aws
本文围绕 Karpenter(karpenter-provider-aws)官方文档中的 Compatibility 章节展开,系统讲解 Karpenter 与 Kubernetes 版本的兼容性矩阵、破坏性变更(breaking change)的引入与发现机制、安全补丁策略,以及 Stable / RC / Snapshot 三种发布类型的差异与使用方式。读完本文,你将能够根据 Kubernetes 集群版本精确选择 Karpenter 版本,理解升级前必须检查的兼容性要点,并掌握 Snapshot 与 RC 版本的获取与验证方法。
兼容性总览:升级前必须回答的两个问题
Karpenter 是一个运行在集群内的 Kubernetes 节点自动扩缩容控制器(Node Autoscaler),但它与 Kubernetes 版本的耦合方式和 Cluster Autoscaler 不同——Karpenter 并不绑定某个特定的 Kubernetes 版本,因此你可以使用现有的集群升级机制升级 Kubernetes 核心组件,同时单独保持 Karpenter 的版本更新以获取 Bug 修复和新特性。
在开始升级 Karpenter 之前,官方文档要求用户重点考虑两类兼容性问题:
- Karpenter 与 Kubernetes 版本的兼容性(即下文 Compatibility Matrix 表格);
- Karpenter 与 NodePool API(旧称 Provisioner)的兼容性——升级是否涉及 API 变更、是否需要迁移自定义资源。
此外,需要特别注意的是:Karpenter v1.0.0 发布后,官方已停止支持 v0.36 及以下版本(见 升级指南 中的警告),建议始终升级到最新版本,以持续获得 Bug 修复与新特性。
兼容性矩阵(Compatibility Matrix)
下表为 Karpenter 与 Kubernetes 各版本的官方兼容性矩阵,展示的是当前 preview 文档中 Karpenter 与 Kubernetes 的版本对应关系(每个 Kubernetes 版本列对应“最低可用的 Karpenter 版本”):
| Kubernetes | 1.30 | 1.31 | 1.32 | 1.33 | 1.34 | 1.35 | 1.36 |
|---|---|---|---|---|---|---|---|
| karpenter | >= 0.37 | >= 1.0.5 | >= 1.2 | >= 1.5 | >= 1.6 | >= 1.9 | >= 1.13 |
解读该矩阵时需要注意:
- 每个单元格给出的是该 Kubernetes 版本下允许使用的最低 Karpenter 版本。例如运行 Kubernetes 1.34 的集群,Karpenter 版本必须不低于 1.6;
- 矩阵只列出“当前文档快照”所覆盖的最近 7 个 Kubernetes 版本(1.30 ~ 1.36),更早的历史对应关系可以通过仓库中的完整数据源查看。
矩阵的生成机制:从 YAML 数据到 Markdown 表格
该表格并非手写维护,而是由仓库中的代码自动生成的。表格前后存在两行生成标记注释:
- 起始标记:
[comment]: <> (the content below is generated from hack/docs/compatibilitymatrix_gen/main.go) - 结束标记:
[comment]: <> (end docs generated content from hack/docs/compatibilitymatrix_gen/main.go)
生成器入口位于 hack/docs/compatibilitymatrix_gen/main.go,其工作流程是:
- 读取目标 Markdown 文件,定位上述两行生成标记之间的区域;
- 解析 YAML 数据源(通过
kompat.Parse(os.Args[2])); - 调用
baseText.Markdown(kompat.Options{LastN: numOfk8sVersion})渲染表格,仅保留最近 N 个 Kubernetes 版本列,然后写回标记区域内。
而矩阵的完整数据源位于 hack/docs/compatibilitymatrix_gen/compatibility.yaml,它以appVersion(Karpenter 版本)、minK8sVersion(最低 Kubernetes 版本)、maxK8sVersion(最高 Kubernetes 版本)三元组的形式记录了从 0.21.x 到 1.14.x 的全部兼容区间。例如:
0.37.x:支持 Kubernetes 1.23 ~ 1.30;1.0.x:支持 Kubernetes 1.25 ~ 1.30(1.0.5起扩展到 1.31);1.9.x~1.12.x:支持 Kubernetes 1.26 ~ 1.35;1.13.x、1.14.x:支持 Kubernetes 1.26 ~ 1.36。
矩阵渲染的源码细节
表格的实际排版由 tools/kompat/pkg/kompat/kompat.go 完成,其中几个关键函数值得关注:
expand()(kompat.go):把minK8sVersion ~ maxK8sVersion区间展开为单个 Kubernetes 版本到 Karpenter 版本列表的映射;Markdown()(kompat.go):根据Options{LastN}参数决定展示最近多少个 Kubernetes 版本列,并调用semverRange()将版本列表渲染为\>= 1.13这样的范围字符串;Validate()(kompat.go):在解析 YAML 时校验每个appVersion、minK8sVersion、maxK8sVersion是否满足 SemVer 规范,非法版本会直接导致解析失败;IsCompatible()(kompat.go):提供程序化校验入口,传入数据文件、Karpenter 版本与 Kubernetes 版本即可判断是否兼容——支持精确匹配(如1.0.5)与通配匹配(如1.2.x前缀)两种规则。
也就是说,这张兼容性矩阵既是文档内容,也是一份可被kompat这类工具直接消费的结构化数据。仓库中的 tools/kompat/README.md 展示了它的 CLI 用法,例如kompat hack/compatibility-karpenter.yaml -n 5可输出最近 5 个 Kubernetes 版本的兼容性表格。
兼容性问题:破坏性变更的处理策略
为了降低升级成本,Karpenter 团队的目标是尽量减少破坏性变更的引入。官方在 compatibility.md 中明确了“当确实需要引入破坏性变更时”所遵循的规则。
版本语义:Semantic Versioning 2.0.0
Karpenter 的稳定版本遵循 Semantic Versioning 2.0.0(即x.y.z格式)。而在主版本为 0 的阶段(0.y.z),按照 SemVer 规范第 4 条,任何内容都可能随时变化。
为了在0.y.z阶段进一步保护用户,Karpenter 团队承诺:破坏性变更只会在 minor 版本(递增 y 的版本)中引入。注意这并不代表每次 minor 升级都包含破坏性变更——当发布新特性时同样会递增 minor 版本号。
因此官方建议:每次升级到新的 minor 版本时,都应检查该版本是否存在破坏性变更,并查阅对应的 release notes 与升级说明。
如何引入不兼容(How Do We Break Incompatibility)
当需要引入破坏性变更时,Karpenter 团队会严格执行以下三条:
- 主版本为 0 时递增 minor 版本号(即
0.35.0→0.36.0这类递增,而不是在 patch 中夹带破坏性变更); - 在 release upgrade notes 中新增一个永久独立的小节,命名为
upgrading to x.y.z+,清晰说明破坏性变更的内容以及用户侧需要执行的安全升级操作(仓库中对应的完整记录位于 upgrade-guide.md,其中从1.15.0一直回溯到0.6.2的逐版本升级说明均采用该命名规范); - 在 release notes 顶部以及所有相关公告中附加一句固定说明:“This is a breaking change, please refer to the above link for upgrade instructions”(这是破坏性变更,请参考上述链接获取升级指引)。
从 upgrade-guide.md 的实际内容可以看到这种机制的执行效果,例如:
1.1.0起移除v1beta1API 支持(必须事先完成 v1 迁移);0.33.0起仅支持 v1beta1 API,不再兼容旧的 Provisioner、AWSNodeTemplate、Machine alpha API;1.12.0引入 CA bundle 漂移检测,会导致存量节点被标记为 drifted;0.34.0引入 Disruption Budgets,改变了 disruption 的并行度语义。
每一个破坏性变更都被记录在独立小节中,方便用户在升级前逐条对照检查。
如何发现不兼容(How Do We Find Incompatibilities)
除了对所有代码变更执行 peer review(同行评审)之外,Karpenter 团队还规划了两项自动化手段来发现兼容性问题(文档中标注为 To be implemented,即规划中):
- 应用层面的兼容性自动化测试:自动化执行安装(install)、卸载(uninstall)、从旧版本升级(upgrade)以及回滚到旧版本(downgrade)等操作,以验证应用兼容性;
- 文档层面的兼容性自动化测试:将文档中的命令转化为可自动运行的脚本,验证文档与实际应用的一致性。
也就是说,当前阶段兼容性保障仍主要依赖代码评审,自动化兼容性测试属于明确的演进方向。
安全补丁策略(Security Patches)
- 主版本 0 阶段:不会为旧版本发布安全补丁,补丁只提供在最新版本中。因此处于
0.y.z版本的用户必须升级到最新版才能获得安全修复; - 主版本 1 阶段:将建立 EOL(end of life)策略,为一小部分旧版本提供安全补丁,其余版本进入弃用(deprecate)状态。
这进一步印证了“始终升级到最新版本”这一官方推荐做法。
发布类型(Release Types):Stable、RC 与 Snapshot
Karpenter 提供三种发布类型,它们在适用场景、镜像 tag 规则以及获取方式上差异明显。了解这些差异有助于在正确的时间选择正确的版本。
Stable Releases(稳定版)
- 唯一推荐用于生产环境的版本类型;
- 镜像 tag 使用语义化版本号,例如
0.35.0; - 注意:0.35.0 之前的稳定版 tag 带有
v前缀(例如v0.34.0)。从 0.35.0 起 tag 改为不带v的标准x.y.z格式,这一点也在升级指南的“Upgrading to 0.35.0+”小节中作为一项变更被记录。
Release Candidates(候选版)
- 官方会在**重要版本(major 与重要的 minor 版本)**发布前提供候选版;
- tag 格式为
x.y.z-rc.0、x.y.z-rc.1,随后该候选版会晋级为稳定版x.y.z; - 这一做法的目的是让早期采用者(early adopters)在大范围发布前先行测试,从而向团队提供早期反馈,最终产出更稳定的版本;
- 与稳定版相同,
0.35.0之前的候选版同样带有v前缀。
Snapshot Releases(快照版)
- 每当有 commit 合并进
aws/karpenter-provider-aws仓库时,就会产出一个 Snapshot 版本,让用户可以立即试用刚合并的新特性或修复,而无需等待数天或数周后的正式发布; - Snapshot 版不发布在与其他发布类型相同的公共 ECR 仓库中,而是发布到单独的 ECR 仓库;
- Helm chart 发布地址为
oci://{account_id}.dkr.ecr.{region}.amazonaws.com/karpenter/snapshot/karpenter(其中 account_id 与 region 由仓库文档参数填充),tag 为Karpenter 主版本号加 git commit hash,例如0-fc17bfc89ebb30a3b102a86012b3e3992ec08adf; - 任何拥有 AWS 账户的用户都可以拉取,但必须先完成认证:
aws ecr get-login-password --region {region} | docker login --username AWS --password-stdin {account_id}.dkr.ecr.{region}.amazonaws.com- 使用限制(官方明确警告):
- Snapshot 版仅适用于测试与故障排查场景,不应用于生产环境;
- Snapshot 版是临时性的,发布 90 天后会被移除。
与发布类型相关的仓库佐证
仓库中的发布流程脚本 hack/release/release.sh 从侧面印证了发布机制的严谨性:脚本要求当前 commit 必须被 git tag 精确标记(git describe --exact-match --tags),且工作区必须干净(git status --porcelain为空),否则拒绝执行发布——这保证了发布版本与 tag、源码状态的严格对应。与此同时,charts 目录下保留了从karpenter-0.1.1.tgz到karpenter-0.16.3.tgz等历史 Helm chart 包,以及 charts/index.yaml 索引文件,可用于观察历史版本的发布轨迹。
升级实践建议:先核对兼容性,再执行升级
结合 upgrade-guide.md 中的实践指引,一个安全的升级流程应当包含以下环节:
- 核对兼容性矩阵:确认目标 Karpenter 版本支持当前集群的 Kubernetes 版本(即本文第一节的矩阵);
- 检查 minor 版本破坏性变更:逐条阅读 upgrade-guide.md 中对应
upgrading to x.y.z+小节,确认需要执行的迁移操作(例如 API 迁移、IAM 权限补充、指标名称调整等); - CRD 同步升级:Karpenter 的 CRD 与控制器版本强耦合,需要随 Karpenter 一同更新。仓库中 CRD 清单位于 charts/karpenter/crds(含 ec2nodeclasses、nodepools、nodeclaims 等),而独立的 karpenter-crd Helm chart 可用于管理 CRD 生命周期,推荐用它来避免“Helm 不管理随 chart 附带 CRD”的坑;
- 生产环境走 CI/CD 与分阶段验证:升级指南强调在 pre-upgrade 阶段校验 IAM 权限与 webhook 配置、备份 NodePool/NodeClass 配置;先在 staging 环境完成部署与节点供给验证,再经过人工审批后执行生产部署,并保留回滚配置。
小结
Karpenter 的兼容性治理可以概括为一套清晰的策略闭环:用兼容性矩阵回答“能用不能用”(数据驱动、代码生成的版本对应表),用语义化版本规范回答“何时引入破坏性变更”(仅在 minor 版本、且必须在升级说明中单独立节),用三种发布类型回答“如何获取合适的版本”(生产用 Stable、尝鲜用 RC、验证最新代码用 Snapshot)。对于生产集群,核心行动准则始终是:升级前核对矩阵、逐条对照升级说明、CRD 与控制器同步升级,并始终保持在最新稳定版本上以获取安全补丁与特性修复。
【免费下载链接】karpenter-provider-awsKarpenter is a Kubernetes Node Autoscaler built for flexibility, performance, and simplicity.项目地址: https://gitcode.com/GitHub_Trending/ka/karpenter-provider-aws
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考