prune 做什么
kubectl apply --prune 在应用清单的同时,删除「带指定标签选择器、但已不在清单里」的对象,让集群资源与目录内容严格对齐。它实现的是声明式清理:从清单里删掉一个资源,下一次 apply 时集群里的对应对象也会被清掉。代价在于删除范围由标签选择器决定——选择器写宽了就会删掉不该删的对象,所以必须限定范围,并先做 dry-run 查看将被删除的清单。
基本信息
| 用途 | 对齐删除:清理不在清单中的带标签对象 |
|---|---|
| 语法 | kubectl apply -f <目录或文件> --prune -l <标签选择器> |
| 关键参数 | --prune-allowlist 限定允许被清理的资源类型,不同版本语法与默认值有差异 |
| 前提条件 | 对象必须带上可用于筛选的标签 |
| 固有风险 | 执行的是删除操作,误删不可逆 |
典型使用场景
- 目录即真相:CI 发布时希望集群严格等于清单目录的内容
- 下线资源:直接删掉清单文件,靠 prune 同步清理集群对象
- 重命名场景:新名字生效后由 prune 回收旧对象
- 批量调整:一次 apply 同时补齐新增与清理删除
- 环境对齐:把测试环境收敛到与清单一致,清理手工残留
安全用法
安全用法
kubectl apply -f ./manifests --prune -l app=web --dry-run=server # 先看将被删除的对象
kubectl apply -f ./manifests --prune -l app=web # 确认后再执行
kubectl apply -f ./manifests --prune -l app=web --prune-allowlist=apps/v1/Deployment
kubectl get all -l app=web # 执行后核对剩余对象参数与概念
| 参数或概念 | 含义 | 注意 |
|---|---|---|
| -l 选择器 | 限定 prune 作用范围 | 必须写,否则影响面不可控 |
| --dry-run=server | 输出将被删除的对象而不真删 | 生产使用前的必做步骤 |
| --prune-allowlist | 限定允许清理的资源类型 | 跨版本语法与默认值有差异,先查文档 |
| 标签基线 | 清单与集群共用的标签约定 | 两者不一致会导致误删或清理不到 |
prune 依赖标签筛选:工作负载清单里要带统一标签(例如 app.kubernetes.io/part-of=web),否则基于选择器的清理无从下手,或者只能靠过宽的选择器冒险执行。
不写选择器、或在共享命名空间里使用过宽标签时,可能连带删除其他团队的对象,执行前务必用 dry-run 逐条核对删除清单。