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



我想在名称空间中查看所有资源。

执行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%的资源。包括configmapsecretendpointsistio等...

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

考虑到这一点,我们可以获得所有资源,利用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

我认为这可能是在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

最新更新