【问题标题】:Count of nodes which do not have a label?没有标签的节点数?
【发布时间】:2019-10-30 16:03:13
【问题描述】:

如何使用 kubectl 获取没有任何标签的 K8S 节点? 另外,如何获取没有任何标签的 K8S pod?

【问题讨论】:

    标签: kubernetes google-kubernetes-engine kubectl azure-aks kubernetes-pod


    【解决方案1】:

    根据官方documentation,我认为没有办法做到这一点,但你可以通过否定平等来做类似的事情:

    kubectl get nodes --selector=kubernetes.io/hostname!=node_host_name
    

    基本上你可以选择所有没有特定标签的东西,你也可以链接选择器

    更多阅读:https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/

    【讨论】:

      【解决方案2】:

      如果不列出所有可能的标签,通常没有特定的方法来检查是否没有标签。你必须做这个客户端。

      【讨论】:

        【解决方案3】:

        没有办法检查没有标签的节点/pod。相反,您可以做的是检查特定标签的节点/pod

        按照以下步骤进行

        添加标签 mylabel=k8s

        master $ kubectl get no
        NAME      STATUS    ROLES     AGE       VERSION
        master    Ready     master    51m       v1.11.3
        node01    Ready     <none>    50m       v1.11.3
        master $
        master $
        master $ kubectl label nodes node01 mylabel=k8s
        node/node01 labeled
        master $
        master $ kubectl get no -L mylabel
        NAME      STATUS    ROLES     AGE       VERSION   MYLABEL
        master    Ready     master    52m       v1.11.3
        node01    Ready     <none>    52m       v1.11.3   k8s
        

        列出标签为 mylabel=k8s 的节点

        master $ kubectl get no -l mylabel=k8s
        NAME      STATUS    ROLES     AGE       VERSION
        node01    Ready     <none>    53m       v1.11.3
        master $
        

        列出没有标签 mylabel=k8s 的节点

        master $ kubectl get no -l mylabel!=k8s
        NAME      STATUS    ROLES     AGE       VERSION
        master    Ready     master    53m       v1.11.3
        

        【讨论】:

          【解决方案4】:

          您必须利用 kubectl -o 标志和 go-template 输出:

          kubectl get nodes -o go-template='{{range .items }}{{if .metadata.labels }}{{else}}{{printf "%s\n" .metadata.name}}{{ end }}{{end}}
          

          此命令将仅显示没有任何标签的节点。同样可以用于 pod:

          kubectl get pods --all-namespaces -o go-template='{{range .items }}{{if .metadata.labels }}{{else}}{{printf "%s\n" .metadata.name}}{{ end }}{{end}}'
          

          【讨论】:

          • 我可以通过输入以下 kubectl get pods --all-namespaces -o jsonpath='{.items[?(@.metadata.labels)].metadata.name}' 使用 jsonpath 获取带有标签的 pod,但以下内容不起作用 kubectl get pods --all-namespaces -o jsonpath='{.items[?(!@.metadata.labels)].metadata.name}'
          • Kubectl jsonpath 解析器不支持 negation:github.com/kubernetes/client-go/blob/master/util/jsonpath/… ,你必须按照我的例子使用 go-template 才能做你想做的事
          【解决方案5】:

          对于那些想要查找没有特定标签的资源的人,无论其价值如何:

          kubectl get ns --selector='!label_name'
          

          【讨论】:

            【解决方案6】:

            第一个答案有效,但您也可以使用以下答案

            kubectl get nodes -l '!label_name'

            【讨论】:

              猜你喜欢
              • 2014-08-06
              • 1970-01-01
              • 2013-05-26
              • 1970-01-01
              • 2021-09-08
              • 1970-01-01
              • 2011-10-19
              • 1970-01-01
              • 2012-09-29
              相关资源
              最近更新 更多