spec.storage.retainOnDelete 通过 CRD 校验、随 CRD 发布,但没有任何 controller 读它。
spec.storage.retainOnDelete
设成 true 描述的是本来就会发生的事 —— world PVC 是 StatefulSet 的 VolumeClaimTemplate,删除 StatefulSet 不会级联删除模板 PVC,operator 里也没有任何 finalizer。设成 false 是更糟的那一半:它读起来像是"请删掉这个世界",实际被静默忽略。
true
false
Identified by Claude Opus 5 (claude-opus-5) while auditing the CRD's declared-but-unread fields on 2026-07-28.
internal/apis/felis/v1alpha1/minecraftserver_types.go:195-196
// RetainOnDelete keeps the PVC when the MinecraftServer is deleted. RetainOnDelete bool `json:"retainOnDelete,omitempty"`
deploy/crd/felis.lolicon.best_minecraftservers.yaml:272-273
docs/troubleshooting.md:493
controller 侧无命中。
二选一,不留第三种状态:operator 真的按这个字段决定 PVC 的去留(需要 finalizer),或者把字段从类型和 CRD 里删掉。
冻结的 Felis-Spec-V4.1.md §5 要求的是前者:「删除:finalizer 清 Service/STS/ConfigMap,PVC 按 retainOnDelete」。但那个 finalizer 列出的另外三件事(Service / StatefulSet / ConfigMap)ownerReference GC 已经在做,所以它唯一新增的动作就是删世界 —— 而这条路径不经过 reaper 的「先证明有备份」检查。reaper 是系统里唯一被允许销毁世界的东西,它靠先验证备份换来这个权限。开第二扇不做这个检查的门不是改进。
Felis-Spec-V4.1.md §5
选哪条需要拍板,因为删字段就是偏离一份冻结的版本化文档。
正文更正于 2026-07-28:本条原先误贴了 #9(per-credential UV)的正文,标题一直是对的。
已按「移除」落地(23792d6):RetainOnDelete 从类型与 CRD 全仓删除;docs/troubleshooting.md §13 记录了移除而非实现的理由——实现它等于新增一条绕过 reaper「先验证备份再删世界」的删除路径,而 spec 里其余 finalizer 职责(Service/StatefulSet/ConfigMap)本由 ownerReference GC 覆盖。CR 上残留的键由 apiserver 静默 prune,行为不变。复核:grep -rn RetainOnDelete 全仓 0 命中(文档历史叙述除外)。
23792d6
RetainOnDelete
docs/troubleshooting.md
grep -rn RetainOnDelete
No dependencies set.
The note is not visible to the blocked user.
问题
spec.storage.retainOnDelete通过 CRD 校验、随 CRD 发布,但没有任何 controller 读它。设成
true描述的是本来就会发生的事 —— world PVC 是 StatefulSet 的 VolumeClaimTemplate,删除 StatefulSet 不会级联删除模板 PVC,operator 里也没有任何 finalizer。设成false是更糟的那一半:它读起来像是"请删掉这个世界",实际被静默忽略。证据
Identified by Claude Opus 5 (claude-opus-5) while auditing the CRD's declared-but-unread fields on 2026-07-28.
internal/apis/felis/v1alpha1/minecraftserver_types.go:195-196— 字段声明:deploy/crd/felis.lolicon.best_minecraftservers.yaml:272-273— 随 CRD 发布并参与校验docs/troubleshooting.md:493把它列为 [INERT],是那张表里唯一一个真正没人读的字段controller 侧无命中。
验收
二选一,不留第三种状态:operator 真的按这个字段决定 PVC 的去留(需要 finalizer),或者把字段从类型和 CRD 里删掉。
备注
冻结的
Felis-Spec-V4.1.md §5要求的是前者:「删除:finalizer 清 Service/STS/ConfigMap,PVC 按 retainOnDelete」。但那个 finalizer 列出的另外三件事(Service / StatefulSet / ConfigMap)ownerReference GC 已经在做,所以它唯一新增的动作就是删世界 —— 而这条路径不经过 reaper 的「先证明有备份」检查。reaper 是系统里唯一被允许销毁世界的东西,它靠先验证备份换来这个权限。开第二扇不做这个检查的门不是改进。选哪条需要拍板,因为删字段就是偏离一份冻结的版本化文档。
正文更正于 2026-07-28:本条原先误贴了 #9(per-credential UV)的正文,标题一直是对的。
已按「移除」落地(
23792d6):RetainOnDelete从类型与 CRD 全仓删除;docs/troubleshooting.md§13 记录了移除而非实现的理由——实现它等于新增一条绕过 reaper「先验证备份再删世界」的删除路径,而 spec 里其余 finalizer 职责(Service/StatefulSet/ConfigMap)本由 ownerReference GC 覆盖。CR 上残留的键由 apiserver 静默 prune,行为不变。复核:grep -rn RetainOnDelete全仓 0 命中(文档历史叙述除外)。