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
相关产品推荐
相关产品推荐

