Les docs expliquent très bien comment définir une souillure sur un nœud ou en supprimer une. Et je peux utiliser kubectl describe node
pour obtenir une description détaillée d'un noeud, y compris de ses défauts. Mais que se passe-t-il si j'ai oublié le nom de la souillure que j'ai créée ou les nœuds sur lesquels je l'ai configurée? Puis-je lister tous mes nœuds, avec les traces présentes sur eux?
kubectl get nodes -o json | jq .items[].spec
qui donnera la spécification complète avec le nom du noeud, ou:
kubectl get nodes -o json | jq .items[].spec.taints
produira la liste des souillures pour chaque noeud
Dans Kubernetes 1.6.x, les tests de nœuds sont passés à la spécification. Par conséquent, la réponse ci-dessus de jaxxstorm ne fonctionnera pas. Au lieu de cela, vous pouvez utiliser le modèle suivant.
{{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}}
Je l'ai sauvegardé dans un fichier et le référence comme suit:
kubectl get nodes -o go-template-file="./nodes-taints.tmpl"
Vous obtiendrez une sortie comme ceci:
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
Je ne suis pas un grand utilisateur de gabarits et je suis donc sûr qu'il y a des choses que j'aurais pu mieux faire mais c'est ce que c'est.
Pour trouver des traces de noeud, il suffit de lancer:
kubectl describe nodes your-node-name
Sortie:
Name: your-node-name
...
Taints: node-role.kubernetes.io/master:NoSchedule
CreationTimestamp: Wed, 19 Jul 2017 06:00:23 +0800
Je cherchais à obtenir la liste des nœuds qui ont une Taint spécifique. J'ai trouvé seulement cette réponse SO. Si quelqu'un cherche cette réponse, voici la solution
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}}'
Sur mon cluster, le résultat est:
preprod-master
preprod-proxy
Vous pouvez utiliser les options de sortie go-template de kubectl
pour vous aider ici,
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}}'
Sur mon cluster, cela imprime mes maîtres, qui sont souillés:
kubemaster-1.example.net
kubemaster-2.example.net
kubemaster-3.example.net
PowerShell: \> kubectl décrit les nœuds | findstr "Nom d'hôte Taint"
ou
Bash # kubectl décrit les nœuds | egrep "Taint | Nom d'hôte"
Cette commande est facile à retenir
La sortie ressemble à ceci:
Taints: <none>
Hostname: aks-agentpool-30208295-0
Taints: <none>
Hostname: aks-agentpool-30208295-1
...