每次伞图升级时,Helm 子图预升级挂钩 运行

Helm subchart pre-upgrade hooks run every time the umbrella chart is upgraded

我有一个带有子图的伞舵图。一些子图有 pre-install/pre-upgrade 个挂钩(工作)。 每次我运行 helm upgrade <release name> <umbrella chart> 执行所有子图的预升级钩子,即使对应的子图没有变化。

这是预期的行为吗?是否有可能 运行 子图挂钩仅在子图发生变化时才挂钩?

UPD:更多详情

这是图表结构:

parent_chart/
├─ charts/
│  ├─ child_chart_1/
│  │  ├─ templates/
│  │  │  ├─ hooks_1.yaml
│  │  │  ├─ deployment_1.yaml
│  │  ├─ Chart.yaml
│  │  ├─ values.yaml
│  ├─ child_chart_2/
│  │  ├─ templates/
│  │  │  ├─ deployment_2.yaml
│  │  │  ├─ hooks_2.yaml
│  │  ├─ Chart.yaml
│  │  ├─ values.yaml
├─ values.yaml
├─ Chart.yaml

挂钩清单如下所示:

apiVersion: batch/v1
kind: Job
metadata:
  name: {{ .Release.Name }}-migration-hook
  namespace: {{ .Values.namespace }}
  labels:
    app.kubernetes.io/managed-by: {{ .Release.Service | quote }}
    app.kubernetes.io/instance: {{ .Release.Name | quote }}
    helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
  annotations:
    "helm.sh/hook": pre-install, pre-upgrade
    "helm.sh/hook-weight": "-5"
    "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
spec:
  ...

假设此图表已安装。
然后我在 child_chart_1/values.yaml 中进行更改并升级伞图:

helm upgrade release_name parent_chart

hooks_1.yamlhooks_2.yaml 的升级挂钩期间,我只需要 hooks_1.yaml 到 运行,因为 [=19] 没有变化=].

尝试添加注释checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}以避免执行未更新的子图表。因此,如果未更改规范,则应用程序会保留 运行 旧配置,从而导致部署不一致。

更多信息请参考此'Chart Development Tips and Tricks' article


更新

这是预期的行为。你的 Helm 版本是多少?因为这完全是 Helm 2 中的预期行为,并且 Issue in GitHub 与您的问题类似。

我们还可以看到 resolution comment that's explaining of New 3-way Strategic Merge Patches 应该以某种方式解决这个问题,但在他们的例子中我看不到它是用注释 pre-upgrade 修复的。随便打开那个问题并 ping 他们。