【问题标题】:How can I list the taints on Kubernetes nodes?如何列出 Kubernetes 节点上的污点?
【发布时间】:2022-04-10 20:55:42
【问题描述】:

docs 很好地解释了如何在节点上设置污点,或删除一个。我可以使用kubectl describe node 来获得一个节点的详细描述,包括它的污点。但是如果我忘记了我创建的污点的名称,或者我将它设置在哪些节点上怎么办?我可以列出我的所有节点以及它们上存在的任何污点吗?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:
    kubectl get nodes -o json | jq '.items[].spec'
    

    这将给出带有节点名称的完整规范,或者:

    kubectl get nodes -o json | jq '.items[].spec.taints'
    

    将生成每个节点的污点列表

    【讨论】:

    • 或者如果你想要 ip-xx.internal 节点名,你可以这样做:kubectl get nodes -o json | jq ".items[]|{name:.metadata.name, taints:.spec.taints}"
    • 此答案基于假定已安装 jq
    • 而且只输出一堆污点,而没有输出它们关联的节点的名称,没有多大用处。
    【解决方案2】:

    在 Kubernetes 1.6.x 中,节点污点已移至规范中。因此 jaxxstorm 的上述答案将不起作用。相反,您可以使用以下模板。

    {{printf "%-50s %-12s\n" "Node" "Taint"}}
    {{- range .items}}
        {{- if $taint := (index .spec "taints") }}
            {{- .metadata.name }}{{ "\t" }}
            {{- range $taint }}
                {{- .key }}={{ .value }}:{{ .effect }}{{ "\t" }}
            {{- end }}
            {{- "\n" }}
        {{- end}}
    {{- end}}
    

    我已将其保存到文件中,然后像这样引用它:

    kubectl get nodes -o go-template-file="./nodes-taints.tmpl"
    

    你会得到这样的输出:

    Node                                            Taint
    ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=etcd:NoSchedule
    ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=jenkins:NoSchedule
    ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=etcd:NoSchedule
    ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=containerlinux-canary-channel-workers:NoSchedule
    ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=jenkins:NoSchedule
    ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=etcd:NoSchedule
    ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=etcd:NoSchedule
    ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=etcd:NoSchedule
    ip-xxx-xxx-xxx-xxx.us-west-2.compute.internal   dedicate=jenkins:NoSchedule
    

    我不是一个庞大的 go 模板用户,所以我确信有些事情我可以做得更好,但它就是这样。


    同上,但都在一行中:

    kubectl get nodes -o go-template='{{printf "%-50s %-12s\n" "Node" "Taint"}}{{- range .items}}{{- if $taint := (index .spec "taints") }}{{- .metadata.name }}{{ "\t" }}{{- range $taint }}{{- .key }}={{ .value }}:{{ .effect }}{{ "\t" }}{{- end }}{{- "\n" }}{{- end}}{{- end}}'
    

    【讨论】:

      【解决方案3】:

      不使用任何额外工具(例如 JQ)的最简单方法是使用自定义列输出选项。

      $ kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints --no-headers 
      
      

      输出:

      master-11   [map[effect:PreferNoSchedule key:node-role.kubernetes.io/master]]
      master-12   [map[effect:PreferNoSchedule key:node-role.kubernetes.io/master]]
      master-13   [map[effect:PreferNoSchedule key:node-role.kubernetes.io/master]]
      

      使用 Taints 之类的东西,它是一个地图或列表,并且您希望它看起来干净以便使用其他工具进行解析,您可以使用类似于 Edwin Tai 的答案的东西来清理它们,但需要一点额外的智慧提取密钥。

      kubectl get nodes -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.taints[*].key}{"\n"}{end}' 
      

      输出:

      master-11   node-role.kubernetes.io/master
      master-12   node-role.kubernetes.io/master
      master-13   node-role.kubernetes.io/master
      worker-21   thegoldfish.org/storage thegoldfish.org/compute
      worker-22   thegoldfish.org/storage thegoldfish.org/compute
      worker-23   thegoldfish.org/compute
      worker-24   thegoldfish.org/storage thegoldfish.org/compute
      

      额外示例:

      使用此方法您可以轻松创建自定义输出

      节点概览:

      kubectl get nodes -o custom-columns=NAME:.metadata.name,ARCH:.status.nodeInfo.architecture,KERNEL:.status.nodeInfo.kernelVersion,KUBLET:.status.nodeInfo.kubeletVersion,CPU:.status.capacity.cpu,RAM:.status.capacity.memory
      

      输出:

      NAME        ARCH    KERNEL                       KUBLET    CPU   RAM
      master-11   amd64   3.10.0-1062.9.1.el7.x86_64   v1.17.0   6     7910096Ki
      master-12   amd64   3.10.0-1062.9.1.el7.x86_64   v1.17.0   6     7910096Ki
      master-13   amd64   3.10.0-1062.9.1.el7.x86_64   v1.17.0   6     7910096Ki
      

      pod 概览以及按创建时间排序的位置:

      kubectl get pods -A -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,NODE:.spec.nodeName,HOSTIP:.status.hostIP,PHASE:.status.phase,START_TIME:.metadata.creationTimestamp --sort-by=.metadata.creationTimestamp
      

      输出:

      NAMESPACE              NAME                                                  NODE        HOSTIP            PHASE       START_TIME
      kube-system            kube-proxy-rhmrz                                      master-11   192.168.121.108   Running     2019-12-26T14:22:03Z
      kube-system            coredns-6955765f44-777v9                              master-11   192.168.121.108   Running     2019-12-26T14:22:03Z
      kube-system            coredns-6955765f44-w7rch                              master-11   192.168.121.108   Running     2019-12-26T14:22:03Z
      kube-system            kube-scheduler-master-11                              master-11   192.168.121.108   Running     2019-12-26T14:22:05Z
      kube-system            kube-controller-manager-master-11                     master-11   192.168.121.108   Running     2019-12-26T14:22:05Z
      kube-system            etcd-master-11                                        master-11   192.168.121.108   Running     2019-12-26T14:22:05Z
      kube-system            kube-apiserver-master-11                              master-11   192.168.121.108   Running     2019-12-26T14:22:05Z
      kube-system            calico-node-sxls8                                     master-11   192.168.121.108   Running     2019-12-26T14:55:41Z
      kube-system            calico-kube-controllers-6d85fdfbd8-dnpn4              master-11   192.168.121.108   Running     2019-12-26T14:55:41Z
      kubernetes-dashboard   dashboard-metrics-scraper-76585494d8-jx9cg            master-11   192.168.121.108   Running     2019-12-26T16:10:16Z
      kubernetes-dashboard   kubernetes-dashboard-5996555fd8-5z5p2                 master-11   192.168.121.108   Running     2019-12-26T16:10:16Z
      

      这方面的文档是https://kubernetes.io/docs/reference/kubectl/overview/#custom-columns

      【讨论】:

        【解决方案4】:

        要查找节点的污点可以运行:

        kubectl describe nodes your-node-name
        

        输出:

        Name:                   your-node-name
        ...
        Taints:                 node-role.kubernetes.io/master:NoSchedule
        CreationTimestamp:      Wed, 19 Jul 2017 06:00:23 +0800
        

        【讨论】:

        • 这在与 grep 一起使用以过滤掉其他信息时很方便。 kubectl describe nodes your-node-name | grep Taints
        【解决方案5】:
        #Check Node Taints
        kubectl get nodes -o=custom-columns=NodeName:.metadata.name,TaintKey:.spec.taints[*].key,TaintValue:.spec.taints[*].value,TaintEffect:.spec.taints[*].effect
        

        让我试着解释一下第一个是什么意思,然后休息应该到位:

        节点名:.metadata.name

        ColumnName:您要查找的属性的 JSONPATH。

        ColumnName 可以是任何您想要的名称。

        类似 NodeName:items[*].metadata.name 的内容相当于运行 $kubectl get nodes -o=jsonpath='{.items[*].metadata.name} ' 但使用自定义列标志,您可以获得行和列格式的值。

        注意:您不需要以 .items[*] 开头。它已经使用自定义列标志解析它

        所以现在解释所有列:

        NodeName:.metadata.name - 获取节点名称并将其放在 NodeName 列下

        TaintKey:.spec.taints[*].key - 通过查看 taints 映射返回所有 taints 键并将其放在 TaintKey 自定义列下

        TaintValue:.spec.taints[*].value - 与 key 相同,但您从 taints map 返回值。

        TaintEffect:.spec.taints[*].effect - 与 key 相同,但您从 taints map 返回效果。

        你把它设置在和别名下

        alias get-nodetaints="kubectl get nodes -o=custom-columns=NodeName:.metadata.name,TaintKey:.spec.taints[*].key,TaintValue:.spec.taints[*].value,TaintEffect:.spec.taints[*].effect"
        

        你有自己的好命令来获取所有污点,你的输出应该如下所示

        sample output for the command

        【讨论】:

        • 嗨 Sandeep,很高兴给出一个可操作的命令,但也许您可以稍微解释一下您的命令?
        • 你好@jeje - 我希望解释有所帮助!
        【解决方案6】:

        PowerShell:\> kubectl 描述节点 | findstr "污染主机名"

        Bash# kubectl 描述节点 | egrep -hi "Taint|主机名"

        这个命令非常好记

        输出如下所示:

        Taints:             <none>  
          Hostname:   aks-agentpool-30208295-0  
        Taints:             <none>    
          Hostname:  aks-agentpool-30208295-1
        ...
        

        【讨论】:

        • 这里的语法似乎不正确 - 没有包含“Taint Hostname”的行,因此 grep 将找不到任何内容。我认为这应该是kubectl describe nodes | egrep "Taint|Hostname"
        • 谢谢你的权利,我只测试了 powershell 代码,并假设 Bash 的 grep 类似但没有测试,我将编辑我的答案。
        • 我使用的版本,将名字放在首位:$ kubectl describe nodes | grep -E 'Name:|Taint'
        【解决方案7】:

        试试这个:

            kubectl get nodes -o=custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
        

        【讨论】:

          【解决方案8】:

          我正在寻找具有特定污点的节点列表。我只找到了这个 SO 答案,所以如果有人在寻找这个答案,这里是解决方案:

          kubectl get nodes -o go-template='{{range $item := .items}}{{with $nodename := $item.metadata.name}}{{range $taint := $item.spec.taints}}{{if and (eq $taint.key "node-role.kubernetes.io/master") (eq $taint.effect "NoSchedule")}}{{printf "%s\n" $nodename}}{{end}}{{end}}{{end}}{{end}}'
          

          在我的集群上,输出是:

          preprod-master
          preprod-proxy
          

          【讨论】:

          • 这应该是一个单独的问题。
          【解决方案9】:

          以下命令对我有用:

          1. 如果你有节点IP,可以试试

          kubectl get node $node_ip -o json | jq '.spec.taints'
          Output:
          [
            {
              "effect": "NoSchedule",
              "key": "dedicated"
            }
          ]
          
          (OR)
          
          kubectl describe node $node_ip  | grep -i Taints
          Output:
          Taints:             dedicated:NoSchedule
          1. 获取命名空间上的所有 Taint 配置

          kubectl get nodes -o json | jq '.items[].spec.taints'
          Output:
          [
            {
              "effect": "NoSchedule",
              "key": "dedicated"
            }
          ]

          【讨论】:

            【解决方案10】:

            您可以在这里使用kubectl 的 go-template 输出选项来帮助您,

            kubectl get nodes -o go-template='{{range .items}}{{if $x := index .metadata.annotations "scheduler.alpha.kubernetes.io/taints"}}{{with $x := index .metadata.name}}{{.}}{{printf "\n"}}{{end}}{{end}}{{end}}'

            在我的集群上,这会打印出我的主人,它们被污染了:

            kubemaster-1.example.net
            kubemaster-2.example.net
            kubemaster-3.example.net
            

            【讨论】:

            • 这在 1.6.x 中不再适用,为 1.6.x 准备更完整的答案
            【解决方案11】:

            CMD kubectl 提供了一个参数 jsonpath 来搜索和格式化获取后的输出。详情可以查看文档k8s jsonpath

             kubectl get node  -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.taints}{"\n"}{end}'
            

            更多信息,您可以使用 FindResults 方法检查反映源数据的source code

            【讨论】:

            • 你没有让我相信这会有所帮助。请解释它是如何工作的以及它是如何解决问题的。
            • 它提供了一个参数 jsonpath 来搜索和格式化获取后的输出。详情可以查看文档kubernetes.io/docs/reference/kubectl/jsonpath
            • 欲了解更多信息,您可以使用 FindResults github.com/kubernetes/kubectl/blob/master/pkg/cmd/get/… 方法检查反映源数据的源代码
            • 你知道你可以edit你的答案吗?如果您的 cmets 与仅链接的帖子不那么接近,他们几乎会做出一个体面的解释。我问是因为我检查过你的十个答案你从未编辑过......
            【解决方案12】:
            kubectl describe nodes [node_name] | grep 'Taints'
            
            kubectl get nodes -o json | jq '.items[].spec.taints' 
            

            --> 这最后一步需要安装 jq (sudo apt install jq)

            【讨论】:

              【解决方案13】:

              kubectl 描述节点 node01 | grep -i 污点

              【讨论】:

              • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-03-31
              • 2018-12-29
              • 1970-01-01
              • 2019-11-19
              • 1970-01-01
              • 2020-04-23
              相关资源
              最近更新 更多