#32218·Helm

升级时 Helm 忽略所有权

作者: mark007创建于 2026年6月15日更新于 2026年9月15日

发生了什么事?

当使用`-获取-所有权 ' 将资源从一个单元转移到另一个单元,然后将原始单元升级为不再包括该资源的一个版本时,掌舵将资源从群组中删除——尽管它现在由另一个单元拥有。

最近在第31584号公关案(解决了第31333号公关案)uninstall中就确定了这一点。 然而,升级路径没有相应的所有权检查。

当掌舵计算升级时,它只根据helm.sh/release-policy: keep'是否存在——它不检查meta.helm.sh/release-name'或`meta.helm.sh/release-namespace',就删除了孤儿资源。

删除在`update ()'函数中的 " pkg/kube/client.go " 中(约行647):

开始 为 ,信息:=范围正本。 差异(目标){ //.

继续 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 如果错误 : = 删除资源( info, medav1. DeletePropagationBackground); 错误 ! = 无 {


检查`helm.sh/资源-政策:保留',但不检查`meta.helm.sh/release-name'。 在此添加所有权检查(类似于未安装路径中的`核查Ownership BeforeDelete')将完成该功能。

你想怎样?

当将发布-a升级到不再包含资源的版本时,掌舵在删除前应当检查活版所有权说明. 如果资源上的`meta.helm.sh/release-name'指不同的发布(例如release-b),它应该跳过删除——现在的`helm uninstall'在PR #31584之后也是这样.

我们如何复制(尽可能少和准确)?

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
# 创建两个简单的图表:
#图-a-v1:包含配置图"共享-配置"+配置图"自有"
# chart-a-v2: 仅包含 ConfigMap "chart-a-own" (共享配置已删除)
#图-b-v1:包含配置图"共享-配置"+配置图"图-b-自有"

# 第1步:安装图表-a v1
方向盘安装放行-a./chart-a-v1 -n测试

# 第2步:安装图表-b,采用共享配置
舵安装放行-b./chart-b-v1 -n 测试-取用-所有权

# 验证转让的所有权 :
kubectl 获得配置图 共享配置 -n 测试 -o jsonpath='{.metadata.annotations}'
##"meta.helm.sh/放行-名称":"放行-b",meta.helm.sh/放行-名称空间":"测试"]

# 第3步:将发布-a升级到v2(将共享配置从它的出品单中移除)
掌舵升级发布-a./chart-a-v2 -n测试

# 结果:共享配置是 DELETED, 尽管释放b拥有它
kubectl 获得配置图共享配置 -n 测试
# 服务器出错( NotFound): 配置“ 共享- 配置” 找不到

相反,** uninstall** 工作正确:

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

(与上文相同,步骤1-2)

方向盘未安装释放-a-n测试

级别=WARN msg="删除不属于此发布的资源"类型= ConfigMap name=shared-config

1号 . . . . . . .