18

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

谢谢。

4

4 回答 4

15

如果您想使用 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
于 2019-08-24T17:36:45.500 回答
9

您可以从覆盖中删除命名空间资源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

重要的namespace是文件中的属性与资源kustomization.yaml中的名称匹配并且设置属性。namespace.yamlbase/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名称转换为与namespace覆盖kustomization.yaml 文件中的键完全匹配。

于 2020-12-04T19:31:56.833 回答
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关键字(doc here),以便在定制后确定性地定义命名空间的值。namespace然后,由于关键字(此处为 doc ) ,此自定义命名空间可用于其他资源。

于 2020-08-27T11:40:45.717 回答
0

旧帖子,但上述答案比需要的要复杂。

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 将用命名空间转换器替换命名空间名称,并创建它。

于 2022-02-16T23:24:34.483 回答