Chart Hook

    • 安装时在加载其他chart之前加载配置映射或密钥
    • 安装新chart之前执行备份数据库的任务,然后在升级之后执行第二个任务用于存储数据。
    • 在删除发布之前执行一个任务以便在删除服务之前退出滚动。

    钩子的工作方式与常规模板类似,但因为Helm对其不同的使用方式,会有一些特殊的注释。这部分会讲述钩子的基本使用模式。

    定义了以下钩子:

    注意crd-install钩子已被移除以支持Helm 3的crds/目录。

    钩子允许你在发布生命周期的关键节点上有机会执行操作。比如,考虑helm install的生命周期。默认的,生命周期看起来是这样:

    1. Helm库调用安装API
    2. 在一些验证之后,库会渲染模板
    3. 库会加载结果资源到Kubernetes
    4. 库会返回发布对象(和其他数据)给客户端
    5. 客户端退出

    Helm 为install周期定义了两个钩子:pre-installpost-install。如果foo chart的开发者两个钩子都执行, 周期会被修改为这样:

    1. 用户返回 helm install foo
    2. Helm库调用安装API
    3. crds/目录中的CRD会被安装
    4. 库准备执行pre-install钩子(将hook资源加载到Kubernetes中)
    5. 库按照权重对钩子排序(默认将权重指定为0),然后在资源种类排序,最后按名称正序排列。
    6. 库先加载最小权重的钩子(从负到正)
    7. 库会等到钩子是 “Ready”状态(CRD除外)
    8. 库将生成的资源加载到Kubernetes中。注意如果设置了--wait参数,库会等所有资源是ready状态, 且所有资源准备就绪后才会执行post-install钩子。
    9. 库执行post-install钩子(加载钩子资源)。
    10. 库会等到钩子是”Ready”状态
    11. 库会返回发布对象(和其他数据)给客户端

      等钩子准备好是什么意思? 这取决于钩子声明的资源。如果资源是 Job 或 类型,Helm会等到直到他成功运行完成。 如果钩子失败,发布就会失败。这是一个 阻塞操作,所以Helm客户端会在这个任务执行时暂停。

    钩子创建的资源无法作为发布的一部分进行跟踪和管理。一旦Helm验证hook达到ready状态,将不使用钩子资源。 当对应发布删除后,钩子资源的垃圾回收会在将来添加到Helm 3中,因此不能被删除的钩子资源应该添加注释: helm.sh/resource-policy: keep

    实际上,如果你在钩子中创建了资源,不能依靠helm uninstall去删除资源。要删除这些资源,要么在钩子模板文件中 添加一个自定义的helm.sh/hook-delete-policy 注释,要么 。

    钩子就是在metadata部分指定了特殊注释的Kubernetes清单文件。因为是模板文件,你可以使用所有的普通模板特性,包括读取 .Values.Release,和 .Template

    比如这个模板,存储在templates/post-install-job.yaml,声明了一个要运行在post-install上的任务:

    使模板称为钩子的是注释:

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

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

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

    钩子权重可以正数也可以是负数,但一定要是字符串。Helm开始执行特定种类的钩子时,会正序排列这些钩子。

    Hook deletion policies

    可以定义策略来决定何时删除对应的钩子资源。钩子的删除策略使用以下注释定义:

    可以选择一个或多个定义的注释值:

    注释值描述
    before-hook-creation新钩子启动前删除之前的资源 (默认)
    hook-succeeded钩子成功执行之后删除资源
    hook-failed如果钩子执行失败,删除资源

    如果没有指定钩子删除策略的注释,默认使用。