在Helm中共享ConfigMap的方法

3

我正在试图找出如何在Helm中的两个图表之间共享数据。

我已经为一个图表设置了一个唯一的YAML,用于在一个图表中生成configmap。让我们称其为cm1。它定义了自己的名称:

name:  {{ .Release.Name }}-maps

然后我设置了两个图表,部署容器,这些容器希望访问c1中configmap中的数据。我们称它们为c1和c2。 c1具有引用cm1图表的requirements.yaml,c2也是如此。现在我有一个父级图表,试图将它们全部整合在一起,我们称之为p1。p1在requirements.yaml中定义了c1和c2。然后我运行helm install --name k1 p1,但是我收到了一个错误:

错误:release k1 失败: configmaps "k1-maps" 已经存在。

我认为当helm构建其依赖树时,它会看到在第一次加载cm1图表时已经定义了k1-maps,请问在两个图表之间共享configmap的最佳实践是什么?


我同意@Michael Pratt的观点 - 您希望确保configmap仅在一个图表中,最好是在公共级别。例如,请参见https://github.com/ryandawsonuk/configmaps-transformers/tree/master/helm(示例来自https://dzone.com/articles/configuring-java-apps-with-kubernetes-configmaps-a)如果需要进一步帮助,我很乐意提供帮助。 - Ryan Dawson
我想要做的一件事是能够单独且干净地安装c1或c2,现在因为发布名称不同,这是可行的。但当父级这样做时,发布名称是相同的。 - harschware
我在这里尝试制作了一个问题的简短示例:https://github.com/harschware/shared-config-maps - harschware
我看到@Michael Pratt也在评论中回答了这个问题。您可以将configmap模板的内容包装在if块中,并使用一个标志,您可以设置它,以便只有一个实例在伞图表中部署它。 - Ryan Dawson
1个回答

3
您没有提供有关图表内容的大量信息,但听起来c1和c2都在定义并尝试安装configmap。Helm实际上对依赖项没有特殊了解,它只知道也要安装它们。如果被告知这样做,它将愉快地尝试(并失败)第二次安装图表。
Configmap应该仅作为父级图表的一部分创建和安装。即使它们没有定义,C1和C2也应该能够通过名称引用它。

你理解我的问题得很好,谢谢!我在想,既然Go模板函数可用,是否有一种方法可以有条件地仅加载一次模板,就像旧的C语言中使用#define和#ifdef一样。也许我可以将名称添加到全局切片变量中,并检查该切片中是否存在该名称? - harschware
2
至少我不知道有这样的功能。如果您想保持图表的独立性,您可能可以在子图表中设置一个值(默认为true),表示是否要构建configmap模板。在父级图表中,您可以设置其中一个来构建configmap,而另一个则不需要。 - Michael Pratt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接