【问题标题】:How can you make preinstall hooks to wait for finishing of the previous hook?如何让预安装钩子等待前一个钩子完成?
【发布时间】:2019-10-28 22:01:06
【问题描述】:

我有 2 个应该按顺序运行的预安装脚本。 它们的重量明显不同 第二个脚本必须有第一个才能完成运行。 有没有办法让 helm 支持这种行为?

另外,你可以做一个预安装钩子来阻止直到对象准备好吗?

场景如下:

您有一个数据库和一个应用程序。

设置是:

  1. 创建数据库(部署),
  2. 创建数据库(服务),
  3. 运行一个在该数据库(作业)上创建所有数据库用户的脚本
  4. 启动应用服务器(部署)。

【问题讨论】:

  • 你好@Roman M,你找到答案了吗?
  • 基本上如下面的答案中详细解释的那样,在加权的预安装作业期间,helm 不会等待任何不是作业的对象。所以你创建了一个权重为 10 的数据库部署和服务。然后你运行一个权重为 11 的钩子,当 pg_ready 返回 ok 答案时退出。然后在重量 12 上运行创建所有数据库用户的作业。那么应用服务器部署对象就是一个普通对象。

标签: kubernetes kubernetes-helm


【解决方案1】:

首先,您需要正确设置hook weights。例如:

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

钩子权重可以是正数或负数,但必须是 表示为字符串。当 Tiller 开始执行循环时 特定类型的钩子(例如 pre-install 钩子或 post-install 钩子等),它将按升序对这些钩子进行排序。

根据Hooks and release lifecycle,默认情况下,Tiller 会等到一个钩子变为“就绪”后再执行下一个钩子。问题是:处理由钩子管理的脚本时,您需要将资源创建为Job

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

如果要运行依赖于准备就绪的数据库或应用程序的作业,最好将挂钩用作post-install,并结合--wait 标志。设置此标志后,Tiller 将等待所有发布资源部署完毕并处于就绪状态,并且在它们就绪之前不会运行 post-install 挂钩。

【讨论】:

  • 第一部分,你说得对,我把钩子注释放在错误的元数据上,但第二部分仍然是问题。在运行一个预安装挂钩和一个发布对象之前,我需要准备好数据库。流程是:创建数据库 pod(预安装),设置用户作业(预安装),运行 app pod(常规安装)。问题是 helm 不会等待数据库的就绪性检查通过。当 pod 运行时,它会移动到下一个 preinstalll hook
  • 如果你想让数据库准备好,你需要使用post-install(不是pre)。使用--wait 标志,它仅在发布资源准备好后运行
  • 但是安装后会在应用程序 pod 已经启动后运行吗?太晚了。
猜你喜欢
  • 2023-03-16
  • 2022-10-04
  • 2020-09-19
  • 2016-09-01
  • 1970-01-01
  • 2021-12-15
  • 2021-03-08
  • 2019-11-02
  • 2019-01-08
相关资源
最近更新 更多