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