首页/云/云与容器速查/服务端应用(--server-side)
Kubernetes68 条

服务端应用(--server-side)

由 API Server 合并字段:多管理者(kubectl、Operator、控制器)各管各的字段,冲突显式报错而非静默覆盖;大规模与 GitOps 场景推荐。

云与容器速查云更新于 2026-10-13

服务端应用是什么

普通的 apply 在客户端算出补丁再发给集群,冲突时容易后写覆盖先写;服务端应用把合并交给 API Server:每个字段记录由哪个管理者(kubectl、控制器、运维脚本)负责,谁改了自己负责的字段还能改回去,改别人的字段则明确报冲突。它还顺带解决了客户端 apply 把上一份配置存进注解、大对象撑爆注解上限的问题。多控制器共同管理同一对象、或使用 GitOps 工具链时,服务端应用是更稳的选择。

基本信息

启用方式kubectl apply --server-side -f 文件.yaml
字段管理每个字段由 managedFields 记录所属管理者,可用 --field-manager 指定名字
冲突处理--force-conflicts 可强制接管他人字段,属于危险操作
适用版本客户端 1.16 起支持,集群侧能力在 1.22 起正式可用
优势不再依赖上一份配置注解,大对象不受注解大小限制
查看kubectl get 对象 -o yaml 里的 managedFields 段

典型使用场景

  • GitOps 工具与人工 kubectl 同时管理同一对象,需要明确字段归属
  • 大对象 apply 报注解过大错误,需要绕开注解存储机制
  • 排查字段漂移:确认某个字段当前由哪个管理者持有
  • 多控制器共同维护同一自定义资源的不同字段
  • 从客户端应用迁移到服务端应用的过渡期,逐步统一管理策略

使用示例

使用示例
kubectl apply --server-side -f deploy.yaml   # 由 API Server 合并字段
kubectl apply --server-side --field-manager=ci-bot -f deploy.yaml   # 指定管理者名,便于定位冲突
kubectl get deploy web -o yaml | grep -A15 managedFields   # 看字段由谁管理
kubectl apply --server-side --force-conflicts -f deploy.yaml   # 强制接管冲突字段(谨慎)
kubectl apply --server-side --dry-run=server -f deploy.yaml   # 先试运行确认不会冲突

冲突处理对照

现象原因处理方式
提示字段冲突字段已被其他管理者持有先确权,再决定是否强制接管
字段被改回原值另一控制器持续收敛该字段明确责任边界,不要两边同时管
注解过大报错客户端应用把上一份配置写进注解改用服务端应用
字段归属混乱新旧客户端混用写入统一客户端版本与策略
从客户端应用迁移到服务端应用时,首次执行很可能报冲突:确认没有控制器正在管理相关字段后,再使用强制接管完成过渡。
--force-conflicts 会把字段从其他管理者手里夺走:未确权就使用,控制器可能反复把配置改回,形成来回抖动。

易错点

  • 无脑加 --force-conflicts:把其他控制器的字段一并夺走,行为漂移且难定位
  • 迁移期两种应用方式混用:冲突提示不断,团队误以为集群本身有故障
  • 用旧版 kubectl 做服务端应用:字段管理语义不一致,记录越写越乱
  • 只看 apply 成功不看字段归属:改动其实已被别的管理者接管,实际未生效
  • 把强制接管当成常规修复手段:责任边界越来越模糊,后续无人敢改配置

数据来源与参考

  • Kubernetes Docs:Server-Side Apply

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌