我想(以编程方式)获取我的kubernetes集群中所有可调度节点的列表。
我很确定通过查看.spec.unschedulable
的完整输出中的kubectl get nodes
(使用JSON或模板输出)来实现这一点,但现在看来此信息在{{ 1}}密钥,这很难解析,只是感觉不是正确的地方。
还有其他方法可以找到这些信息吗?我错过了一些明显的东西吗我目前正在使用1.5.1版本。
更新:我可以几乎通过一些Go模板到达那里:
scheduler.alpha.kubernetes.io/taints
但是这给我留下了一块我无法在模板中解析的JSON,我仍然需要反转结果并获取节点名称。
更新2:显然不可调度的节点应该设置$ kubectl get nodes -o go-template='{{range .items}}{{with $x := index .metadata.annotations "scheduler.alpha.kubernetes.io/taints"}}{{.}}{{end}}{{end}}'
[{"key":"dedicated","value":"master","effect":"NoSchedule"}]
。似乎并非总是如此;不确定是由于我的错误或误解造成的。
答案 0 :(得分:2)
虽然参加派对的时间已经很晚了,但我今天需要类似的东西来确定豆荚的日程安排何时会开始成功:
kubectl get nodes -o jsonpath="{range .items[*]}{.metadata.name} {.spec.taints[?(@.effect=='NoSchedule')].effect}{\"\n\"}{end}" | awk 'NF==1 {print $0}'
这基本上只是一个比OP发布的模板更紧凑的模板,其中filter由 awk
完成。
编辑:在尝试使用我之前发布的命令后,我意识到它只适用于单个主机的边缘情况。因此,我将命令扩展为首先打印所有节点名称以及NoSchedule
taints(如果存在),然后使用awk
删除包含多个列的所有行(这是NF==1
所做的)。
答案 1 :(得分:2)
这是一个可行的文本/模板,现在spec.taints
是GA:
{{/* scehdulable.gotmpl */}}
{{- range .items }}
{{- $taints:="" }}
{{- range .spec.taints }}
{{- if eq .effect "NoSchedule" }}
{{- $taints = print $taints .key "," }}
{{- end }}
{{- end }}
{{- if not $taints }}
{{- .metadata.name}}{{ "\n" }}
{{- end }}
{{- end }}
kubectl get no -o go-template-file=./schedulable.gotmpl
kind-worker
kind-worker2
紧凑版本:
kubectl get no -o 'go-template={{range .items}}{{$taints:=""}}{{range .spec.taints}}{{if eq .effect "NoSchedule"}}{{$taints = print $taints .key ","}}{{end}}{{end}}{{if not $taints}}{{.metadata.name}}{{ "\n"}}{{end}}{{end}}'
答案 2 :(得分:1)
unschedulable
默认为false,因此除非设置为true
,否则该值不会显示在规范中。该值隐含在规范中。