kubectl get -o yaml: можно ли скрыть метаданные. ManagedFields - PullRequest
1 голос
/ 29 мая 2020

При использовании kubectl версии 1.18 на microk8s 1.18.3

При получении определения ресурса в формате yaml. Пример kubectl get pod/mypod-6f855c5fff-j8mrw -o yaml. Вывод содержит раздел, связанный с метаданными .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: {}

Ответы [ 3 ]

1 голос
/ 31 мая 2020

проверьте этот плагин kubectl: https://github.com/itaysk/kubectl-neat. он не только удаляет managedField, но и многие другие поля, которые не интересуют пользователей.

например: kubectl get pod mymod -oyaml | kubectl neat или kubectl neat pod mypod -oyaml

1 голос
/ 22 июня 2020

Я хотел бы добавить базовую c информацию об этой функции:

ManagedFields - это раздел, созданный функцией ServerSideApply . Это помогает отслеживать изменения в объектах кластера разными менеджерами .

Если вы отключите его в манифесте 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 может быть исправлено в пустой список для существующего объекта:

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

Это перезапишет управляемые поля списком, содержащим один пустой запись, которая затем приводит к тому, что managedFields полностью удаляется из объекта. Обратите внимание, что простая установка для managedFields пустого списка не приведет к сбросу поля. Это сделано специально, чтобы клиенты, не знающие об этом поле, никогда не удаляли управляемые поля.

0 голосов
/ 29 мая 2020

Первое, что пришло мне в голову, это просто использовать stream editor как sed , чтобы просто пропустить эту часть, начиная с формы managedFields:, до другого конкретного шаблона c.

Он немного жестко запрограммирован, так как вам нужно указать 2 шаблона, например managedFields:, и шаблон окончания, например name: productpage, но он будет работать для этого сценария. Если это вам не подходит, пожалуйста, добавьте дополнительную информацию, как вы хотели бы этого добиться.

sed команда будет выглядеть так:

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

Например, я использовал Nginx pod:

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