首页/云/Kubernetes 速查/kubectl apply --server-side 服务端应用
kubectl 基础56 条

kubectl apply --server-side 服务端应用

由 API Server 以服务端应用(SSA)模式合并字段,用 managedFields 记录各管理者的字段所有权,解决多方协同编辑冲突。

Kubernetes 速查云更新于 2026-10-13

SSA 是什么

服务端应用(Server-Side Apply,SSA)把原本由 kubectl 在本地做的合并计算交给 API Server:客户端只提交自己负责的字段,apiserver 依据 metadata.managedFields 中记录的字段所有者(field manager)逐字段合并,并在多个管理者争抢同一字段时报冲突。它要解决的是流水线、控制器与运维手工修改同一个对象时互相覆盖的老问题,Kubernetes 1.16 引入、1.22 起正式可用。

基本信息

适用平台Kubernetes 1.16+ 引入,1.22 起 GA
核心命令kubectl apply --server-side -f <文件|目录>
字段账本metadata.managedFields(记录每个字段归谁)
管理者名称--field-manager=<名称>,默认 kubectl
冲突处理--force-conflicts 强行接管字段所有权

典型使用场景

  • 流水线发布:CI 以独立的管理者名只接管自己声明的字段,不再整份覆盖运维手工加的注解与副本数
  • 多控制器共管一个对象:HPA 管 replicas、发布流水线管 image,两边各自记账,互不覆盖
  • GitOps 工具(Argo CD、Flux)启用 SSA 后能准确报告字段漂移,而不是每次都判定整份清单不一致
  • 排查「这个字段是谁改的」:读 managedFields 就能看到每个字段的管理者与最后写入时间
  • 从客户端 apply 迁移过来时,先用 --force-conflicts 一次性接管既有字段所有权,之后回归正常发布流程

常用命令

常用命令
kubectl apply --server-side -f deploy.yaml                        # 以 SSA 方式应用单个清单
kubectl apply --server-side -f ./manifests/ -n prod                # 应用整个目录
kubectl apply --server-side --field-manager=ci-pipeline -f deploy.yaml   # 指定管理者名,便于追责
kubectl apply --server-side --force-conflicts -f deploy.yaml       # 确认归属后强行接管冲突字段
kubectl get deploy web -o yaml | sed -n '/managedFields:/,/status:/p'    # 查看字段所有权账本

managedFields 读法

条目含义关注点
manager写入者名称,如 kubectl、ci-pipeline、kube-controller-manager出现陌生 manager 说明还有别的工具在改同一对象
operationApply 表示 SSA 提交,Update 表示整对象覆盖两种方式混用是所有权争夺的主要来源
fieldsV1该管理者当前拥有的字段清单决定冲突时报出哪个字段
time最后一次写入时间时间很久远说明该管理者已经不再参与维护

冲突报错怎么读

冲突报错怎么读
# Apply failed with 1 conflict: conflict with "kubectl": .spec.replicas
# 含义:另一个管理者也声明了 replicas,SSA 不会隐式覆盖它的字段
# 处理一:确认后者已废弃,用 --force-conflicts 接管
# 处理二:把该字段从本方清单里删掉,让另一方继续持有
客户端 apply 依靠 last-applied-configuration 注解做三方合并,与 SSA 的 managedFields 机制是两套账。同一对象混用两种方式,会出现字段删除语义不一致、所有权互相顶掉的现象,团队内部应统一一种。
--force-conflicts 会把控制器正在管理的字段划到自己名下,例如抢走 HPA 拥有的 replicas 后,HPA 可能不再能写该字段,副本数长期停在清单里的静态值。使用前先看 managedFields 判断归属。

易错点

  • 同一对象混用客户端 apply 与服务端 apply:两套账互不感知,出现「清单改了没生效」或字段被莫名删除,排查时极难定位
  • 无脑加 --force-conflicts:抢走控制器拥有的字段后,自动扩缩与滚动更新的行为静默失效
  • 多个流水线都用默认管理者名 kubectl:冲突日志里分不清是谁写的,也无法按管理者限权
  • 误以为 SSA 会清理清单里所有多余字段:它只删除本管理者曾拥有、如今从清单移除的字段,别人的字段不受影响

数据来源与参考

  • Kubernetes 官方文档 · Server-Side Apply
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌