# 问题背景

首先,你有没有遇到过这样的情况

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-cm
  namespace: default
  labels:
    test-label: test
  managedFields:
  - manager: kubectl
    operation: Apply
    apiVersion: v1
    time: "2010-10-10T0:00:00Z"
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:labels:
          f:test-label: {}
      f:data:
        f:key: {}
data:
  key: some value

这特么的一堆括号是什么东西??????

有什么用????????

其实是记录的迭代的信息。要说有啥用,其实真的没有啥用

# 结论

以 kubectl get no 场景为例,当集群节点非常多的时候,集群 pod 非常多的时候,建议优化关闭不需要的字段。

ServerSideApply=false

kubectl get 资源的执行过程,是以 500 个对象为一个分页,从 apiserver 到 etcd 进行一致性读操作,将全部分页读到本地 并显示;过程中,会 get 每个资源对象的 yaml。通过 kubectl get <资源> -v 9 可以看到详细执行过程。所以减少单个资源 对象的 yaml size,可以缩短 kubectl get 的执行时间。

# 优缺点

关闭 ServerSideApply featureGate (https://kubernetes.io/zh-cn/docs/reference/using-api/server-side-apply/ ),关闭 managedFields 更新。需要修改 apiserver 参数,期间 apiserver 会滚动更新,对生产业务无影响。

优点:

关闭之后,该字段不会更新,从而控制该字段导致的持续增长。针对新开集群操作后,可以避免后续 get 资源的时 候产生较大的数据量,造成 kubectl 缓慢。随开随用。

缺点:

在后续部署的时候,yaml 中无法携带 managedFields 字段,否则会 apply 失败。

关闭了之后你会发现:

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-cm
  namespace: default
  labels:
    test-label: test
data:
  key: some value

哇擦,好整洁,但是只对新增的资源生效哦,不会对已有的资源有改变。

更新于

请我喝[茶]~( ̄▽ ̄)~*

baim0 微信支付

微信支付

baim0 支付宝

支付宝

baim0 贝宝

贝宝