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

时间:2019-08-21 14:34:48

标签: kustomize

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

谢谢。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

为了能够动态创建名称空间并将其用于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),可以将此自定义名称空间用于其他资源。

答案 2 :(得分:1)

您可以从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.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的名称转换为 与覆盖namespace中的kustomization.yaml键完全匹配 文件。