4. Pluto 工具深度解析:工作原理、版本范围与检测规则结构
Pluto 是目前 Kubernetes 生态中最成熟的 API 弃用静态检测工具。它通过分析集群中已部署资源的 API 版本,与官方弃用时间表进行比对,提前发现升级风险。本节从原理、版本覆盖和规则文件三个维度进行深度拆解。
4.1 Pluto 工作原理
Pluto 采用 “静态清单 + 版本映射” 的检测模型,不依赖集群实时状态,仅需资源清单文件或 Helm Release 记录即可完成扫描。其核心工作流分为四个阶段:
- 输入解析:支持多种输入源,包括本地 YAML 文件、Helm Chart 渲染输出、标准输入(stdin)以及直接连接集群 API Server 获取实时资源。
- 资源版本提取:从每个资源的
apiVersion字段中提取 Group、Version、Kind(GVK)三元组。 - 弃用状态匹配:将提取的 GVK 与内置的 弃用规则文件 进行比对,判断该版本是否已被弃用、已移除或仍受支持。
- 结果输出:以表格、JSON 或 YAML 格式输出检测结果,包含资源名称、命名空间、当前版本、目标版本、严重级别和移除版本号。
关键设计原则: Pluto 不执行 Dry-Run 或模拟升级,它只做版本号匹配。这意味着它无法检测 CRD 自定义资源的弃用状态,也无法感知集群实际安装的 Kubernetes 版本。用户需要手动指定目标版本(
--target-version)来触发对应的弃用规则。
4.2 支持的 Kubernetes 版本范围
Pluto 的版本覆盖策略与 Kubernetes 官方版本生命周期严格对齐。每个 Pluto 版本会打包从 v1.16 到当前最新稳定版(如 v1.30)的完整弃用规则。下表列出关键版本节点的 API 弃用事件:
| K8s 版本 | 主要弃用事件 | Pluto 检测支持 |
|---|---|---|
| v1.16 | NetworkPolicy、PodSecurityPolicy 等进入 GA | ✅ 完整支持 |
| v1.22 | 移除 v1beta1 版本的 Ingress、CronJob 等 API | ✅ 完整支持 |
| v1.25 | PodDisruptionBudget v1beta1 移除;PodSecurityPolicy 移除 | ✅ 完整支持 |
| v1.26 | FlowSchema / PriorityLevelConfiguration v1beta2 移除 | ✅ 完整支持 |
| v1.29+ | 持续跟踪 beta API 的 GA 化进程 | ✅ 最新规则 |
版本选择建议: 在升级节点池集成场景中,建议始终使用 Pluto 的最新稳定版本(当前为 v5.x)。旧版 Pluto 可能缺少新版 Kubernetes 的弃用规则,导致漏报。可通过
pluto version 查看内置规则覆盖的版本范围。
4.3 检测规则文件结构
Pluto 的检测规则以 YAML 文件 形式存储,位于工具安装目录的 rules/ 子目录下。每个规则文件对应一个 Kubernetes 版本,文件名格式为 v1.xx.yaml。规则文件的核心结构如下:
# rules/v1.25.yaml 示例片段
apiVersion: v1
kind: DeprecatedAPIRules
metadata:
name: kubernetes-v1.25
version: "1.25"
rules:
- group: "networking.k8s.io"
versions:
- name: "v1beta1"
deprecated: true
deprecationVersion: "1.19"
removalVersion: "1.22"
replacement: "networking.k8s.io/v1"
- name: "v1beta2"
deprecated: true
deprecationVersion: "1.22"
removalVersion: "1.25"
replacement: "networking.k8s.io/v1"
- group: "policy"
versions:
- name: "v1beta1"
deprecated: true
deprecationVersion: "1.21"
removalVersion: "1.25"
replacement: "policy/v1"
- group: "batch"
versions:
- name: "v1beta1"
deprecated: true
deprecationVersion: "1.21"
removalVersion: "1.25"
replacement: "batch/v1"
规则文件的关键字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
group |
string | API 组名称,如 networking.k8s.io、policy、batch |
versions[].name |
string | API 版本名称,如 v1beta1、v1beta2 |
versions[].deprecated |
bool | 是否已弃用(true 表示该版本不应再使用) |
versions[].deprecationVersion |
string | 首次标记为弃用的 Kubernetes 版本 |
versions[].removalVersion |
string | 计划移除该版本的 Kubernetes 版本 |
versions[].replacement |
string | 推荐的替代 API 版本(完整 GVK 格式) |
4.4 自定义规则扩展
Pluto 支持用户通过 --custom-rules 参数加载自定义规则文件,适用于以下场景:
- 私有 CRD 弃用管理:为内部 CRD 定义弃用时间线,统一纳入检测流程。
- 企业版本策略:在官方弃用时间基础上提前标记某些版本为“禁止使用”。
- 多集群版本差异:为不同集群维护独立的规则集,避免误报。
注意: 自定义规则文件的格式必须与官方规则文件完全一致。Pluto 不会校验自定义规则的逻辑正确性,错误的
removalVersion 可能导致检测结果失真。建议在 CI 中同时运行官方规则和自定义规则,对比差异。