错误:升级失败:无法修补 "my-release"(类型 Deployment):Deployment.apps "my-release" 无效:spec.selector:无效值:v1.LabelSelector{...}:字段不可变
Error: UPGRADE FAILED: cannot patch "my-release" with kind Deployment: Deployment.apps "my-release" is invalid: spec.selector: Invalid value: v1.LabelSelector{...}: field is immutable
ID: kubernetes/helm-upgrade-failed-dry-run
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| helm 3.12 | active | — | — | — |
| kubernetes 1.27 | active | — | — | — |
| helm 3.13 | active | — | — | — |
根因分析
Helm 升级尝试修改现有 Deployment 上的不可变字段(例如 spec.selector),这是 Kubernetes API 不允许的。
English
A Helm upgrade attempts to modify an immutable field (e.g., spec.selector) on an existing Deployment, which is not allowed by the Kubernetes API.
官方文档
https://helm.sh/docs/helm/helm_upgrade/解决方案
-
运行 `kubectl delete deployment my-release` 删除 Deployment,然后执行 `helm upgrade --install my-release ./chart` 使用新选择器重新创建。
-
如果选择器更改是意外的,回滚:`helm rollback my-release <revision>` 到更改前的版本,然后修改 chart 以避免不可变字段更改。
无效尝试
常见但无效的做法:
-
80% 失败
The --force flag in Helm only recreates resources if the release name changes, but does not bypass immutable field validation on existing resources.
-
90% 失败
Editing the selector after creation is also rejected by the API; the field is immutable for all operations.
-
70% 失败
The old Deployment persists and still has the immutable field; Helm will try to patch it again.