如何使用Kustomize在Overlay中复制基础对象?
如何用Kustomize从单个基础资源生成多个自定义资源实例
可以实现,核心思路是复制基础资源生成多个独立实例,再分别对每个实例应用补丁修改名称和属性,避免互相覆盖。下面提供两种可行方案:
方案一:多次引用基础资源+定向补丁
在overlay的my-env/kustomization.yaml中,多次引用base目录,然后通过带target的补丁分别定位每个实例进行修改:
- 修改
my-env/kustomization.yaml:
resources: - ../base - ../base # 第二次引用base,生成第二个实例 patches: # 第一个实例的补丁 - target: group: <你的自定义资源组> version: <你的自定义资源版本> kind: ClusterOutput name: <base中的原始名称> patch: |- - op: replace path: /metadata/name value: instance-1 - op: add path: /spec/opensearch/logstash_prefix value: prefix-1 # 第二个实例的补丁 - target: group: <你的自定义资源组> version: <你的自定义资源版本> kind: ClusterOutput name: <base中的原始名称> patch: |- - op: replace path: /metadata/name value: instance-2 - op: add path: /spec/opensearch/logstash_prefix value: prefix-2
注意:需要替换
<你的自定义资源组/版本>以及<base中的原始名称>为实际值,base中的原始名称是base.ClusterOutput.yaml里metadata.name的初始值。
这种方法的优势是直观,不需要额外文件,适合实例数量不多的场景。
方案二:使用Kustomize生成器(适合大量实例)
如果需要生成大量实例,可以用Kustomize的generators功能,基于基础模板批量生成:
- 在
my-env目录下创建一个生成器配置文件clusteroutput-generator.yaml:
apiVersion: builtin kind: ListGenerator metadata: name: clusteroutput-generator elements: - name: instance-1 prefix: prefix-1 - name: instance-2 prefix: prefix-2 # 可以继续添加更多实例
- 修改
my-env/kustomization.yaml,引入生成器和基础模板:
resources: - ../base generators: - clusteroutput-generator.yaml patches: - patch: |- - op: replace path: /metadata/name value: '{{.name}}' - op: add path: /spec/opensearch/logstash_prefix value: '{{.prefix}}' target: group: <你的自定义资源组> version: <你的自定义资源版本> kind: ClusterOutput name: <base中的原始名称>
这里利用Kustomize的模板渲染功能,将生成器中的参数注入到补丁中,批量生成不同的实例。
验证效果
运行kustomize build my-env,就能看到两个(或多个)独立的ClusterOutput实例,每个都有自己的名称和logstash_prefix属性,不会互相覆盖。
对于只需要单个实例的环境,只需保留一次base引用和对应的单个补丁即可,无需修改基础文件。
内容的提问来源于stack exchange,提问作者kampfmoehre
相关产品推荐
相关产品推荐

