kubectl get -o yaml:是否可以隐藏 metadata.managedFields

Pol*_*ase 6 kubectl

在 microk8s 1.18.3 上使用 kubectl 1.18 版

以 yaml 格式获取资源定义时。例子 kubectl get pod/mypod-6f855c5fff-j8mrw -o yaml。输出包含与metadata.managedFields相关的部分

有没有办法隐藏它metadata.managedFields以缩短控制台输出?

下面是一个输出示例,可以更好地说明问题。

apiVersion: v1
kind: Service
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"productpage","service":"productpage"},"name":"productpage","namespace":"bookinfo"},"spec":{"ports":[{"name":"http","port":9080}],"selector":{"app":"productpage"}}}
  creationTimestamp: "2020-05-28T05:22:41Z"
  labels:
    app: productpage
    service: productpage
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:kubectl.kubernetes.io/last-applied-configuration: {}
        f:labels:
          .: {}
          f:app: {}
          f:service: {}
      f:spec:
        f:ports:
          .: {}
          k:{"port":9080,"protocol":"TCP"}:
            .: {}
            f:name: {}
            f:port: {}
            f:protocol: {}
            f:targetPort: {}
        f:selector:
          .: {}
          f:app: {}
        f:sessionAffinity: {}
        f:type: {}
    manager: kubectl
    operation: Update
    time: "2020-05-28T05:22:41Z"
  name: productpage
  namespace: bookinfo
  resourceVersion: "121804"
  selfLink: /api/v1/namespaces/bookinfo/services/productpage
  uid: feb5a62b-8784-41d2-b104-bf6ebc4a2763
spec:
  clusterIP: 10.152.183.9
  ports:
  - name: http
    port: 9080
    protocol: TCP
    targetPort: 9080
  selector:
    app: productpage
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}
Run Code Online (Sandbox Code Playgroud)

Rod*_*nez 10

Kubectl 1.21 默认不再包含托管字段

kubectl get 现在默认会省略托管字段。--show-managed-fields当输出格式为json或时,用户可以设置为 true 以显示 managedFields yaml

https://github.com/kubernetes/kubernetes/pull/96878


ita*_*ysk 9

查看这个 kubectl 插件:https : //github.com/itaysk/kubectl-neat。它不仅删除managedField了用户不感兴趣的许多其他领域。

例如:kubectl get pod mymod -oyaml | kubectl neatkubectl neat pod mypod -oyaml


Rob*_*jan 8

对于那些喜欢下载 yaml 并删除不需要的密钥的人,请尝试以下操作:

安装yq然后尝试(请确保您获得 yq 版本 4.x):

cat k8s-config.yaml | yq eval 'del(.status)' - 
   --OR--
kubectl --namespace {namespace} --context {cluster} get pod {podname} | yq ...
Run Code Online (Sandbox Code Playgroud)

您可以添加/加入更多yq来删除更多键。这是我所做的:

cat k8s-config.yaml | yq eval 'del(.status)' -  | yq eval 'del (.metadata.managedFields)' - | yq eval 'del (.metadata.annotations)' - | yq eval 'del (.spec.tolerations)' -  | yq eval 'del(.metadata.ownerReferences)' - | yq eval 'del(.metadata.resourceVersion)' - | yq eval 'del(.metadata.uid)' - | yq eval 'del(.metadata.selfLink)' - | yq eval 'del(.metadata.creationTimestamp)' - | yq eval 'del(.metadata.generateName)' - 
Run Code Online (Sandbox Code Playgroud)

- 或者 -

cat k8s-config.yaml | yq eval 'del(.status)' - \
 | yq eval 'del (.metadata.managedFields)' - \
 | yq eval 'del (.metadata.annotations)' - \
 | yq eval 'del (.spec.tolerations)' - \
 | yq eval 'del(.metadata.ownerReferences)' - \
 | yq eval 'del(.metadata.resourceVersion)' - \
 | yq eval 'del(.metadata.uid)' - \
 | yq eval 'del(.metadata.selfLink)' - \
 | yq eval 'del(.metadata.creationTimestamp)' - \
 | yq eval 'del(.metadata.generateName)' - 
Run Code Online (Sandbox Code Playgroud)

另一种方法是在您的或上有一个neat()函数并按如下方式调用它:~/.bashrc~/.zshrc

neat()功能:

neat () {
  yq eval 'del(.items[].metadata.managedFields,
    .metadata,
    .apiVersion,
    .items[].apiVersion,
    .items[].metadata.namespace,
    .items[].kind,
    .items[].status,
    .items[].metadata.annotations,
    .items[].metadata.resourceVersion,
    .items[].metadata.selfLink,.items[].metadata.uid,
    .items[].metadata.creationTimestamp,
    .items[].metadata.ownerReferences)' -
}
Run Code Online (Sandbox Code Playgroud)

然后:

kubectl get pods -o yaml | neat 
cat k8s-config.yaml | neat
Run Code Online (Sandbox Code Playgroud)

您可以在yq delete 这里阅读更多内容


VAS*_*VAS 5

我想添加一些有关该功能的基本信息:

ManagedFields是由ServerSideApply功能创建的部分。它有助于跟踪不同管理器对集群对象的更改。

如果您在清单中禁用它,则kube-apiserver此更改后创建的所有对象都不会包含metadata.managedFields部分,但不会影响现有对象。

  1. 使用您喜欢的文本编辑器打开kube-apiserver清单:

    $ sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将命令行参数添加到spec.containers.command

       - --feature-gates=ServerSideApply=false
    
    Run Code Online (Sandbox Code Playgroud)

kube-apiserver将立即重新启动。
通常需要几分钟才能kube-apiserver再次开始处理请求。

ServerSideApply您还可以在集群创建阶段禁用功能门。


或者,managedFields可以将现有对象修补为空列表:

$ kubectl patch pod podname -p '{"metadata":{"managedFields":[{}]}}'
Run Code Online (Sandbox Code Playgroud)

这将使用包含单个空条目的列表覆盖管理字段,然后导致管理字段被完全从对象中剥离。请注意,仅将 ManagedFields 设置为空列表不会重置该字段。这是故意的,因此 ManagedFields 永远不会被不知道该字段的客户端删除。