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

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