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



我有一个舵手图a,它依赖于第三方子图B。图B定义了图A使用的一些crd。但是,当我安装图表A(因此B也是)时,我得到一个错误,说不识别crd。CRs似乎在crd之前存储。

关于CRD的掌舵文档描述了处理此顺序的两种方法,要么将crd放在一个名为CRDs的文件夹中,要么使用两个单独的图表并依次安装它们。

我的问题如下:

  1. 为什么Helm不首先应用crd,不管它们在哪里?为什么需要crds文件夹?如果crd位于您不希望修改的图表中(就像我的情况一样),该怎么办?
  2. 第二个选项不会使依赖规范失效吗?依赖性不能有一个执行顺序吗?
  3. 是否有一种方法,我可能忽略了,仍然保持1图表与依赖关系,并以某种方式确保在依赖关系中定义的crd在使用之前存储?(钩子?)

(你不必回答所有的问题,任何一个问题的答案都是感激的)

有一种非常简单的方法可以让您的主图表安装依赖关系图的crd定义的对象。只要把它们和post-installpost-upgrade挂钩一起安装和升级就行了。

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

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

1。核心问题是,全球共享的资源是脆弱的。一旦安装了CRD,我们通常必须假设它是跨名称空间和用户组共享的。因此,安装、修改和删除cd是一个对该集群的所有用户和系统都有影响的过程。">

"这是经过大量社区讨论后的明确决定,因为有意外数据丢失的危险">

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

  2. 恐怕会很复杂,看看这里的讨论。

最新更新