在 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 以显示 managedFieldsyaml。
https://github.com/kubernetes/kubernetes/pull/96878
查看这个 kubectl 插件:https : //github.com/itaysk/kubectl-neat。它不仅删除managedField了用户不感兴趣的许多其他领域。
例如:kubectl get pod mymod -oyaml | kubectl neat或kubectl neat pod mypod -oyaml
对于那些喜欢下载 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 这里阅读更多内容
我想添加一些有关该功能的基本信息:
ManagedFields是由ServerSideApply功能创建的部分。它有助于跟踪不同管理器对集群对象的更改。
如果您在清单中禁用它,则kube-apiserver此更改后创建的所有对象都不会包含metadata.managedFields部分,但不会影响现有对象。
使用您喜欢的文本编辑器打开kube-apiserver清单:
$ sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
Run Code Online (Sandbox Code Playgroud)
将命令行参数添加到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 永远不会被不知道该字段的客户端删除。
| 归档时间: |
|
| 查看次数: |
4219 次 |
| 最近记录: |