现场是这样的。阿里云 ACK 1.27 集群,Ubuntu 22.04,同事在控制台直接编辑过 Deployment,之后 kubectl apply -f deploy.yaml 报 Operation cannot be fulfilled on deployments.apps web: the object has been modified,重试几次结果一样。
中间走过弯路,把「上一次 apply 只成功了一半,status 和 spec 的版本对不上」当成主因,改完现象没变。
这类报错背后常见的原因有几处,逐个排除就行。对象被控制台或别的客户端改过,本地 yaml 里的版本已经过期;文件里显式写了 resourceVersion 字段,apply 时被当成强校验;HPA 或控制器在持续写这个对象,提交瞬间又被改掉。
上来先看对象当前的资源版本
kubectl get deploy web -o jsonpath='{.metadata.resourceVersion}'
随后确认文件里有没有写死版本号
grep -n resourceVersion deploy.yaml
然后改用 server-side apply 让服务端处理冲突
kubectl apply --server-side -f deploy.yaml
还冲突就先导出线上对象再改
kubectl get deploy web -o yaml > web-live.yaml
这类改动我都写进变更记录,过两周再出问题时能对上号。
别只看报错消失,验证要多做一步。apply 输出 deployment.apps/web configured,rollout status 显示 successfully rolled out,再执行一次 apply 不再报冲突。
多人共用集群时尽量统一走 server-side apply,控制台改完要回写 yaml,否则下一次发布还会撞。这类问题最好一次改到位,反复小改反而容易把原因搅混。
