Kustomize内置PatchTransformer能否直接引用YAML文件而非值映射?
首先明确:你期望的那种直接在PatchTransformer的value字段里写文件路径的写法,Kustomize内置的PatchTransformer并不支持。不过可以通过两种更简洁的方式实现配置复用,把外部YAML中的亲和性规则注入到Deployment中。
方案一:直接用kustomization.yaml的patches字段引用外部Patch文件
这是最直接的实现方式,不需要单独定义PatchTransformer资源,步骤如下:
调整
common/affinity_common.yaml为标准的JSON Patch格式(也可以用Strategic Merge Patch,格式更简单):- op: add path: /spec/template/spec/affinity value: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - simple-deployment topologyKey: "kubernetes.io/hostname"如果用Strategic Merge Patch,文件可以简化为纯亲和性结构(Kustomize会自动匹配路径注入):
spec: template: spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - simple-deployment topologyKey: "kubernetes.io/hostname"修改
overlay/staging/kustomization.yaml,添加patches字段引用外部文件:apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization bases: - ../../base/app1 patches: - path: ../../common/affinity_common.yaml target: kind: Deployment group: apps执行
kustomize build overlay/staging/即可完成亲和性配置的注入。
方案二:通过ConfigMap复用配置(适合多场景共享)
如果需要在多个地方复用这份亲和性配置,或者需要动态调整,可以先把配置存入ConfigMap,再结合PatchTransformer注入(适合需要模板化的场景):
调整
common/affinity_common.yaml为纯亲和性结构:podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - simple-deployment topologyKey: "kubernetes.io/hostname"在
overlay/staging/kustomization.yaml中生成ConfigMap并配置变量:apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization bases: - ../../base/app1 configMapGenerator: - name: affinity-config files: - affinity=../../common/affinity_common.yaml vars: - name: AFFINITY_CONFIG objref: kind: ConfigMap name: affinity-config apiVersion: v1 fieldref: fieldpath: data.affinity编写PatchTransformer引用变量(需要注意YAML转义,相对复杂,推荐方案一):
apiVersion: builtin kind: PatchTransformer metadata: name: add-affinity target: kind: Deployment group: apps patch: |- - op: add path: /spec/template/spec/affinity value: {{AFFINITY_CONFIG}}这种方式需要确保变量解析后的内容是合法YAML,适合复杂配置的多场景复用。
关键提示
- 方案一的
patches字段是Kustomize推荐的配置复用方式,比单独定义PatchTransformer更简洁易维护。 - 所有文件路径都是相对于当前
kustomization.yaml的相对路径,需确保路径正确。
内容的提问来源于stack exchange,提问作者Tim

