【问题标题】:Listing all resources in a namespace列出命名空间中的所有资源
【发布时间】:2018-05-21 08:22:31
【问题描述】:

我想查看命名空间中的所有资源。

执行kubectl get all 将不会列出服务和入口等内容。

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

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

【问题讨论】:

  • 很遗憾,似乎没有办法通过kubectl 做到这一点。

标签: kubernetes kubectl


【解决方案1】:

所有 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>/+"

【讨论】:

  • 如果您有一个自我管理的 Kubernetes 集群,这将非常有用 - 这对于 GKE、EKS 和其他托管服务来说是不可能的。
【解决方案2】:

基于this comment,支持列出所有资源的方式是遍历kubectl api-resources列出的所有api版本:

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

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

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

【讨论】:

  • 很高兴有一个更新的答案,它可以排除被禁止的 GVK 。
  • 刚刚将 alias k8s-show-ns=" kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n" 作为别名添加到我的 rc 文件中。谢谢
  • 我的看法略有不同:function kgetall { kubectl api-resources --verbs=list --namespaced -o name | xargs -n1 kubectl get --show-kind --ignore-not-found "$@" }。添加complete -F __start_kubectl kgetall 也会让您完成此操作。
  • 什么对我有用kubectl api-resources --verbs=list --namespaced -o name \ | xargs -n 1 kubectl get --show-kind --ignore-not-found -nl -n &lt;namespace&gt;
  • 使用 xargs 中的 -t 选项找出命名空间中列出的资源名称可能很有用。 xargs -t -n 1 .. 这是 xargs 调试,将显示它正在执行的命令。它试图列出哪个 api 资源。
【解决方案3】:

rcorre's answer 的 Powershell 实现如下所示

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

【讨论】:

    【解决方案4】:

    由于 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 &lt;namespace&gt;

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

    kubectlgetall kafka

    【讨论】:

    • 谢谢你。如果将此功能添加到 kubctl 而不是需要做这种变通方法,那就太好了,但这绝对解决了我的问题。
    【解决方案5】:

    Answer of 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"
    

    【讨论】:

    • 其实这两种情况下API请求的数量是一样的,你可以在kubectl命令后面加上--v 6参数看看:kubectl get pods,svc,secrets --v 6当你调用kubectl命令的时候单独它会导致每次加载配置。在组合命令中,将请求一次配置。配置加载大约需要 10-12 毫秒。
    • 你是对的:相同数量的 API 请求。不同之处在于,在pods,svc,secrets 的情况下,一个 HTTP/2 连接中有三个请求。但是当您分别调用每个资源时,您会为每个资源建立新的 HTTP/2 连接。
    • 我还不知道为什么,但是像 issuers.certmanager.k8s.ioleases.coordination.k8s.io 这样的资源需要比其他资源更多的时间(4 秒,而 pods 这样的普通资源需要 200 毫秒)。乳清我把它们分开,时间加起来。当我立即收到 (pods,svc,...) 时,通话时间保持不变。
    【解决方案6】:

    这可能无法获得所有资源,但可能是某人正在寻找的资源

    kubectl get all,cm,secret,ing -A
    

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

    至少,它得到:

    • 吊舱
    • 服务
    • 守护进程
    • 部署
    • 副本
    • 有状态集
    • 工作
    • 配置图
    • 秘密
    • 入口

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

    否则这会做类似的事情:

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

    运行 v1.13

    【讨论】:

    • 不,你错了。 kubectl get all 没有获得所有资源。
    • 它不会返回许多其他资源,例如 configmaps、secrets 和许多其他资源
    【解决方案7】:

    我检索命名空间的所有内容的简单方法是 kubectl 全部获取 -n

    【讨论】:

    • kubectl get all -n
    • OP 明确指出 kubectl get all 没有获得服务(尽管它确实,实际上)
    • 它没有为我获取配置图...如果我直接通过kubectl get cmkubectl get configmaps 查询它们,我可以清楚地看到它们
    【解决方案8】:

    如果你使用 kubectl krew 插件,我会建议使用get-all。它可以获得几乎90%的资源。包括 configmap、secret、endpoints、istio 等

    【讨论】:

    • 很棒的提示 - 它有包含/排除的选项,以及 \
    【解决方案9】:

    这不是 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
    

    首先。

    【讨论】:

      【解决方案10】:

      仅介绍一些基础知识:

      • 可以使用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
      

      【讨论】:

        【解决方案11】:

        完整的解决方案

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

        【讨论】:

          【解决方案12】:

          this solution 之后,在鱼壳中如下所示。

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

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

          【讨论】:

            【解决方案13】:

            我认为这可能是打印出 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

            【讨论】:

              猜你喜欢
              • 2020-08-30
              • 2021-10-24
              • 1970-01-01
              • 1970-01-01
              • 2012-06-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多