在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: {}
答案 0 :(得分:8)
Kubectl 1.21 默认不再包含托管字段
<块引用>kubectl get 现在默认会省略托管字段。
当输出格式为 {teamMembersList.map(teamMember => {
return(
<TeamMember
teamMembers={teamMember}
/>
)
})}
或 --show-managed-fields
时,用户可以将 json
设置为 true 以显示 managedFields。
答案 1 :(得分:2)
既然 --export
已被弃用,要以“原始”格式从您的资源中获取输出(刚刚清理,在这种情况下没有您不想要的任何信息),您可以使用 { 执行以下操作{1}} yq
:
v4.x
答案 2 :(得分:1)
签出此kubectl插件:https://github.com/itaysk/kubectl-neat。
它不仅删除了managedField
,而且删除了许多用户不感兴趣的其他字段。
例如:kubectl get pod mymod -oyaml | kubectl neat
或kubectl neat pod mypod -oyaml
答案 3 :(得分:1)
我想添加有关该功能的一些基本信息:
ManagedFields 是由ServerSideApply功能创建的部分。它有助于通过不同的managers跟踪群集对象中的更改。
如果在kube-apiserver
中将其禁用,则会显示此更改之后创建的所有对象将没有metadata.managedFields
部分,但不会影响现有对象。
使用您喜欢的文本编辑器打开kube-apiserver
清单:
$ sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
向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