如何在HELM模板中创建一个命名空间(namespace),如果它不存在的话?

65
我有一个kind: Namespace的模板YAML,如下所示:
apiVersion: v1
kind: Namespace
metadata:
  name: {{ .Values.namespace }}
  namespace: ""

如何使helm install在指定的Kubernetes集群中仅当上述命名空间({{ .Values.namespace }})不存在时,创建该命名空间({{ .Values.namespace }})?
4个回答

109

这个功能在helm >= 3.2版本中实现(Pull Request)

除了使用--namespace <namespace>之外,还需使用--create-namespace


4
是的,但如果命名空间已经存在,它就会失败... - Nathan McKaskle
我认为这不再是真的了吗?从文档中来看:-create-namespace 如果不存在则创建发布命名空间。 - spa
1
不行,它还是失败了。在我的部署中,我对命名空间有严格的定义。当我不使用任何标志时,它可以正常工作,但是Helm显示在默认命名空间中。如果我传递 -n,它将失败,因为命名空间不存在;如果使用 --create-namespace ,会出现错误:Error: create: failed to create: namespaces "test" not found。 - Witold Kupś
需要注意的一点是,如果你运行 helm delete ...,这不会删除它创建的命名空间。你需要使用 kubectl 手动删除命名空间。 - undefined

32

对于helm2而言,最好避免将命名空间作为图表内容的一部分创建,如果可能的话,让helm管理它。使用--namespace=<namespace_name>选项的helm install应自动为您创建一个命名空间。您可以在图表中使用{{ .Release.Namespace }}引用该命名空间。目前公共helm/charts存储库中只有一个创建命名空间的示例,它使用手动标志来检查是否要创建它

对于helm3,功能已经发生了变化,这里有一个github问题


在helm-umbrella部署的情况下如何处理。因为在这种情况下,我们需要多个命名空间。 - xyz_scala
如果用户同意,您可以执行某些操作来创建命名空间,就像在https://github.com/helm/charts/blob/5e00179b109d7290eb05a2b9705839fcf666d29a/stable/magic-namespace/templates/namespace.yaml中所示。 - Ryan Dawson
8
3.0版本中,标志--namespace不会自动创建命名空间。但是,这个功能将在3.1版本中重新加入。 - Dennis Meissel
3
我似乎没有在3.1.1版本中被添加回来。 - aitorhh
如果一个图表包含多个组件,这些组件应该放置在多个命名空间中怎么办?唯一的选择是在图表之外创建它们吗? - GACy20

30

由于版本不同,Helm命令存在一些差异。

对于Helm 2,只需使用--namespace; 而对于Helm 3,则需要使用--namespace--create-namespace

Helm 2示例:

helm install stable/nginx-ingress --name ingress-nginx --namespace ingress-nginx --wait

Helm 3 示例:

helm install ingress-nginx stable/nginx-ingress --namespace ingress-nginx --create-namespace --wait

7
如果命名空间已经存在,但我仍然使用了"--create-namespace"选项,会发生什么? - Arsen
@Arsen 如果还没有创建该命名空间,它将只会创建该命名空间。 - hfc

2
对于 Terraform 用户,将 create_namespace 属性设置为 true:
resource "helm_release" "kube_prometheus_stack" {
  name       = ...
  repository = ...
  chart      = ...
  namespace  = ...
  create_namespace = true
}

1
问题已解决,谢谢。 - Piroinno

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