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

Kustomize Overlays配置NodePort异常:ports为空数组问题排查

问题描述

目录结构

├── base
│   ├── kustomization.yaml
|   ├── deployment.yaml
│   └── service.yaml
└── overlays
    └── development
        ├── kustomization.yaml
        └── service.yaml

需求

将my-service定义为NodePort类型,并为每个环境配置不同的nodePort值。

各文件内容

base/service.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app/name: my-service
  ports:
  - name: http
    protocol: TCP
    port: 9000
    targetPort: 80
  - name: https
    protocol: TCP
    port: 9001
    targetPort: 443
  type: NodePort

overlays/development/kustomization.yaml

resources:
- ../../base
patchesStrategicMerge:
- service.yaml

overlays/development/service.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - name: http
    nodePort: 30000
  - name: https
    nodePort: 31000

遇到的问题

执行kubectl kustomize overlays/development后,生成的Service中ports为空数组:

$ kubectl kustomize overlays/development
...
---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports: []
  selector:
    app/name: my-service
  type: NodePort
---
...

请问配置哪里出现了问题?


问题分析与解决

问题根源

使用patchesStrategicMerge处理Service的ports数组时,Kustomize需要明确的匹配标识来合并数组元素。你的overlay补丁中仅提供了name和nodePort,缺少Kustomize用于匹配base中端口条目的关键字段port,导致Kustomize无法识别要合并的条目,最终将整个ports数组替换为空。

修复方案

方案1:在补丁中保留匹配用的port字段

修改overlays/development/service.yaml,为每个端口条目添加与base中一致的port值,Kustomize会通过name+port匹配对应条目并合并nodePort:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - name: http
    port: 9000
    nodePort: 30000
  - name: https
    port: 9001
    nodePort: 31000

方案2:使用JSON Patch精准修改

如果不想重复base中的字段,改用patchesJson6902通过路径精准添加nodePort。修改overlays/development/kustomization.yaml:

resources:
- ../../base
patchesJson6902:
- target:
    group: v1
    version: v1
    kind: Service
    name: my-service
  patch: |-
    - op: add
      path: /spec/ports/0/nodePort
      value: 30000
    - op: add
      path: /spec/ports/1/nodePort
      value: 31000

注意:如果base中端口顺序可能变化,更可靠的方式是通过name匹配(需要Kustomize v4.5+支持),或者回到方案1确保匹配字段完整。

验证

执行kubectl kustomize overlays/development,此时生成的Service会包含base中的所有端口配置,同时带上overlay定义的nodePort值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:18:09