我想在名称空间中查看所有资源。
执行kubectl get all
,尽管有名称,但仍未列出诸如服务和入口之类的内容。
如果我知道可以明确要求该特定类型的类型,但是似乎也没有列出所有可能的类型的命令。(特别是kubectl get
不列出自定义类型)。
如何在删除该名称空间之前显示所有资源?
基于此评论,列出所有资源的支持方法是通过kubectl api-resources
列出的所有API版本迭代:
kubectl api 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>
这可能无法获得所有资源,但这可能是某人正在寻找的
kubectl get all,cm,secret,ing -A
这似乎获得了大多数资源,并以类型为前缀。
至少,它得到:
- pod
- 服务
- daemonset
- 部署
- replicaset
- 状态填充
- Job
- configmap
- 秘密
- 入口
这没有自定义资源,但确实获得了服务。
否则这会做类似的事情:
for i in `kubectl api-resources | awk '{print $1}'`; do kubectl get $i; done
运行V1.13
我最终需要相同的功能,这是由于失败的掌舵部署,这些部署将残留物留在特定的名称空间中。这是您可以放入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
完成解决方案
kubectl -n <NAMESPACE> get $(kubectl api-resources --namespaced=true --no-headers -o name | egrep -v 'events|nodes' | paste -s -d, - ) --no-headers
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 krew插件,我建议使用get-all。
它可以获得几乎90%的资源。包括configmap
,secret
,endpoints
,istio
等...
rcorre答案的powershell实现看起来像
kubectl api-resources --verbs=list --namespaced -o name | `
%{ kubectl get $_ --show-kind --ignore-not-found -l <label>=<value> -n <namespace> }
所有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>/+"
它不是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
和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
我认为这可能是在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 =&lt; your-namespace&gt;并删除 - 全名空间
这是其他人所说的
的powershell版本function getall {
# https://stackoverflow.com/questions/47691479/listing-all-resources-in-a-namespace
[CmdletBinding()]
param(
$namespace
)
$types=kubectl api-resources --verbs=list --namespaced -o name
kubectl get $($types -join ",") -n $namespace --show-kind
}
遵循此解决方案,在鱼壳中看起来像下面。
将以下功能添加到您的~/.config/fish/config.fish
function kall
kubectl -n $argv get (string join ',' (kubectl api-resources --namespaced --verbs list -o name))
end