Helm3中before-hook-creation钩子删除策略未生效问题排查
我有一个名为myapp的Helm Chart,其中包含一个作为pre-install和pre-upgrade钩子的Job,配置了before-hook-creation的hook-deletion-policy:
apiVersion: batch/v1 kind: Job metadata: name: "job-{{ .Release.Name }}-{{ .Release.Revision }}" labels: app.kubernetes.io/managed-by: {{ .Release.Service | quote }} app.kubernetes.io/instance: {{ .Release.Name | quote }} app.kubernetes.io/version: {{ .Chart.AppVersion }} helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" annotations: # This is what defines this resource as a hook. Without this line, the # job is considered part of the release. "helm.sh/hook": pre-install,pre-upgrade "helm.sh/hook-weight": "1" "helm.sh/hook-delete-policy": "before-hook-creation" spec: template: metadata: name: "{{ .Release.Name }}" labels: app.kubernetes.io/managed-by: {{ .Release.Service | quote }} app.kubernetes.io/instance: {{ .Release.Name | quote }} helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" spec: restartPolicy: Never containers: - name: post-install-job image: "alpine:3.3" command: ["/bin/sleep","{{ default "10" .Values.sleepyTime }}"]
根据Helm文档描述:
before-hook-creation: 在启动新钩子之前删除旧资源(默认策略)
按预期,第二次执行helm upgrade时,旧的job-myapp-1应该被删除,但实际并未生效;而改用hook-succeeded策略时,Job成功后能正常被删除。想确认是YAML配置有误,还是对before-hook-creation的理解存在偏差?
更新:
保留before-hook-creation配置:
"helm.sh/hook-delete-policy": before-hook-creation
修改Job名称,移除发布版本号:
name: "job-{{ .Release.Name }}"
修改后,多数发布会生成相同的Job名称,后续执行helm upgrade时Job会被替换,旧Job关联的Pod也会被删除。但存在一个问题:执行helm uninstall时Job不会被删除,因为Helm不会跟踪这些钩子资源。
问题原因解释
问题出在原Job名称包含{{ .Release.Revision }}——每次helm upgrade会递增Release版本号,导致新旧Job的名称完全不同。before-hook-creation策略只会删除同名称、同类型、属于当前发布实例的旧钩子资源,Helm通过资源的名称、元数据标签/注解来识别归属。当新旧Job名称不一致时,Helm无法识别旧Job是当前发布的钩子资源,因此不会触发删除操作。
改用固定名称后,新钩子创建前,Helm能匹配到同名称的旧钩子资源,所以会执行删除替换。但钩子资源不属于Helm跟踪的发布核心资源,因此helm uninstall不会清理这些钩子Job。
内容的提问来源于stack exchange,提问作者AnjK

