【问题标题】:Initcontainer vs Helm Hook post-installInitcontainer vs Helm Hook 安装后
【发布时间】:2020-07-22 19:34:13
【问题描述】:

Helm Hooks post-install 和 Kubernetes initcontainers 有什么区别?我的理解是,Hooks 用于在 Pod 生命周期的不同阶段定义一些操作,在这种情况下 - 安装后,而 initcontainers 则允许在容器部署到 Pod 之前对其进行初始化。

post-install 和我理解的 initcontainer 允许做同样的事情,即初始化数据库。

正确吗?哪种方法更好?

【问题讨论】:

    标签: kubernetes kubernetes-helm


    【解决方案1】:

    对于数据库设置,我更喜欢 Helm 挂钩,但即便如此也有一些微妙之处。

    假设您的服务正在作为具有replicas: 3 的部署运行,以实现一点冗余。如果在 pod 规范中指定,这些副本中的每一个都将运行一个 init 容器,而无需任何同步。如果其中一个 pod 崩溃,或者它的节点发生故障,它的替换将再次运行 init 容器。对于你所说的那种设置任务,你不想经常重复它。

    这里的根本区别在于 Helm 钩子是一个单独的 Kubernetes 对象,通常是一个 Job。您可以安排此作业在每个 helm upgrade 上只运行一次,而不是其他时间,这使它成为运行迁移之类的合理场所。

    这里一个重要的微妙之处是您可以同时运行多个版本的服务。使用replicas: 3 进行前面的部署,然后使用helm upgrade --set tag=something-newer。 Deployment 控制器将首先使用新映像启动一个新的 pod,只有在它启动并运行后,它才会拆除旧的 pod,现在您可以将两个版本一起运行。如果您 helm rollback 使用旧版本,也会发生类似的事情。这意味着您需要对没有正确架构的数据库有一定的容忍度。

    如果该作业更像是预加载一些初始数据的“种子”作业,则更易于管理:在安装后挂钩中进行,您希望该挂钩只运行一次。您无需在每次升级(作为升级后挂钩)或每次 pod 启动(作为 init 容器)时重复它。

    【讨论】:

    • 就我而言,我想在我的 cassandra 数据库中定义一些模式。我知道迁移问题,不幸的是,我还没有找到解决方案。你认为 hook 是 init db 的一个很好的解决方案吗?
    • 所以 Init 容器将在每个副本运行,而钩子在每个版本运行?
    • 是的,这是一种思考方式。另请记住,副本数可以独立更改 (kubectl scale ...),并且 pod 可以在节点之间移动,这将导致 init 容器再次运行。
    • 是的,至少对于这个一次性数据加载用例来说,安装后是一个更好的选择?
    【解决方案2】:

    Helm install hook 和 initcontainer 根本不同。在 helm 中安装 hooks 会创建一个完全独立的 pod,这意味着 pod 将无法直接使用 localhost 访问主 pod,或者它们不能使用相同的卷挂载等,而 initcontainer 可以这样做所以。

    Init container 与 helm pre install hooks 相媲美,其方式有限,因为它只能在 main pod 启动之前执行初始任务,而不能执行任何需要在 pod 启动后执行的任务,例如任何 clean活动。

    需要在实际容器启动之前完成 DB 等的初始化,我认为 initcontainer 对于这个用例已经足够了,但也可以使用 helm pre install hook。

    【讨论】:

    • 我明白了。那么你会建议使用什么来初始化数据库呢?从您的描述 initcontainer 应该足以执行一些 sql 脚本。我说的对吗?
    • 是的,init 容器是该用例的简单可行的解决方案
    • 您能详细说明一下吗?“Helm 中的安装后挂钩会创建一个完全独立的 pod”。它会产生什么问题?
    • 将该 pod 视为一个单独的应用程序。对于安装后的某些任务,如果您想访问主应用程序 pod,则不能尽早这样做。你会用什么...POD IP?那么这可以改变......你将需要使用服务等......它不像初始化容器那么简单。虽然这在很大程度上取决于您想要执行的特定任务
    【解决方案3】:

    您需要使用 post hook,因为首先您必须创建一个 db pod,然后初始化 db。您会注意到,在 db pod 开始运行后,会出现一个用于 post hook 的 pod。 post hook pod 会在 hook 执行后被移除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 2019-08-10
      • 2020-12-28
      • 1970-01-01
      • 2022-06-17
      • 1970-01-01
      • 2018-06-28
      相关资源
      最近更新 更多