如何使用 kustomize 创建命名空间?

Dja*_*abx 14 kustomize

我有一个像这样使用 kustomize 的简单项目:

base/
  namespace.yaml
  kustomization.yaml
  service.yaml
Run Code Online (Sandbox Code Playgroud)

kustomization.yaml是:

resources:
  - namespace.yaml
  - service.yaml
namespace: my_wanted_namespace
Run Code Online (Sandbox Code Playgroud)

并且namespace.yaml是:

apiVersion: v1
kind: Namespace
metadata:
  name: default
Run Code Online (Sandbox Code Playgroud)

问题是,当我这样做时: kustomize build ./base

我有这个:

apiVersion: v1
kind: Namespace
metadata:
  name: default
Run Code Online (Sandbox Code Playgroud)

我怎么会有

apiVersion: v1
kind: Namespace
metadata:
  name: my_wanted_namespace
Run Code Online (Sandbox Code Playgroud)

谢谢。

小智 10

如果要使用 kustomize 创建命名空间,则 kustomize 文件应如下所示。它必须使用命名空间。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: my-wanted-namespace
resources:
- ./namespace.yml
Run Code Online (Sandbox Code Playgroud)

你的命名空间文件应该是一个普通的命名空间部署,如下所示:

apiVersion: v1
kind: Namespace
metadata:
  name: my-wanted-namespace
Run Code Online (Sandbox Code Playgroud)

  • 假设它是基础,在覆盖层中我想使用另一个命名空间,我必须使用所需的命名空间重新创建另一个命名空间.yml 文件。对我来说,感觉善良就像丑陋一样。我希望我至少可以使用变量来达到此目的,但不能...... (2认同)

Mar*_*oll 6

您可以从中删除命名空间资源,base并将其仅包含在覆盖中。例如:

overlay/kustomization.yaml

namespace: my_wanted_namespace
bases:
- ../base
resources:
- namespace.yaml
Run Code Online (Sandbox Code Playgroud)

overlay/namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: my_wanted_namespace
Run Code Online (Sandbox Code Playgroud)

重要的是文件中的namespace属性kustomization.yamlnamespace.yaml资源中的名称匹配base/service.yaml 并且不设置namespace属性。


编辑:下面的原始回复

作为 Hadrien 答案的替代方案,JSON Patch 也对我有用:

namespace: my-wanted-namespace
patchesJSON6902:
- target:
    version: v1
    kind: Namespace
    name: base-namespace
  patch: |-
    - op: replace
      path: /metadata/name
      value: my-wanted-namespace
Run Code Online (Sandbox Code Playgroud)

此方法的关键是将基本Namespace名称转换为与namespace覆盖kustomization.yaml 文件中的键完全匹配。


Bri*_*n C 6

老帖子,但上面的答案比需要的更复杂。

kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: my-desired-namespace
resources:
- namespace.yaml
Run Code Online (Sandbox Code Playgroud)

并在namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: intentionally.broken.namespace
Run Code Online (Sandbox Code Playgroud)

实际上,我在其他地方有一个带有 kustomization 和虚拟命名空间的文件夹,我可以将其作为任何 kustomization 中的资源包含在内。kustomization 将用命名空间转换器替换命名空间名称,并创建它。

  • 有一个微妙的区别。该答案意味着“namespace:”字段需要与命名空间的名称匹配。因此,如果您使用覆盖创建 10 个命名空间,则需要 10 个命名空间文件。我刚刚指出,名称不需要匹配,因此您可以拥有一个命名空间.yaml,将其作为所有命名空间中的资源包含在内。 (5认同)