Helm升级时如何配置values.yaml忽略指定Pod组件更新
Helm升级时指定Pod不更新、不存在则新建的配置方案
Helm原生没有仅通过values配置直接跳过指定资源升级的内置能力,需要先对Chart模板做轻量适配,再配合values配置实现需求,具体操作如下:
1. Chart模板侧适配(必做)
找到abc.tgz解压后c-pod对应的工作负载模板文件(通常路径为templates/c-pod/deployment.yaml,若为StatefulSet/Pod则调整对应apiVersion和kind即可),替换原有模板内容为带存在性判断的逻辑:
{{/* 查询当前命名空间下是否已存在c-pod对应工作负载 */}} {{- $existingCPod := lookup "apps/v1" "Deployment" .Release.Namespace "c-pod" }} {{- if $existingCPod }} {{/* 资源已存在时,直接返回集群现有配置,保证渲染结果和集群状态无差异,不会触发更新 */}} {{ toYaml $existingCPod }} {{- else }} {{/* 资源不存在时,使用Chart原有配置渲染,触发新建逻辑 */}} apiVersion: apps/v1 kind: Deployment metadata: name: c-pod namespace: {{ .Release.Namespace }} labels: app: c-pod spec: replicas: {{ .Values.cPod.replicas | default 1 }} selector: matchLabels: app: c-pod template: metadata: labels: app: c-pod spec: containers: - name: c-pod image: {{ .Values.cPod.image | default "registry.example.com/c:v1.0.0" }} # 保留原有c-pod的所有其他配置(端口、挂载、资源限制等) {{- end }}
说明:
lookup是Helm内置模板函数,可在渲染阶段查询集群实时资源状态;当资源已存在时直接输出集群现有配置,Helm三向对比(历史版本配置、新版本渲染结果、集群实时状态)不会检测到差异,就不会触发c-pod的更新操作。
2. new_values.yaml配置
模板适配完成后,new_values.yaml中正常填写a-pod、b-pod的新版本配置即可,c-pod的配置段可留空或保留默认值,不会覆盖已存在的c-pod实例,示例配置:
# a-pod 新版本配置,升级时正常生效 aPod: image: registry.example.com/a:v2.1.0 replicas: 2 resources: limits: cpu: "2" memory: 4Gi # b-pod 新版本配置,升级时正常生效 bPod: image: registry.example.com/b:v2.1.0 replicas: 3 config: env: prod logLevel: info # c-pod 配置可保留默认值,已存在实例不会被变更 cPod: {}
注意事项
- 若使用的是第三方公共Chart、无Chart模板修改权限,仅靠values配置无法原生实现该逻辑,可在升级命令中追加
--dry-run=server参数预览全量变更,确认c-pod无预期外修改后再执行正式升级。 - 不要误用
helm.sh/resource-policy: keep注解,该注解仅在helm uninstall时生效,作用是保留对应资源不被删除,无法拦截upgrade过程中的资源更新操作。 - 正式执行升级前建议先加
--dry-run参数执行模拟升级,确认a-pod、b-pod为新版本配置、c-pod无变更后再执行实际操作。
内容的提问来源于stack exchange,提问作者auggie321
相关产品推荐
相关产品推荐

