如果自定义资源定义存在,则仅使用Helm创建Kubernetes资源。

6
我有一个Helm Chart,可以部署多个Kubernetes资源。其中一个资源是自定义资源定义(Custom Resource Definition,CRD)类型的资源(由prometheus-operator使用的ServiceMonitor)。
我正在寻找一种方法,告诉Helm仅在集群中定义了这样的CRD时才创建此资源,或者忽略仅由于缺少这样的CRD而引起的错误。
是否可能实现这一点,如何实现呢?
3个回答

13

Helm的Capabilities对象可以告诉您在群集中是否安装了整个API类。我不认为它能测试特定的自定义资源类型。

在您的.tpl文件中,您可以将整个文件包装在一个{{ if }}...{{ end }}块中。Helm并不特别关心文件的呈现版本是否为空。

这将引导您到一个类似于以下内容的文件:

{{ if .Capabilities.APIVersions.Has "monitoring.coreos.com/v1" -}}
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  ...
{{ end -}}

如果在集群中安装了运算符,就会安装该组件;否则将被跳过。


3
如果您使用的是Helm 3,您可以将自定义资源定义(CRD)放在crds/目录中。Helm会对其进行不同的处理,详见此处文档。
在Helm 2中,还有另一种机制可以使用crd-install hook。您可以向CRD中添加以下内容:
annotations:
  "helm.sh/hook": crd-install

这种方法存在一些限制,如果您正在使用Helm 3,则最好选择它。


谢谢您的回复。我正在使用helm 2。关于那个helm hook,它要做什么?您能指向一些更多的信息或文档吗?在我看来,这将(以某种方式)尝试安装CRD。我正在寻找有点不同的行为。 - LIvanov
啊,我没有意识到你实际上没有将CRD与你的图表包装在一起。我将CRD类型解读为实际上具有类型:CustomResourceDefinition。我的错。在这种情况下,crd-install确实无法工作。您可以创建一个pre_install hook来检查是否安装了CRDs,否则防止部署图表(https://helm.sh/docs/topics/charts_hooks/)。另一种方法是在部署脚本中检查CRD,并向您的Helm chart传递一个值,指示CRD是否存在(允许静默忽略)。 - Blokje5

2

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