You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用kubectl kustomize生成资源时出现多余占位符行,如何修复?

问题:Kustomize生成的配置中出现多余占位符行

执行kubectl kustomize ./overlays/dev后,生成的Deployment配置保留了base文件中的占位符行(image: IMAGE_PLACEHOLDER和name: CONTAINER_NAME_PLACEHOLDER),示例输出如下:

...
containers:
      - image: registry.mycompany.ru/project/app:VERSION
        name: myname
        image: IMAGE_PLACEHOLDER #--- unwanted line
        name: CONTAINER_NAME_PLACEHOLDER #--- unwanted line
        ports:
        - containerPort: 80

相关文件内容:

base/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
        - image: IMAGE_PLACEHOLDER
          name: CONTAINER_NAME_PLACEHOLDER

base/kustomization.yaml

resources:
  - deployment.yaml

overlays/dev/kustomization.yaml

resources:
  - ../../base
commonLabels:
  app: myname
patchesStrategicMerge:
  - change_container_name.yaml

overlays/dev/change_container_name.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  template:
    spec:
      containers:
        - name: myname
          image: registry.mycompany.ru/project/app:VERSION

解决方案

出现这个问题的核心原因是:Kustomize的Strategic Merge Patch处理容器数组时,默认会尝试合并字段而非替换。由于patch中的容器name与base中的占位符name不一致,Kustomize无法识别为同一个容器,导致字段重复。

以下是三种可行的解决方法:

方法一:匹配base中的容器占位符,更新字段

修改overlays/dev/change_container_name.yaml,先指定base中容器的原始name(占位符),再更新为新值。这样Kustomize会定位到目标容器并覆盖原有字段:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  template:
    spec:
      containers:
      - name: CONTAINER_NAME_PLACEHOLDER
        image: registry.mycompany.ru/project/app:VERSION
        name: myname

方法二:使用$patch: replace替换整个容器数组

如果需要完全替换base中的容器配置,可在patch中添加$patch: replace标识,直接覆盖整个containers数组:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  template:
    spec:
      containers:
      - name: myname
        image: registry.mycompany.ru/project/app:VERSION
      $patch: replace

方法三:使用JSON Patch精确替换字段

创建JSON格式的patch文件(例如overlays/dev/container_patch.json),通过路径精确指定要替换的字段:

[
  {
    "op": "replace",
    "path": "/spec/template/spec/containers/0/image",
    "value": "registry.mycompany.ru/project/app:VERSION"
  },
  {
    "op": "replace",
    "path": "/spec/template/spec/containers/0/name",
    "value": "myname"
  }
]

然后修改overlays/dev/kustomization.yaml,改用patches字段引用该JSON文件:

resources:
  - ../../base
commonLabels:
  app: myname
patches:
  - path: container_patch.json
    target:
      kind: Deployment
      name: app

内容的提问来源于stack exchange,提问作者Victoria Agafonova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:52:20