Helm 提供了一个 hook 机制,允许在 release 的生命周期中的某些点进行干预。例如,可以使用 hooks 进行如下操作:
Hooks 像常规模板一样工作,但它们具有特殊的注释,可以使 Helm 以不同的方式使用它们。
功能 | 参数 | 描述 |
---|---|---|
安装前 | pre-install | 在模板渲染后,资源加载到Kubernetes前,执行 |
安装后 | post-install | 在所有资源加载到Kubernetes后,执行 |
删除前 | pre-delete | 删除任何release资源前,执行 |
删除后 | post-delete | 删除所有release资源后,执行 |
升级前 | pre-upgrade | 在模板渲染后,资源加载到Kubernetes前,执行 |
升级后 | post-upgrade | 在所有资源加载到Kubernetes后,执行 |
回滚前 | pre-rollback | 在渲染模板后,资源加载到Kubernetes前,执行 |
回滚后 | post-rollback | 在所有资源加载到Kubernetes后,执行 |
Hooks 让 chart 开发人员有机会在 release 的生命周期中的关键点执行操作。
默认情况下,release-a
的生命周期如下:
helm install chart-a
假设在上述release-a的生命周期中定义两个hook:pre-install
和post-install
,新的生命周期如下:
helm install chart-a
pre-install
hook (将hook资源加载到kubernetes中)--wait
标志,Tiller等待直到所有资源都处于就绪状态,并且在准备就绪前不会运行post-install
hook)post-install
hook(将hook资源加载到kubernetes中)加粗的步骤为执行hook操作的步骤。添加Hook权重是比较好的做法,如果权重不重要则设置为0,默认也为0。
等到 hook 准备就绪取决于在 hook 中声明的资源:
Hook创建的资源不作为release的一部分进行跟踪或管理。一旦Tiller验证Hook已经达到其就绪状态,它将Hook资源放在一边。
这意味着在 Hook 中创建资源,则不能依赖于 helm delete
删除资源。要销毁这些资源,需要编写代码在 pre-delete
或 post-delete
Hook中执行此操作,或者将 "helm.sh/hook-delete-policy"
注释添加到 Hook 模板文件。
Hook也是Kubernetes的manifest文件,只是在metadata部分有特殊注释 。Hook也是模板文件,可以使用模板的所有功能,包括读取 .Values
,.Release
和 .Template
。
创建一个Hook文件存放在 templates/post-install-job.yaml
文件中,将其声明为在post-install
阶段运行:
apiVersion: batch/v1
kind: Job
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}}
annotations:
# 在这里添加注释,将资源定义为Hook,没有这些注释,这个资源将被认为是release的一部分
"helm.sh/hook": post-install,post-upgrade # 部署为多个Hook
"helm.sh/hook-weight": "-5" # 设置Hook的权重,确定执行顺序,
# 权重可以是正数或负数,但必须表示为字符串
"helm.sh/hook-delete-policy": hook-succeeded # 定义删除Hook资源的时间和策略
# hook-succeeded:在执行成功后删除hook
# hook-failed:在执行失败后删除hook
# before-hook-creation:创建新hook之前删除旧hook
"helm.sh/resource-policy": keep # 指示Tiller在helm delete操作过程中跳过此资源(将变成孤儿)
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}}"]
per-install
Hook。