列出命名空间中的所有资源
Listing all resources in a namespace
我想查看命名空间中的所有资源。
执行 kubectl get all
将不会列出诸如服务和入口之类的内容。
如果我知道我可以明确要求该特定类型的类型,但似乎也没有列出所有可能类型的命令。 (特别是 kubectl get
不会列出自定义类型)。
知道如何在删除该命名空间之前显示所有资源吗?
所有 kubernetes 对象都存储在 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>/+"
基于 this comment ,支持列出所有资源的方式是遍历 kubectl api-resources
:
列出的所有 api 版本
kubectl api-resources enumerates the resource types available in your cluster.
this means you can combine it with kubectl get to actually list every instance of every resource type in a namespace:
kubectl api-resources --verbs=list --namespaced -o name \
| xargs -n 1 kubectl get --show-kind --ignore-not-found -l <label>=<value> -n <namespace>
的 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 "" ]
then
kubectl get --ignore-not-found ${i}
else
kubectl -n get --ignore-not-found ${i}
fi
done
}
用法:kubectlgetall <namespace>
示例:从 kafka
命名空间获取所有资源:
kubectlgetall kafka
是正确的,但是对于 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 }'` do ; kubectl get $i
运行 v1.13
我检索命名空间的所有内容的简单方法是
kubectl 获取所有 -n
如果你使用的是kubectl krew插件,我会建议使用get-all。它可以获得几乎90%的资源。包括 configmap、secret、端点、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 get
命令获取资源。
- 可以使用
-n [NAMESPACE]
或 --namespace [NAMESPACE]
标志按名称空间过滤资源。
- 为简洁起见,我将在以下示例中使用
-A
(与 --all-namespaces
相同)标志。
其他一些答案显示了如何列出可用资源类型:
kubectl api-resources --verbs=list -o name
考虑到这一点,我们可以获取所有资源,利用xargs
and sed
:
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
跟随 ,在鱼 shell 中它看起来像下面。
将以下功能添加到您的 ~/.config/fish/config.fish
function kall
kubectl -n $argv get (string join ',' (kubectl api-resources --namespaced --verbs list -o name))
end
我认为这可能是打印出 kubernetes 集群中所有资源名称的最简单方法:
#!/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
要指定命名空间,您只需修改循环设置中的行 --namespace= 并删除 --all-namespaces
我想查看命名空间中的所有资源。
执行 kubectl get all
将不会列出诸如服务和入口之类的内容。
如果我知道我可以明确要求该特定类型的类型,但似乎也没有列出所有可能类型的命令。 (特别是 kubectl get
不会列出自定义类型)。
知道如何在删除该命名空间之前显示所有资源吗?
所有 kubernetes 对象都存储在 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>/+"
基于 this comment ,支持列出所有资源的方式是遍历 kubectl api-resources
:
kubectl api-resources enumerates the resource types available in your cluster.
this means you can combine it with kubectl get to actually list every instance of every resource type in a namespace:
kubectl api-resources --verbs=list --namespaced -o name \
| xargs -n 1 kubectl get --show-kind --ignore-not-found -l <label>=<value> -n <namespace>
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 "" ]
then
kubectl get --ignore-not-found ${i}
else
kubectl -n get --ignore-not-found ${i}
fi
done
}
用法:kubectlgetall <namespace>
示例:从 kafka
命名空间获取所有资源:
kubectlgetall kafka
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 }'` do ; kubectl get $i
运行 v1.13
我检索命名空间的所有内容的简单方法是 kubectl 获取所有 -n
如果你使用的是kubectl krew插件,我会建议使用get-all。它可以获得几乎90%的资源。包括 configmap、secret、端点、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 get
命令获取资源。 - 可以使用
-n [NAMESPACE]
或--namespace [NAMESPACE]
标志按名称空间过滤资源。- 为简洁起见,我将在以下示例中使用
-A
(与--all-namespaces
相同)标志。
- 为简洁起见,我将在以下示例中使用
其他一些答案显示了如何列出可用资源类型:
kubectl api-resources --verbs=list -o name
考虑到这一点,我们可以获取所有资源,利用xargs
and sed
:
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
我认为这可能是打印出 kubernetes 集群中所有资源名称的最简单方法:
#!/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
要指定命名空间,您只需修改循环设置中的行 --namespace=