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

K8s重新部署Deployment时修改同名称containerPort触发重复报错如何解决

问题根因

The Deployment "mytestservice-deployment" is invalid: spec.template.spec.containers[0].ports[2].name: Duplicate value: "mng-mytest"

该错误由Kubernetes对Deployment中ports数组的默认合并策略导致:K8s对container.ports数组执行strategic merge patch时,默认以containerPort + protocol作为合并键,而非端口name。你新提交的配置中同name的端口更换了containerPort,会被系统判定为新增端口,原有9095的旧端口不会被自动删除,最终出现两个name相同的端口,触发重复校验报错。


解决方案

场景1:可接受短时间业务中断

直接执行全量替换操作,用新配置覆盖现有Deployment:

kubectl replace -f your-deployment.yaml --force

该操作会先删除现有Deployment,再重新创建,新端口配置会直接生效。

场景2:要求业务无中断更新

方法1:分两步滚动更新

  • 第一步:先在配置中删除旧的mng-mytest端口配置,执行kubectl apply,滚动更新完成后存量Deployment会移除9095端口
  • 第二步:再在配置中添加name为mng-mytest、containerPort为9090的端口配置,再次执行kubectl apply即可成功生效

方法2:单次提交使用JSON Patch明确删除旧端口

如果不想分两次提交,可以先执行patch删除旧端口再apply新配置:

# 注意路径要和报错信息中的端口索引保持一致
kubectl patch deployment mytestservice-deployment --type json -p '[{"op": "remove", "path": "/spec/template/spec/containers/0/ports/2"}]' && kubectl apply -f your-deployment.yaml

方法3:使用服务端Apply(SSA)

开启服务端Apply模式,系统会自动识别配置差异并删除不在新配置中的字段:

kubectl apply -f your-deployment.yaml --server-side --force-conflicts

后续规避方案

调整同名称端口配置时,优先选择先删除旧配置再添加新配置的发布流程,避免触发合并策略导致的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:27:00