如何确保Helm子图中定义的CRD在使用前被存储?

gta*_*ato 11 kubernetes kubernetes-helm kubernetes-custom-resources

我有一个 helm 图表 A,它依赖于第三方子图表 B。图表 B 定义了图表 A 使用的一些 CRD。但是,当我安装图表 A(因此也是 B)时,我收到一条错误消息,指出 CRD 是未能识别。看来 CR 是在 CRD 之前存储的。

有关CRD的 Helm 文档 描述了两种处理此订单的方法,要么将 CRD 放在名为 crds 的文件夹中,要么使用两个单独的图表并一个接一个地安装它们。

我的问题如下:

  1. 为什么 Helm 不首先应用 CRD,无论它们在哪里?为什么需要 crds 文件夹?如果 CRD 位于您不希望修改的图表中(就像我的例子)怎么办?
  2. 第二个选项不会使依赖项规范变得毫无用处吗?依赖关系不能有执行顺序吗?
  3. 有没有一种方法(我可能忽略了)仍然保留 1 个带有依赖项的图表,并以某种方式确保依赖项中定义的 CRD 在使用之前已存储?(钩子?)

(您不必回答所有问题,只要回答其中任何一个问题即可)

Vol*_*nyk 5

有一种非常简单的方法可以让主图表安装由依赖图表的 CRD 定义的对象。只需使用post-installpost-upgrade挂钩安装和升级它们即可。

只是给你一个简单的例子。让我们想象一下,您需要安装一个 cert-manager 作为子图表,然后您的主图表需要安装一个Issuer. 显然,初始安装失败,因为尚未安装 CRD,因此Issuer未通过验证。但是,如果您使用钩子(通过将以下注释添加到您的Issuer:模板中"helm.sh/hook": post-install,post-upgrade),那么Issuer只会在安装过程的最后,当 cert-manager 启动并启动时安装。


hes*_*ess 2

有关 Helm 如何处理 CRD 的完整推理可以在hip-0011中找到。我建议阅读它,但简而言之:

1.“核心问题是 CRD(作为全局共享资源)很脆弱。安装 CRD 后,我们通常必须假设它在命名空间和用户组之间共享。因此,安装、修改和删除 CRD 是一个对该集群的所有用户和系统都有影响的过程。”

“由于存在意外数据丢失的危险,这是经过多次社区讨论后做出的明确决定”

  1. 不,依赖项也可以用于其他目的。

  2. 恐怕会很复杂,请查看此处的讨论。