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

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

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

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

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

124430 次浏览

所有库伯内特对象都存储在 etcd 中。

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

/registry/<object_type>/<namespace>/<name>

我建议直接从 etcd v3获取某个名称空间的所有资源列表:

ETCDCTL_API=3 etcdctl --endpoints=<etcd_ip>:2379 get / --prefix --keys-only | grep -E "^/\w+/\w+/<namespace>/+"

基于 此评论,列出所有资源的受支持方法是迭代 kubectl api-resources列出的所有 api 版本:

Kubectlapi-resources 枚举集群中可用的资源类型。

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

kubectl api-resources --verbs=list --namespaced -o name \
| xargs -n 1 kubectl get --show-kind --ignore-not-found -l <label>=<value> -n <namespace>

Rcorre 的回答的 Powershell 实现类似于

kubectl api-resources --verbs=list --namespaced -o name | `
%{ kubectl get $_ --show-kind --ignore-not-found -l <label>=<value> -n <namespace> }

由于 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
    

if [ -z "$1" ]
then
kubectl get --ignore-not-found ${i}
else
kubectl -n ${1} get --ignore-not-found ${i}
fi
done
}

用法: kubectlgetall <namespace>

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

kubectlgetall kafka

Rcorre 的答案是正确的,但是对于 N 个资源,它向集群发出 N 个请求(因此对于许多资源,这种方法非常慢)。而且,找不到资源(没有实例)使用 kubectl get的速度非常慢。

有一个更好的方法来请求多个资源:

kubectl get pods,svc,secrets

而不是

kubectl get pods
kubectl get svc
kubectl get secrets

所以答案是:

#!/usr/bin/env bash


# get all names and concatenate them with comma
NAMES="$(kubectl api-resources \
--namespaced \
--verbs list \
-o name \
| tr '\n' ,)"


# ${NAMES:0:-1} -- because of `tr` command added trailing comma
# --show-kind is optional
kubectl get "${NAMES:0:-1}" --show-kind

或者

#!/usr/bin/env bash


# get all names
NAMES=( $(kubectl api-resources \
--namespaced \
--verbs list \
-o name) )


# Now join names into single string delimited with comma
# Note *, not @
IFS=,
NAMES="${NAMES[*]}"
unset IFS


# --show-kind is enabled implicitly
kubectl get "$NAMES"

这可能得不到 所有资源,但它可能是什么人正在寻找

kubectl get all,cm,secret,ing -A

这似乎获得了大部分资源,以类型作为前缀。

至少,它得到:

  • 豆荚
  • 服务
  • 女性发病
  • 部署
  • 复制品
  • 有地位的人
  • 工作
  • 配置图
  • 秘密
  • 进入

这不会获得自定义资源,但会获得服务。

否则,这也会产生类似的效果:

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

运行1.13版本

检索名称空间的所有内容的简单方法是 Kubectl 得全 N

如果您正在使用 kubectl krew 插件,我将建议您使用 全部。它可以获得几乎90% 的资源。包括配置图、机密、端点、文件夹等

这不是一个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 get命令获取资源。
  • 可以使用 -n [NAMESPACE]--namespace [NAMESPACE]标志按名称空间筛选资源。
    • 为了简洁起见,我将在下面的示例中使用 -A(与 --all-namespaces相同)标志。

其他一些答案显示了如何列出可用的资源类型:

kubectl api-resources --verbs=list -o name

考虑到这一点,我们可以利用 xargssed获得所有资源:

kubectl get "all,$(kubectl api-resources --verbs=list -o name | xargs | sed 's/ /,/g')" -A

xargs的另一种选择是使用 tr:

kubectl get "$(kubectl api-resources --verbs=list -o name | tr '\n' ',')all" -A

完全解决

kubectl -n <NAMESPACE> get $(kubectl api-resources --namespaced=true --no-headers -o name | egrep -v 'events|nodes' | paste -s -d, - ) --no-headers

这个解决方案之后,在鱼壳中看起来如下。

将以下函数添加到 ~/.config/fish/config.fish

function kall
kubectl -n $argv get (string join ',' (kubectl api-resources --namespaced --verbs list -o name))
end

我认为这可能是打印库伯内特集群中所有资源名称的最简单方法:

#!/bin/bash


for resource in [$(kubectl api-resources -o name | tr "\n" " ")]
do
kubectl get $resource --all-namespaces -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}'
done

要指定名称空间,只需修改循环设置中的行—— nampace = < your-nampace > 并删除—— all-nampace