【问题标题】:Kustomize best practice to apply the same patch to multiple base filesKustomize 将同一补丁应用于多个基础文件的最佳实践
【发布时间】:2023-02-10 10:45:53
【问题描述】:
我有一个不同版本的应用程序。每个版本的基础资源文件略有不同。但是需要应用到基础文件的补丁是相同的。将相同的补丁应用于不同的基础资源并分别具有不同的输出文件的最佳结构应该是什么。
/base1/
/app-v1
/kustomization.yaml
/base2/
/app-v2
/kustomization.yaml
/overlays/
/dev/
/staging/
我应该如何指定资源以使与v1和v2相同的基础kustomization.yaml中的覆盖和补丁适用于不同的基础文件?
理想情况下,对不同的基础使用不同的 kustomize build 命令,但使用相同的补丁文件。
【问题讨论】:
标签:
kubernetes
yaml
kustomize
json-patch
【解决方案1】:
一种方法是在 /overlays/ 中创建一个 kustomization 文件,包括来自 dev/ 和 staging/ 的补丁和配置。例如:
$> cat ./overlays/kustomization.yaml
resources:
- ./dev/foo.yaml
- ./staging/bar.yaml
patchesJson6902:
- target:
version: v1
groups: apps
kind: Deployment
name: my-app
patch: ./dev/patch-deploy.yaml
并包括来自你的 base1 和 base2 kustomization 的 overlays 文件夹:
$> cat ./base1/kustomization.yaml
resources:
- ./app-v1/stuff.yaml
- ../overlays/
[...]
$> cat ./base2/kustomization.yaml
resources:
[...]
- ../overlays/
然后,您可以从任一基本文件夹运行 kustomization,同时它们都会处理您的 overlays 文件夹的内容。
【解决方案2】:
你可以使用组件:https://github.com/kubernetes/enhancements/tree/master/keps/sig-cli/1802-kustomize-components
目标:...提供允许用户定义组件的实现,即能够修改一组基本资源而不会发生冲突的可移植覆盖,因为补丁是序列化的
这会将 /components/patch-bases/patch.yaml 应用于开发和暂存中的 base1 和 base2:
/components/patch-bases/patch.yaml
<a patch>
/components/patch-bases/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1alpha1
kind: Component
patches:
- path: patch.yaml
target: <selector matching all objects>
/overlays/dev/kustomization.yaml
bases:
- ../../base1
- ../../base2
components:
- ../../components/patch-bases
<overlay-specific stuff>
/overlays/staging/kustomization.yaml
bases:
- ../../base1
- ../../base2
components:
- ../../components/patch-bases
<overlay-specific stuff>