【发布时间】:2022-04-10 20:55:42
【问题描述】:
docs 很好地解释了如何在节点上设置污点,或删除一个。我可以使用kubectl describe node 来获得一个节点的详细描述,包括它的污点。但是如果我忘记了我创建的污点的名称,或者我将它设置在哪些节点上怎么办?我可以列出我的所有节点以及它们上存在的任何污点吗?
【问题讨论】:
标签: kubernetes
docs 很好地解释了如何在节点上设置污点,或删除一个。我可以使用kubectl describe node 来获得一个节点的详细描述,包括它的污点。但是如果我忘记了我创建的污点的名称,或者我将它设置在哪些节点上怎么办?我可以列出我的所有节点以及它们上存在的任何污点吗?
【问题讨论】:
标签: kubernetes
kubectl get nodes -o json | jq '.items[].spec'
这将给出带有节点名称的完整规范,或者:
kubectl get nodes -o json | jq '.items[].spec.taints'
将生成每个节点的污点列表
【讨论】:
kubectl get nodes -o json | jq ".items[]|{name:.metadata.name, taints:.spec.taints}"
在 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}}'
【讨论】:
不使用任何额外工具(例如 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
【讨论】:
要查找节点的污点可以运行:
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
【讨论】:
kubectl describe nodes your-node-name | grep Taints
#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"
你有自己的好命令来获取所有污点,你的输出应该如下所示
【讨论】:
PowerShell:\> kubectl 描述节点 | findstr "污染主机名"
或
Bash# kubectl 描述节点 | egrep -hi "Taint|主机名"
这个命令非常好记
输出如下所示:
Taints: <none>
Hostname: aks-agentpool-30208295-0
Taints: <none>
Hostname: aks-agentpool-30208295-1
...
【讨论】:
kubectl describe nodes | egrep "Taint|Hostname"
$ kubectl describe nodes | grep -E 'Name:|Taint'
试试这个:
kubectl get nodes -o=custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
【讨论】:
我正在寻找具有特定污点的节点列表。我只找到了这个 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
【讨论】:
以下命令对我有用:
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
kubectl get nodes -o json | jq '.items[].spec.taints'
Output:
[
{
"effect": "NoSchedule",
"key": "dedicated"
}
]
【讨论】:
您可以在这里使用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
【讨论】:
CMD kubectl 提供了一个参数 jsonpath 来搜索和格式化获取后的输出。详情可以查看文档k8s jsonpath。
kubectl get node -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.taints}{"\n"}{end}'
更多信息,您可以使用 FindResults 方法检查反映源数据的source code
【讨论】:
kubectl describe nodes [node_name] | grep 'Taints'
kubectl get nodes -o json | jq '.items[].spec.taints'
--> 这最后一步需要安装 jq (sudo apt install jq)
【讨论】:
kubectl 描述节点 node01 | grep -i 污点
【讨论】: