Kubernetes 列出命名空间中的所有资源

Kubernetes 列出命名空间中的所有资源,kubernetes,kubectl,Kubernetes,Kubectl,我希望看到名称空间中的所有资源 无论名称如何,执行kubectl get all都不会列出服务和入口之类的内容 如果我知道类型,我可以显式地请求该特定类型,但似乎也没有列出所有可能类型的命令。(尤其是kubectl get不列出自定义类型) 您知道如何在删除该名称空间之前显示所有资源吗?所有kubernetes对象都存储在etcd中 所有对象都以以下方式存储在ETCD v3中: /registry/<object_type>/<namespace>/<name>

我希望看到名称空间中的所有资源

无论名称如何,执行
kubectl get all
都不会列出服务和入口之类的内容

如果我知道类型,我可以显式地请求该特定类型,但似乎也没有列出所有可能类型的命令。(尤其是
kubectl get
不列出自定义类型)


您知道如何在删除该名称空间之前显示所有资源吗?

所有kubernetes对象都存储在etcd中

所有对象都以以下方式存储在ETCD v3中:

/registry/<object_type>/<namespace>/<name>
/registry///
我建议直接从etcd v3获取某个名称空间的所有资源列表:

ETCDCTL_API=3 etcdctl --endpoints=<etcd_ip>:2379 get / --prefix --keys-only | grep -E "^/\w+/\w+/<namespace>/+"
ETCDCTL_API=3 ETCDCTL--endpoints=:2379 get/--prefix--keys only | grep-E“^/\w+/\w+/+”
基于,列出所有资源的受支持方式是遍历
kubectl api resources所列出的所有api版本

kubectl api资源枚举集群中可用的资源类型

这意味着您可以将其与kubectl get结合起来,实际列出命名空间中每种资源类型的每个实例:

kubectl api资源--verbs=list--namespaced-o name\
|xargs-n1 kubectl get--show kind--ignore not found-l=-n

的Powershell实现如下所示

kubectl api-resources --verbs=list --namespaced -o name | `
%{ kubectl get $_ --show-kind --ignore-not-found -l <label>=<value> -n <namespace> }
kubectlapi资源--verbs=list--namespaced-o name |`
%{kubectl get$\显示种类--忽略找不到-l=-n}

由于Helm部署失败,在特定名称空间中留下了残余,我最终需要相同的功能。下面是一个可以放在bash配置文件中的函数:

function kubectlgetall {
  for i in $(kubectl api-resources --verbs=list --namespaced -o name | grep -v "events.events.k8s.io" | grep -v "events" | sort | uniq); do
    echo "Resource:" $i
    kubectl -n ${1} get --ignore-not-found ${i}
  done
}
用法:
kubectlgetall

示例:从
kafka
命名空间获取所有资源:

kubectlgetall kafka

是正确的,但是对于N个资源,它会向集群发出N个请求(因此对于很多资源,这种方法非常缓慢)。此外,使用
kubectl get
获取未找到的资源(没有实例)非常慢

有一种更好的方法可以请求多个资源:

kubectl获得吊舱、svc和秘密
而不是

kubectl获得吊舱
kubectl获得svc
库贝特得到了秘密

所以答案是:

#/usr/bin/env bash
#获取所有名称并用逗号连接它们
NAMES=“$(kubectl api资源\
--名称空间\
--动词表\
-o名称\
|tr'\n',)”
#${NAMES:0:-1}--因为'tr'命令添加了尾随逗号
#--显示种类是可选的
kubectl获取“${NAMES:0:-1}”--显示种类

#/usr/bin/env bash
#得到所有的名字
名称=($(kubectl api资源)\
--名称空间\
--动词表\
-(姓名)
#现在,将名称连接到以逗号分隔的单个字符串中
#注*,而非@
如果=,
NAMES=“${NAMES[*]}”
取消设置IFS
#--隐式启用“显示种类”
kubectl获得“$NAMES”
这可能无法获得所有资源,但可能是有人在寻找的资源

kubectl get all,cm,secret,ing -A
这似乎获得了大部分资源,前缀为类型

至少,它得到了:

  • 豆荚
  • 服务
  • 守护程序
  • 部署
  • 复制集
  • 状态集
  • 工作
  • 配置映射
  • 秘密
  • 入口
这不会获得自定义资源,但会获得服务

除此之外,还有类似的作用:

for i in `kubectl api-resources | awk '{print $1}'` do ; kubectl get $i

运行v1.13

检索名称空间所有内容的简单方法是
如果您使用的是kubectl krew插件,我建议您使用。它可以获得几乎90%的资源。包括configmap、secret、endpoints、istio等,这不是100%的解决方案,但对我来说,它的工作原理如下

kgetall='kubectl get namespace,replicaset,secret,nodes,job,daemonset,statefulset,ingress,configmap,pv,pvc,service,deployment,pod --all-namespaces'
打个电话就行了

kgetall
但很明显,我预料到了

kubectl get all --all-namespaces

首先。

很遗憾,似乎没有办法通过
kubectl
实现这一点。如果有一个更新的答案,这将很好,它可以排除禁止的GVK。刚刚添加了
alias k8s show ns=“kubectl api resources--verbs=list--namespaced-o name | xargs-n1 kubectl get--show kind--ignore not found-n”
作为我的rc文件的别名。感谢我对它的不同理解:
函数kgetall{kubectlapi resources--verbs=list--namespaced-o name | xargs-n1 kubectl get--show kind--ignore not found“$@”}
。添加
complete-F\uu start\u kubectl kgetall
也会让您完成这项工作。对我有效的
kubectl api资源--verbs=list--namespaced-o name \| xargs-n1 kubectl get--show kind--ignore not found-nl-n
可以使用
-t
选项在xargs中
xargs-t-n1..
这是xargs调试,将显示它正在执行的命令。它试图列出的api资源。事实上,在这两种情况下都会发出相同数量的api请求,如果将
--v6
参数添加到
kubectl
命令,则可以检查它:
kubectl get pods,svc,secrets--v6
单独调用
kubectl
命令时,每次都会导致配置加载。在组合命令中,将请求一次配置。配置加载大约需要10-12毫秒。你是对的:相同数量的API请求。区别在于,在
pods、svc、secrets的情况下,在一个HTTP/2连接中有三个请求。但是,当您分别调用每个资源时,您会为每个资源建立新的HTTP/2连接。我还不知道为什么,但是一些资源,如
issuers.certmanager.k8s.io
leases.coordination.k8s.io
需要比另一个资源更多的时间(对于有序的
pods
)需要4秒而不是200秒)。我把它们分开,时间加起来。当我马上到达时(
pods,
kubectl get all --all-namespaces