1. 简介
在 Kubernetes 中,我们通常使用 kubectl get all
命令来查看某个命名空间下的所有资源。然而,这个命令返回的资源类型是有限的,并不能覆盖所有可能存在的资源种类。当我们需要一个完整的资源清单时,这种限制就会带来问题。
本文将介绍如何在 Kubernetes 中列出某个命名空间下所有类型的资源,包括内置资源和自定义资源。
2. 使用 kubectl get all
我们最常使用的命令之一是 kubectl get all
:
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/app-deployment-5dc467b756-4zwcp 0/1 CreateContainerConfigError 0 5d19h
pod/app-deployment-5dc467b756-qplj6 0/1 CreateContainerConfigError 0 5d19h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d22h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/app-deployment 0/2 2 0 5d19h
NAME DESIRED CURRENT READY AGE
replicaset.apps/app-deployment-5dc467b756 2 2 0 5d19h
该命令会列出如下资源类型:
✅ Pod
✅ Service
✅ Deployment
✅ ReplicaSet
✅ DaemonSet
✅ Job
✅ CronJob
✅ StatefulSet
❌ 但不会列出如下资源类型:
- ConfigMap
- Secret
- PersistentVolume
- PersistentVolumeClaim
- Ingress
- ServiceAccount
- 等等
因此,如果我们需要更全面的资源列表,必须寻找替代方案。
3. 使用 kubectl api-resources
为了获取命名空间下所有资源的完整列表,我们可以结合使用 kubectl api-resources
和 kubectl get
。
3.1. kubectl api-resources
命令详解
该命令可以列出 Kubernetes 集群中所有支持的 API 资源:
$ kubectl api-resources --verbs=list --namespaced -o name
参数说明:
--verbs=list
:仅列出支持list
操作的资源--namespaced
:仅列出属于命名空间的资源-o name
:仅输出资源名称
我们可以将这些资源名称传递给 kubectl get
命令:
$ kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --ignore-not-found --show-kind -n <namespace>
参数说明:
xargs -n 1
:每次只传递一个资源名称--ignore-not-found
:忽略不存在的资源类型,防止报错--show-kind
:显示资源类型,便于识别
这样就能获取一个完整的资源清单。
3.2. 示例
以 default
命名空间为例执行命令:
$ kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --ignore-not-found --show-kind
输出示例:
NAME DATA AGE
configmap/db-config 1 137m
NAME ENDPOINTS AGE
endpoints/kubernetes 192.168.49.2:8443 6d1h
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/www-web-0 Bound pvc-43444fce-40e5-4b85-9336-95776ffe332e 1Gi RWO standard 139m
NAME READY STATUS RESTARTS AGE
pod/app-deployment-5dc467b756-4zwcp 0/1 CreateContainerConfigError 0 5d22h
NAME SECRETS AGE
serviceaccount/default 0 10d
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d1h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/app-deployment 0/2 2 0 5d22h
NAME DESIRED CURRENT READY AGE
replicaset.apps/app-deployment-5dc467b756 2 2 0 5d22h
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress.networking.k8s.io/minimal-ingress nginx-example * 80 44m
✅ 该命令成功列出了 ConfigMap、Endpoints、PersistentVolumeClaim、ServiceAccount、Ingress 等资源,覆盖了 kubectl get all
无法显示的资源类型。
4. 使用 for
循环替代 xargs
除了使用 xargs
,我们也可以使用 for
循环来实现同样的效果:
$ for i in $(kubectl api-resources --namespaced --verbs=list -o name | tr "\n" " "); do
kubectl get $i --show-kind --ignore-not-found;
done
⚠️ 注意:这种方式在资源数量较多时可能会有性能问题,但输出结果与上一节一致。
5. 获取特定资源类型的列表
有时我们不需要列出所有资源,而是只需要某些特定类型的资源。这时可以使用如下命令:
$ kubectl get <type1>,<type2>,<type3> -n <namespace>
例如,列出 kube-system
命名空间下的 ConfigMap、PersistentVolume、Endpoints、Ingress 和 ServiceAccount:
$ kubectl get configmaps,pv,endpoints,ingress,serviceaccounts -n kube-system
输出示例:
NAME DATA AGE
configmap/coredns 1 10d
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pvc-43444fce-40e5-4b85-9336-95776ffe332e 1Gi RWO Delete Bound default/www-web-0 standard 4h36m
NAME ENDPOINTS AGE
endpoints/k8s.io-minikube-hostpath <none> 10d
NAME SECRETS AGE
serviceaccount/attachdetach-controller 0 10d
✅ 这种方式更灵活,适合只关注特定资源类型的场景。
6. 获取所有资源类型的清单
如果我们想查看所有可用的资源类型,可以使用以下命令。
6.1. 内置资源类型
Kubernetes 默认支持的资源类型包括:
- Pod
- Deployment
- ReplicaSet
- StatefulSet
- DaemonSet
- PersistentVolume
- PersistentVolumeClaim
- Service
- Namespace
- ConfigMap
- Secret
- Job
这些资源可以通过 kubectl get all
查看,但如前所述,部分资源类型不会被包含。
6.2. 自定义资源类型
使用 kubectl api-resources
可以查看所有资源类型:
$ kubectl api-resources
输出示例:
NAME SHORTNAMES APIVERSION NAMESPACED KIND VERBS
bindings v1 true Binding create
componentstatuses cs v1 false ComponentStatus get,list
configmaps cm v1 true ConfigMap create,delete,deletecollection,get,list,patch,update,watch
endpoints ep v1 true Endpoints create,delete,deletecollection,get,list,patch,update,watch
...
apiservices apiregistration.k8s.io/v1 false APIService create,delete,deletecollection,get,list,patch,update,watch
controllerrevisions apps/v1 true ControllerRevision create,delete,deletecollection,get,list,patch,update,watch
daemonsets ds apps/v1 true DaemonSet create,delete,deletecollection,get,list,patch,update,watch
...
⚠️ 注意:NAME
字段不总是与 KIND
字段一致,因此在编写脚本时要特别注意。
6.3. RBAC 和子资源类型
要获取 RBAC 类型(如 Role、ClusterRole)或子资源类型(如 Pod/Log),需要直接调用 Kubernetes API。
启动本地代理:
$ kubectl proxy --port=8080 &
然后使用 curl
和 jq
查询:
#!/bin/bash
SERVER="localhost:8080"
APIS=$(curl -s $SERVER/apis | jq -r '[.groups | .[].name] | join(" ")')
# core resources
api="core"
curl -s $SERVER/api/v1 | jq -r --arg api "$api" '.resources | .[] | "\($api) \(.name): \(.verbs | join(" "))"'
# non-core resources
for api in $APIS; do
version=$(curl -s $SERVER/apis/$api | jq -r '.preferredVersion.version')
curl -s $SERVER/apis/$api/$version | jq -r --arg api "$api" '.resources | .[]? | "\($api) \(.name): \(.verbs | join(" "))"'
done
✅ 该脚本可以列出所有资源类型,包括 RBAC 和子资源类型。
7. 总结
本文介绍了在 Kubernetes 中如何列出某个命名空间下所有资源的方法:
- ✅
kubectl get all
:适用于查看常用资源,但不完整 - ✅
kubectl api-resources | xargs kubectl get
:可列出所有资源类型,包括 ConfigMap、Secret、PV、PVC 等 - ✅
kubectl get <type1>,<type2>
:按需列出特定资源类型 - ✅ 使用 API 查询获取 RBAC 和子资源类型
在实际使用中,建议根据需求选择合适的方法,以提高效率和准确性。