钩子

Helm提供了一个钩子机制,允许chart开发人员在发布的生命周期中的某些点进行干预。 例如,您可以使用钩子来:

  • 在加载任何其他chart之前,在安装期间加载ConfigMap或Secret。
  • 执行作业以在安装新chart之前备份数据库,然后在升级后执行第二个作业以恢复数据。
  • 在删除发行版之前运行作业,以便在删除发行版之前优雅地停止服务。

钩子像常规模板一样工作,但它们具有特殊的注释,可以使Helm以不同的方式使用它们。 在本节中,我们介绍钩子的基本使用模式。

可用的钩子

定义了以下钩子:

  • pre-install: 在模板渲染后执行,但在Kubernetes中创建任何资源之前执行。
  • post-install: Kubernetes加载完所有资源后执行
  • pre-delete: 在从Kubernetes删除任何资源的之前执行删除请求。
  • post-delete: 在删除所有版本资源后执行删除请求
  • pre-upgrade: 在模板渲染之后,但在将任何资源加载到Kubernetes之前(例如,在Kubernetes应用操作之前)执行升级请求。
  • post-upgrade: 所有资源升级后执行升级。
  • pre-rollback: 在渲染模板之后但在任何资源回滚之前执行回滚请求。
  • post-rollback: 在修改所有资源后执行回滚请求。

钩子和Release生命周期

钩子让chart开发人员有机会在release生命周期中的战略点执行操作。 例如,helm install的生命周期。 默认情况下,生命周期如下所示:

  1. 用户运行helm install foo
  2. chart被加载到Tiller中
  3. 经过一些验证后,Tiller渲染foo模板
  4. Tiller将产生的资源加载到Kubernetes中
  5. Tiller将版本名称(和其他数据)返回给客户端
  6. 客户端退出

Helm为安装生命周期定义了两个钩子:pre-install和post-install。 如果foo chart的开发人员实现了两个钩子,则生命周期会如此更改:

  1. 用户运行helm install foo
  2. chart被加载到Tiller中
  3. 经过一些验证后,Tiller渲染foo模板
  4. Tiller准备执行pre-install钩子(将钩子资源加载到Kubernetes中)
  5. Tiller会根据权重对钩子进行排序(默认分配权重0),并按相同权重的钩子按升序排序。
  6. Tiller然后装载最低权重的钩子
  7. Tiller等待,直到钩子“准备就绪”
  8. Tiller将产生的资源加载到Kubernetes中。 请注意,如果设置了—wait标志,则Tiller将等待,直到所有资源都处于就绪状态,并且在准备就绪之前不会运行post-install挂钩。
  9. Tiller执行后安装钩子(加载钩子资源)
  10. Tiller等待,直到钩子“准备就绪”
  11. Tiller将版本名称(和其他数据)返回给客户端
  12. 客户端退出

等到钩子准备就绪是什么意思? 这取决于在钩子中声明的资源。 如果资源是作业类型,则Tiller将等待作业成功完成。 如果作业失败,则发布失败。 这是一个阻塞操作,所以Helm客户端会在Job运行时暂停。

对于所有其他类型,只要Kubernetes将资源标记为加载(添加或更新),资源就被视为“就绪”。 当一个钩子声明了很多资源时,这些资源将被串行执行。 如果他们有钩子权重(见下文),他们按照权重顺序执行。 否则,排序不能保证。 (在Helm 2.3.0及之后的版本中,它们按字母顺序排序,但这种行为不具有约束力,未来可能会发生变化)。添加钩子权重被认为是一种好的做法,如果权重不重要可以设置为0。

钩子资源不用相应的版本进行管理

钩子创建的资源不作为Release的一部分进行跟踪或管理。 一旦Tiller验证钩子已经达到其就绪状态,它将单独离开钩子资源。

实际上,这意味着如果您在钩子中创建资源,则不能依靠helm delete来删除资源。 要销毁这些资源,您需要编写代码在pre-delete或post-delete钩子中执行此操作,或将“helm.sh/hook-delete-policy”注解添加到钩子模板文件。

等待钩子

钩子只是Kubernetes声明文件,在元数据部分有特殊的注解。 因为它们是模板文件,所以可以使用所有常规模板功能,包括读取.Values,.Release和.Template。

例如,存储在templates/post-install-job.yaml中的此模板声明了要在post-install运行的作业:

  1. apiVersion: batch/v1
  2. kind: Job
  3. metadata:
  4. name: "{{.Release.Name}}"
  5. labels:
  6. heritage: {{.Release.Service | quote }}
  7. release: {{.Release.Name | quote }}
  8. chart: "{{.Chart.Name}}-{{.Chart.Version}}"
  9. annotations:
  10. # This is what defines this resource as a hook. Without this line, the
  11. # job is considered part of the release.
  12. "helm.sh/hook": post-install
  13. "helm.sh/hook-weight": "-5"
  14. "helm.sh/hook-delete-policy": hook-succeeded
  15. spec:
  16. template:
  17. metadata:
  18. name: "{{.Release.Name}}"
  19. labels:
  20. heritage: {{.Release.Service | quote }}
  21. release: {{.Release.Name | quote }}
  22. chart: "{{.Chart.Name}}-{{.Chart.Version}}"
  23. spec:
  24. restartPolicy: Never
  25. containers:
  26. - name: post-install-job
  27. image: "alpine:3.3"
  28. command: ["/bin/sleep","{{default "10" .Values.sleepyTime}}"]

下面这个annotaions使得模板成为钩子:

  1. annotations:
  2. "helm.sh/hook": post-install

一个资源可以实现多个挂钩:

  1. annotations:
  2. "helm.sh/hook": post-install,post-upgrade

同样,可以将给定钩子的实现为不同资源的数量没有限制。 例如,我们可以将secret和config map声明为pre-install钩子。

子chart声明钩子时,也会评估这些钩子。 顶级chart无法禁用子chart所声明的钩子。

有可能为一个钩子定义一个权重,这将有助于建立一个确定性的执行顺序。 权重使用以下注解来定义:

  1. annotations:
  2. "helm.sh/hook-weight": "5"

钩子权重可以是正数或负数,但必须表示为字符串。 当Tiller开始执行一个特定类型的钩子的执行周期时,它将按升序对这些钩子进行排序。

还可以定义何时删除相应的钩子资源的策略。 钩子删除策略使用以下注解来定义:

  1. annotations:
  2. "helm.sh/hook-delete-policy": hook-succeeded

使用“helm.sh/hook-delete-policy”注解时,可以从“hook-succeeded”和“hook-failed”中选择其值。 值“hook-succeeded”指定Tiller应该在成功执行钩子后删除钩子,而值“hook-failed”指定Tiller应该在执行期间钩子失败时删除钩子。