4. Pluto 工具深度解析:工作原理、版本范围与检测规则结构

Pluto 是目前 Kubernetes 生态中最成熟的 API 弃用静态检测工具。它通过分析集群中已部署资源的 API 版本,与官方弃用时间表进行比对,提前发现升级风险。本节从原理、版本覆盖和规则文件三个维度进行深度拆解。

4.1 Pluto 工作原理

Pluto 采用 “静态清单 + 版本映射” 的检测模型,不依赖集群实时状态,仅需资源清单文件或 Helm Release 记录即可完成扫描。其核心工作流分为四个阶段:

  1. 输入解析:支持多种输入源,包括本地 YAML 文件、Helm Chart 渲染输出、标准输入(stdin)以及直接连接集群 API Server 获取实时资源。
  2. 资源版本提取:从每个资源的 apiVersion 字段中提取 Group、Version、Kind(GVK)三元组。
  3. 弃用状态匹配:将提取的 GVK 与内置的 弃用规则文件 进行比对,判断该版本是否已被弃用、已移除或仍受支持。
  4. 结果输出:以表格、JSON 或 YAML 格式输出检测结果,包含资源名称、命名空间、当前版本、目标版本、严重级别和移除版本号。
关键设计原则: Pluto 不执行 Dry-Run 或模拟升级,它只做版本号匹配。这意味着它无法检测 CRD 自定义资源的弃用状态,也无法感知集群实际安装的 Kubernetes 版本。用户需要手动指定目标版本(--target-version)来触发对应的弃用规则。
Pluto 工作流程示意图 Pluto 四阶段工作流程 输入解析 YAML / Helm / API 版本提取 GVK 三元组 弃用匹配 规则文件比对 结果输出 表格 / JSON 输入源说明 • 本地文件:pluto detect-files -f deploy.yaml • Helm Release:pluto detect-helm --release-name myapp • 集群实时:pluto detect-api-resources --target-version 1.25 • 标准输入:kubectl get deploy -o yaml | pluto detect-files -f -

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 格式)
Pluto 规则文件结构 Pluto 规则文件结构(v1.25.yaml) DeprecatedAPIRules metadata.name rules[] metadata.version rules[].versions[] 内部字段 group: networking.k8s.io → versions: [{name: v1beta1, deprecated: true, deprecationVersion: 1.19, removalVersion: 1.22, replacement: networking.k8s.io/v1}]

4.4 自定义规则扩展

Pluto 支持用户通过 --custom-rules 参数加载自定义规则文件,适用于以下场景:

  • 私有 CRD 弃用管理:为内部 CRD 定义弃用时间线,统一纳入检测流程。
  • 企业版本策略:在官方弃用时间基础上提前标记某些版本为“禁止使用”。
  • 多集群版本差异:为不同集群维护独立的规则集,避免误报。
注意: 自定义规则文件的格式必须与官方规则文件完全一致。Pluto 不会校验自定义规则的逻辑正确性,错误的 removalVersion 可能导致检测结果失真。建议在 CI 中同时运行官方规则和自定义规则,对比差异。