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

时间:2020-05-29 03:00:06

标签: 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: {}

6 个答案:

答案 0 :(得分:8)

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

<块引用>

kubectl get 现在默认会省略托管字段。 当输出格式为 {teamMembersList.map(teamMember => { return( <TeamMember teamMembers={teamMember} /> ) })} --show-managed-fields 时,用户可以将 json 设置为 true 以显示 managedFields。

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

答案 1 :(得分:2)

既然 --export 已被弃用,要以“原始”格式从您的资源中获取输出(刚刚清理,在这种情况下没有您不想要的任何信息),您可以使用 { 执行以下操作{1}} yq

v4.x

答案 2 :(得分:1)

签出此kubectl插件:https://github.com/itaysk/kubectl-neat。 它不仅删除了managedField,而且删除了许多用户不感兴趣的其他字段。

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

答案 3 :(得分:1)

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

ManagedFields 是由ServerSideApply功能创建的部分。它有助于通过不同的managers跟踪群集对象中的更改。

如果在kube-apiserver中将其禁用,则会显示此更改之后创建的所有对象将没有metadata.managedFields部分,但不会影响现有对象。

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

    $ sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
    
  2. spec.containers.command添加命令行参数:

       - --feature-gates=ServerSideApply=false
    

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

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


或者,managedFields可以patched到现有对象的空列表:

$ kubectl patch pod podname -p '{"metadata":{"managedFields":[{}]}}'

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

答案 4 :(得分:0)

我想到的第一件事就是像sed这样使用stream editor,只是将这部分乞讨形式managedFields:跳过到另一个特定的模式。

它有点硬编码,因为您需要指定2个模式(例如managedFields:和结束模式(例如name: productpage),但适用于这种情况。如果这不适合您,请添加更多详细信息,以及您希望如何实现。

sed命令如下:

sed -n '/(Pattern1)/{p; :a; N; /(Pattern2)/!ba; s/.*\n//}; p'

例如,我使用Nginx吊舱:

$ kubectl get po nginx -o yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubernetes.io/limit-ranger: 'LimitRanger plugin set: cpu request for container
      nginx'
  creationTimestamp: "2020-05-29T10:54:18Z"
...
spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: nginx
   ...
status:
  conditions:
...
        startedAt: "2020-05-29T10:54:19Z"
  hostIP: 10.154.0.29
  phase: Running
  podIP: 10.52.1.6
  podIPs:
  - ip: 10.52.1.6
  qosClass: Burstable
  startTime: "2020-05-29T10:54:18Z"

使用sed

之后
$ kubectl get po nginx -o yaml | sed -n '/annotations:/{p; :a; N; /hostIP: 10.154.0.29/!ba; s/.*\n//}; p'
apiVersion: v1
kind: Pod
metadata:
  annotations:
  hostIP: 10.154.0.29
  phase: Running
  podIP: 10.52.1.6
  podIPs:
  - ip: 10.52.1.6
  qosClass: Burstable
  startTime: "2020-05-29T10:54:18Z"

在您的情况下,命令如下:

$ kubectl get pod/mypod-6f855c5fff-j8mrw -o yaml | sed -n '/managedFields:/{p; :a; N; /name: productpage/!ba; s/.*\n//}; p'

应该给出如下输出:

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:
  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: {}

答案 5 :(得分:0)

对于那些喜欢下载 yaml 和删除不需要的密钥的人,试试这个:

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

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

您可以添加/加入更多 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)' - 

有谁知道如何将所有这些 yq eval 合并到一个块中,而不是一个接一个地链接起来?

您可以在 yq delete here

上阅读更多内容