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-apre-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。