我的 k8s YAML 清单的组织方式如下:
.
├── app
│ ├── base
│ │ └── kustomization.yaml
| | └── my-configmap.yaml
| | └── my-namespace.yaml
| | └── my-deploy.yaml
| | └── my-svc.yaml
│ ├── overlay
│ └── kustomization.yaml
└── new-namespace.yaml
===“基地”===
app/base/kustomization.yaml
是:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- my-configmap.yaml
- my-deploy.yaml
- my-namespace.yaml
- my-svc.yaml
在
base/
目录内的每个 YAML 清单中,指定 namespace
字段。例如 my-service.yaml
指定命名空间 my-ns
:
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: my-svc
name: my-svc
namespace: my-ns
spec:
===“叠加”===
我想使用覆盖覆盖我的对象的名称空间。
app/overlay/kustomization.yaml
是:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
- new-namespace.yaml
buildMetadata:
- managedByLabel
transformers:
- |-
apiVersion: builtin
kind: NamespaceTransformer
metadata:
name: namespace-transformer
namespace: xii
setRoleBindingSubjects: allServiceAccounts
那个
app/overlay/new-namespace.yaml
是:
---
apiVersion: v1
kind: Namespace
metadata:
name: xii
====结果====
然后,在路径
app/overlay/
下,我运行命令kustomize build . | cat
,输出显示我的YAML清单的所有命名空间仍然使用“base”中定义的原始命名空间,而不是被overlay值覆盖 xii
。
为什么?我是否误解了 Kustomization 命名空间转换器的行为?
我还尝试了更简单的方法:
我也尝试完全删除
transformers
,而是简单地在overlay's
namespace: xii
中使用kustomizationl.yaml
,如下所示:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
- new-namespace.yaml
buildMetadata:
- managedByLabel
namespace: xii
构建时出现错误:
Error: namespace transformation produces ID conflict: [{"apiVersion":"v1","kind":"Namespace","metadata":{"annotations":{"config.kubernetes.io/origin":"path: ../base/my-namespace.yaml\n","internal.config.kubernetes.io/previousKinds":"Namespace","internal.config.kubernetes.io/previousNames":"my-ns","internal.config.kubernetes.io/previousNamespaces":"_non_namespaceable_"},"name":"xii"}} {"apiVersion":"v1","kind":"Namespace","metadata":{"annotations":{"config.kubernetes.io/origin":"path: new-namespace.yaml\n"},"name":"xii"}}]
kustomization 中命名空间覆盖之间的交互是您收到错误的原因。命名空间资源本身以及 yaml 的
如果您将组件修改为标准 Kustomization 并将它们作为资源包含在 Overlays/local/kustomization.yaml 中,一切都会按预期运行:
供将来参考:
请参阅此 gitlink 并查看 namespaceTransformer 规范: