【问题标题】:How can I create a namespace with kustomize?如何使用 kustomize 创建命名空间?
【发布时间】:2019-12-26 20:56:53
【问题描述】:

我有一个像这样使用 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

谢谢。

【问题讨论】:

  • 我有完全相同的问题要解决,这是 IMO 非常需要的功能
  • 您介意将其中一个答案标记为正确答案吗?
  • 所有答案都存在名称前缀问题。命名空间是一个固定名称,但前缀被添加到命名空间名称中,这使得它不同。所以你似乎无法在命名空间中使用名称前缀

标签: kustomize


【解决方案1】:

如果您想使用 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

【讨论】:

  • 假设它是基础,并且在覆盖中我想使用另一个命名空间,我必须使用想要的命名空间重新创建另一个 namespace.yml 文件。对我来说感觉很丑。我希望我至少可以为此目的使用变量,但不是......
【解决方案2】:

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

overlay/kustomization.yaml

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

overlay/namespace.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 非常有效。非常感谢!
【解决方案3】:

为了能够动态创建命名空间并将其用于 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关键字(doc here),以便在自定义之后确定性地定义命名空间的值。然后,借助 namespace 关键字 (doc here),此自定义命名空间可用于其他资源。

【讨论】:

  • 很遗憾,文档链接已过时。
  • 感谢您的反馈@Josiah,我更新了链接,希望对您有所帮助。
  • 我对您的 kustomization 文件做了一些改动,对我来说效果很好!诀窍是将预期的命名空间与后缀或前缀匹配。
  • @MartínColl 感谢您的反馈!你愿意分享这个微小的变化吗:p?
  • NP,刚刚发布!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2011-03-17
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
相关资源
最近更新 更多