kubernetes v1.18后yaml文件中产生managedFields字段
managedFields字段是kubernetes v1.18后默认启用的Server-Side-Apply特性产生的.
相比于此前的Client-Side-Apply(会产生kubectl.kubernetes.io/last-applied-configuration字段), Server-Side-Apply对字段的管理进行了更细粒度的控制, 不同的Field Manager可以管理资源清单中不同的字段, 修改其他Field Manager管理的字段会产生冲突(可以强制提交), 能够更直观地跟踪不同Field Manager对资源的字段变更. 常见的Field Manager有kubectl和kube-controller-manager.
Server-Side-Apply对于资源的apply和update以及其中的冲突合并权限转移有一套复杂的机制, 具体参见: 官方文档
可以通过在kube-apiserver启动参数中追加 --feature-gates=ServerSideApply=false关闭该特性, 但社区不建议这么做.
由于通过kubectl查看资源yaml或json时, managedFields字段占用篇幅通常都比较大, 因此可以借助kubectl-neat插件去除这些通常不关心的字段:
kubectl get pod mypod -o yaml | kubectl neat
kubectl get pod mypod -oyaml | kubectl neat -o json
也可以使用我们自己的kude工具实现该功能:
kude yn pod mypod
kude jn pod mypod
这两个工具都会去除很多"多余"字段. 如果只想去除managedFields字段, 可以借助jq和yq工具:
kubectl get pod mypod -o yaml | yq d - metadata.managedFields
kubectl get pod mypod -o json | jq -rM 'del(.metadata.managedFields)'