Helm 提供一个hook机制,允许我们在发布一个版本的生命周期的某个点进行干预,做一些特殊的操作。比如:
- 在安装过程中对任务进行优先排序,如:加载其它组件前加载ConfigMap或Secret.
- 在安装/升级前备份数据库,在升级后恢复数据库。
- 在删除一个版本之前运行一个作业,以便在删除一个服务之前优雅地使其退出。
hook
hook的工作方式和普通模板是一样,只是它有特殊的注释(annotations)。一个有hook的模板会是这样的:
apiVersion: v1
kind: ConfigMap
metadata:
name: test
labels:
app: webserver
annotations:
"helm.sh/hook": pre-install
"helm.sh/hook-weight": "5"
"helm.sh/hook-delete-policy": before-hook-creation
这意义着ConfigMap会在其它安装之前被加载。可以使用的hook有:
pre-install
post-install
pre-delete
post-delete
pre-upgrade
post-upgrade
pre-rollback
post-rollback
test
详细可查看:helm.sh/docs/topics…
也可以将多个hook一起使用
annotations:
"helm.sh/hook": pre-install, pre-delete, post-rollback
hook-weight
为了建立一个确认性的执行顺序,需要为hook定义一个hook-weight( 默认将权重指定为0 ).
annotations:
"helm.sh/hook-weight": "5"
按照权重对hook进行排序,先加载最小权重的钩子(从负到正)
例如:
# hooks1.yaml
annotations:
"helm.sh/hook": pre-install
"helm.sh/hook-weight": "-1"
---
# hooks2.yaml
annotations:
"helm.sh/hook": pre-install
"helm.sh/hook-weight": "-5"
"helm.sh/hook-weight": "-5" 会第一个被执行。
hook-delete-policy
有三种删除策略可以使用
|`before-hook-creation` | 新hook启动前删除之前的资源 (默认) |
| `hook-succeeded` | hook成功执行之后删除资源 |
| `hook-failed` | 如果hook执行失败,删除资源 |
hook-test
只有当我们使用helm test命令才会触发hook
如果我们卸载了之前的安装,此测试pod并不会删除,可以在模板文件中添加helm.sh/hook-delete-policy: hook-succeeded来删除。