排除 kustomization.yaml 中的资源
Exclude Resource in kustomization.yaml
我有一个 kustomize 基础,我想在不编辑的情况下重新使用它。不幸的是,它创建了一个我不想创建的命名空间。我想在编译清单时简单地从考虑中删除该资源并为我添加一个资源,因为我无法修补命名空间以更改名称。
这能做到吗?怎么样?
我发现我对不能更改命名空间名称的理解是不正确的。使用补丁功能,您实际上可以更改资源的名称,包括命名空间。
这是我最终使用的:
patches:
- target:
kind: Namespace
name: application
patch: |-
- op: replace
path: /metadata/name
value: my-application
您可以像这样使用 Strategic Merge Patch 的删除指令来省略特定资源。
文件夹结构
$ tree .
.
├── base
│ ├── kustomization.yaml
│ └── namespace.yaml
└── overlays
├── dev
│ └── kustomization.yaml
└── prod
├── delete-ns-b.yaml
└── kustomization.yaml
文件内容
$ cat base/kustomization.yaml
resources:
- namespace.yaml
$ cat base/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: ns-a
---
apiVersion: v1
kind: Namespace
metadata:
name: ns-b
$ cat overlays/dev/kustomization.yaml
bases:
- ../../base
$ cat overlays/prod/delete-ns-b.yaml
$patch: delete
apiVersion: v1
kind: Namespace
metadata:
name: ns-b
$ cat overlays/prod/kustomization.yaml
bases:
- ../../base
patchesStrategicMerge:
- delete-ns-b.yaml
kustomize 的行为
$ kustomize build overlays/dev
apiVersion: v1
kind: Namespace
metadata:
name: ns-a
---
apiVersion: v1
kind: Namespace
metadata:
name: ns-b
$ kustomize build overlays/prod
apiVersion: v1
kind: Namespace
metadata:
name: ns-a
在这种情况下,我们在基本文件夹中有两个命名空间。在 dev 中,kustomize 会产生 2 个命名空间,因为没有补丁。但是,在 prod 中,kustomize 只生成一个命名空间,因为 delete patch 会删除命名空间 ns-b。
我遇到了这个问题,最终采用了不同的方法来解决它。回顾您的需求并问问自己为什么要 kustomize
省略资源是值得的?在我的例子中——我想这是最常见的用例——我希望 kustomize
省略一个资源,因为我不想将它应用到目标 kubernetes 集群,但 kustomize
没有没有提供一种简单的方法来做到这一点。在将资源应用到集群时而不是在生成它们时进行过滤不是更好吗?我最终采用的解决方案是在应用到集群时按标签过滤资源。您可以在叠加层中添加排除标签以防止应用资源。
例如
$ kustomize build . | kubectl apply -l apply-resource!=no -f -
我有一个 kustomize 基础,我想在不编辑的情况下重新使用它。不幸的是,它创建了一个我不想创建的命名空间。我想在编译清单时简单地从考虑中删除该资源并为我添加一个资源,因为我无法修补命名空间以更改名称。
这能做到吗?怎么样?
我发现我对不能更改命名空间名称的理解是不正确的。使用补丁功能,您实际上可以更改资源的名称,包括命名空间。
这是我最终使用的:
patches:
- target:
kind: Namespace
name: application
patch: |-
- op: replace
path: /metadata/name
value: my-application
您可以像这样使用 Strategic Merge Patch 的删除指令来省略特定资源。
文件夹结构
$ tree .
.
├── base
│ ├── kustomization.yaml
│ └── namespace.yaml
└── overlays
├── dev
│ └── kustomization.yaml
└── prod
├── delete-ns-b.yaml
└── kustomization.yaml
文件内容
$ cat base/kustomization.yaml
resources:
- namespace.yaml
$ cat base/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: ns-a
---
apiVersion: v1
kind: Namespace
metadata:
name: ns-b
$ cat overlays/dev/kustomization.yaml
bases:
- ../../base
$ cat overlays/prod/delete-ns-b.yaml
$patch: delete
apiVersion: v1
kind: Namespace
metadata:
name: ns-b
$ cat overlays/prod/kustomization.yaml
bases:
- ../../base
patchesStrategicMerge:
- delete-ns-b.yaml
kustomize 的行为
$ kustomize build overlays/dev
apiVersion: v1
kind: Namespace
metadata:
name: ns-a
---
apiVersion: v1
kind: Namespace
metadata:
name: ns-b
$ kustomize build overlays/prod
apiVersion: v1
kind: Namespace
metadata:
name: ns-a
在这种情况下,我们在基本文件夹中有两个命名空间。在 dev 中,kustomize 会产生 2 个命名空间,因为没有补丁。但是,在 prod 中,kustomize 只生成一个命名空间,因为 delete patch 会删除命名空间 ns-b。
我遇到了这个问题,最终采用了不同的方法来解决它。回顾您的需求并问问自己为什么要 kustomize
省略资源是值得的?在我的例子中——我想这是最常见的用例——我希望 kustomize
省略一个资源,因为我不想将它应用到目标 kubernetes 集群,但 kustomize
没有没有提供一种简单的方法来做到这一点。在将资源应用到集群时而不是在生成它们时进行过滤不是更好吗?我最终采用的解决方案是在应用到集群时按标签过滤资源。您可以在叠加层中添加排除标签以防止应用资源。
例如
$ kustomize build . | kubectl apply -l apply-resource!=no -f -