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

27

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

base/
  namespace.yaml
  kustomization.yaml
  service.yaml

使用 kustomization.yaml,如下所示:

resources:
  - namespace.yaml
  - service.yaml
namespace: my_wanted_namespace

namespace.yaml 是:

apiVersion: v1
kind: Namespace
metadata:
  name: default
问题在于当我执行:kustomize build ./base时,会出现以下情况:
apiVersion: v1
kind: Namespace
metadata:
  name: default

我怎样才能拥有?

apiVersion: v1
kind: Namespace
metadata:
  name: my_wanted_namespace
谢谢。

1
我有同样的问题要解决,我认为这是一个非常需要的功能。 - DevLounge
您介意将其中一个答案标记为正确答案吗? - Martín Coll
所有的答案都存在一个名称前缀的问题。命名空间是一个固定的名称,但前缀会被添加到命名空间名称中,这使得它与原来不同。因此,似乎无法在命名空间中使用名称前缀。 - MrE
6个回答

23

如果你想使用 kustomize 创建你的命名空间,那么你的 kustomize 文件应该像这样。它必须使用该命名空间。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: my-wanted-namespace
resources:
- ./namespace.yml

你的名称空间文件应该像这样部署一个普通的名称空间:

apiVersion: v1
kind: Namespace
metadata:
  name: my-wanted-namespace

4
假设现在有一个基础命名空间,我想在其上再叠加使用另一个命名空间,那么我必须重新创建一个包含所需命名空间的namespace.yml文件。这让我感到有点不舒服。我希望我能够至少使用变量来实现这个目的,但事实并非如此…… - Djabx
下面的答案(https://dev59.com/ulMH5IYBdhLWcg3w6VfR#71150557)表明`namespace.yml`中的命名空间名称实际上并不重要,这对我来说似乎也是如此。 - kai

14

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

overlay/kustomization.yaml


namespace: my_wanted_namespace
bases:
- ../base
resources:
- namespace.yaml

覆盖/命名空间.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: my_wanted_namespace

kustomization.yaml 文件中,namespace 属性的名称必须与 namespace.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

这种方法的关键是将基础Namespace名称转换为与叠加的kustomization.yaml文件中的namespace键完全匹配。


这种基于 patchesJSON6902: 的技术在使用 kustomize-v3.8.4 时对我非常有效。非常感谢! - Fabrice Jammes

4

虽然这篇文章有些旧,但以上回答过于复杂。

kustomization.yaml 中:

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

namespace: my-desired-namespace
resources:
- namespace.yaml

并且在namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: intentionally.broken.namespace

实际上,我在其他地方有一个文件夹,里面包含一个 kustomization 和一个虚假的命名空间,我可以将其作为任何 kustomization 的资源进行引用。该 kustomization 将使用 namespace transformer 替换命名空间名称,并创建它。


Azak所给出的答案的复制粘贴 https://dev59.com/ulMH5IYBdhLWcg3w6VfR#57640208 - Nazir
2
有一个微妙的区别。那个答案意味着“namespace:”字段需要与命名空间的名称匹配。因此,如果您使用叠加来创建10个命名空间,则需要10个命名空间文件。我只是指出名称不需要匹配,因此您可以拥有一个namespace.yaml文件,并将其作为资源从所有命名空间中包含。 - Brian C

3

虽然这篇帖子有些旧,但我有一个新的例子可以分享给未来的读者。

在你的基础设施中,你可以通过使用 namespace.yaml 来声明命名空间。也就是说,它将成为默认值。

base/
  namespace.yaml
  kustomization.yaml
  ...

示例 base/namespace.yaml 内容:

apiVersion: v1
kind: Namespace
metadata:
  name: default

在您的overlay/kustomization.yaml中使用PatchTransformer来更新默认命名空间的值,而无需在每个覆盖目录中创建命名空间资源。
例如,overlay/kustomization.yaml的内容:
namespace: my-wanted-namespace

resources:
- ../base

patches:
- target:
    kind: Namespace
    name: default
  patch: |-
    - op: replace
      path: /metadata/name
      value: my-wanted-namespace

2
为了能够动态创建命名空间并将其用于Kustomize将要自定义的其他资源,您可以使用以下技巧:

namespace=${1:-"my-namespace-meaning"}

rm -rf ./base
mkdir ./base

cat <<EOF > ./base/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: suffix
EOF

cat <<EOF > ./base/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: docker-registry
  labels:
    name: docker-registry
spec:
  ports:
    - port: 5001
      targetPort: 5000
  selector:
    name: docker-registry
  type: ClusterIP
EOF

cat <<EOF > ./base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: docker-registry
spec:
  replicas: 1
  selector:
    matchLabels:
      app: docker-registry
  template:
    metadata:
      labels:
        app: docker-registry
    spec:
      containers:
        - name: docker-registry
          image: registry
          ports:
            - containerPort: 5000
          resources:
            limits:
              memory: 200Mi
              cpu: 300m
            requests:
              memory: 100Mi
              cpu: 100m
EOF

cat <<EOF > ./kustomization.yaml
namePrefix: "${namespace}-"

namespace: "${namespace}-suffix"

resources:
- base/deployment.yaml
- base/namespace.yaml
- base/service.yaml
EOF

kubectl kustomize ./


运行这个脚本将会输出:
apiVersion: v1
kind: Namespace
metadata:
  name: my-namespace-meaning-suffix
---
apiVersion: v1
kind: Service
metadata:
  labels:
    name: docker-registry
  name: my-namespace-meaning-docker-registry
  namespace: my-namespace-meaning-suffix
spec:
  ports:
  - port: 5001
    targetPort: 5000
  selector:
    name: docker-registry
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-namespace-meaning-docker-registry
  namespace: my-namespace-meaning-suffix
spec:
  replicas: 1
  selector:
    matchLabels:
      app: docker-registry
  template:
    metadata:
      labels:
        app: docker-registry
    spec:
      containers:
      - image: registry
        name: docker-registry
        ports:
        - containerPort: 5000
        resources:
          limits:
            cpu: 300m
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 100Mi

首先使用 namePrefix 关键字 (文档在此) 确定自定义后命名空间的值。然后,可以通过 namespace 关键字 (文档在此) 使用此自定义命名空间来处理其他每个资源。


很遗憾,文档链接已过时。 - Josiah
2
感谢您的反馈,@Josiah。我已经更新了链接,希望它们能够有所帮助。 - Hadrien TOMA
1
我对你的kustomization文件进行了轻微的更改,对我来说效果非常好!诀窍是将预期的命名空间与后缀或前缀匹配。 - Martín Coll
@MartínColl,感谢您的反馈!您愿意分享这个小改变吗?:p - Hadrien TOMA
1
没问题,我刚刚发布了它! - Martín Coll
非常感谢! - Hadrien TOMA

2

根据我的经验,最简单的答案如下:

在基础配置中

  • 不要包含namespace.yaml文件
  • 不要将命名空间添加到您的资源中

在覆盖或环境中

  • 如果需要创建专用命名空间,请添加namespace.yaml文件
  • 在您的覆盖中的kustomization.yaml文件中添加namespace: my-name

文件夹结构

因此,结构如下:

base/
 - service.yaml
 - ...
 - kustomization.yaml
overlays/
 - some-overlay/
   - namespace.yaml # (optional) can be defined here
   - kustomization.yaml
environments/
 - environment-1/
   - namespace.yaml # or define it here
   - kustomization.yaml # with namespace: my-name

您可以在 kustomize build . 的输出中看到环境中的所有资源都被正确地限定在了命名空间内。

供参考:

# kustomization.yaml in environment
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: my-namespace

bases:
- ../base/

resources:
- namespace.yaml

请参考此处文档:https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/namespace/

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