现场是这样的。阿里云 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,否则下一次发布还会撞。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189