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-resourceskubectl 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 &

然后使用 curljq 查询:

#!/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 和子资源类型

在实际使用中,建议根据需求选择合适的方法,以提高效率和准确性。


原始标题:List All Resources in a Namespace in Kubernetes