如何识别Kubernetes中的可调度节点

时间:2016-12-27 16:16:00

标签: kubernetes

我想(以编程方式)获取我的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"}] 。似乎并非总是如此;不确定是由于我的错误或误解造成的。

3 个答案:

答案 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,否则该值不会显示在规范中。该值隐含在规范中。