我有一个使用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
谢谢。
答案 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
键完全匹配 文件。