
kubectl-neat 使用指南
简介
kubectl-neat 是一个 Kubernetes 清理工具,用于移除 Kubernetes manifests 中的冗余信息,使输出更加简洁可读。
项目地址: https://github.com/itaysk/kubectl-neat
为什么需要它?
当你创建 Kubernetes 资源后,Kubernetes 会自动添加大量系统信息:
- 元数据:creationTimestamp、uid、resourceVersion 等内部系统信息
- 默认值填充:缺失属性会被自动填充默认值
- 准入控制器注入:如 ServiceAccount token 等自动注入内容
- 状态信息:status 字段等运行时状态
使用 kubectl get 导出的资源会变得冗长且难以阅读,kubectl-neat 可以清理这些多余信息。
安装
二进制部署(推荐)
# 下载
wget https://github.com/itaysk/kubectl-neat/releases/download/v2.0.4/kubectl-neat_linux_amd64.tar.gz
# 解压
tar -xzf kubectl-neat_linux_amd64.tar.gz
# 移动到 PATH
mv kubectl-neat /usr/local/bin/
# 赋予执行权限
chmod +x /usr/local/bin/kubectl-neat
# 验证安装
kubectl-neat version
kubectl-neat version: 2.0.4使用方式
模式一:本地文件或标准输入
默认模式,处理本地 YAML/JSON 文件或 stdin 输入。
常用命令:
# 清理 kubectl get 的输出(最常用)
kubectl get pod mypod -o yaml | kubectl neat
# 输出为 JSON 格式
kubectl get pod mypod -oyaml | kubectl neat -o json
# 从文件读取
kubectl neat -f ./my-pod.yaml
# 从标准输入读取
kubectl neat -f - < ./my-pod.json
# 指定输出格式
kubectl neat -f ./my-pod.json --output yaml模式二:直接获取 Kubernetes 资源
使用 get 子命令,一步完成获取和清理。
# 获取指定命名空间的 deployment
kubectl neat get -- deployment -n base-uat tsingyun-alarm -oyaml
# 获取指定命名空间的 Service
kubectl neat get -- svc -n default myservice --output jsonDemo 演示
原始输出 vs 清理后对比
原始 kubectl get pod -o yaml 输出(冗长):
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2024-01-15T10:30:00Z"
generateName: myapp-
labels:
app: myapp
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:labels:
.: {}
f:app: {}
f:spec:
f:containers:
k:{"name":"myapp"}:
.: {}
f:image: {}
f:name: {}
f:resources: {}
f:terminationMessagePath: {}
f:terminationMessagePolicy: {}
manager: kubectl-create
operation: Update
time: "2024-01-15T10:30:00Z"
name: myapp-abc123
namespace: default
resourceVersion: "1234567"
uid: 12345678-1234-1234-1234-123456789abc
spec:
containers:
- image: nginx:latest
imagePullPolicy: IfNotPresent
name: myapp
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-xyz
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: node-1
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: kube-api-access-xyz
projected:
sources:
- serviceAccountToken:
path: token
status:
phase: Running
podIP: 10.244.0.5
# ... 更多状态信息使用 kubectl neat 清理后:
apiVersion: v1
kind: Pod
metadata:
labels:
app: myapp
name: myapp-abc123
namespace: default
spec:
containers:
- image: nginx:latest
name: myapp工作原理
kubectl-neat 主要处理两类冗余信息:
1. Kubernetes 对象模型默认值
通过调用 Kubernetes 相同的默认值逻辑,识别哪些字段是自动填充的默认值并移除。
2. 准入控制器注入内容
| 控制器 | 说明 | 处理方式 |
|---|---|---|
| ServiceAccount | 设置默认 SA 和 token | 移除 default-token-* volumes,移除废弃的 spec.serviceAccount |
| Kubernetes Scheduler | 调度 Pod 到节点 | 移除 spec.nodeName |
| NamespaceLifecycle | 拒绝在删除命名空间中的操作 | 忽略 |
| LimitRanger | 设置默认资源请求/限制 | 忽略 |
实用场景
- 导出资源用于迁移/备份:清理冗余信息,生成干净的 manifest
- 故障排查时对比配置:去除干扰信息,聚焦关键配置
- 学习 Kubernetes 资源结构:理解哪些是用户定义的,哪些是系统添加的
- 创建模板:从现有资源快速提取干净的配置模板
注意事项
⚠️ 该项目已停止维护:作者声明项目已完成功能开发,不再积极维护。如需新功能,可考虑 Fork 或寻找替代方案。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 运维小弟