En regardant http://kubernetes.io/docs/user-guide/labels/#selecting-sets-of-nodes , il semble possible de sélectionner une certaine gamme de modules à partir d'étiquettes. Mais dans mon cas, je veux sélectionner tous les pods d'un noeud, mais je ne veux pas étiqueter chaque pod de leur noeud correspondant.
Me manque-t-il quelque chose dans la documentation ou est-il impossible de sélectionner par nœud? Si je fais:
kubectl --server="<SERVER>" --namespace=<NS> get pods -o wide | head
NAME READY STATUS RESTARTS AGE NODE
Peut-on utiliser l'un de ces en-têtes comme sélecteur? Si oui, comment le faire avec kubectl bust surtout, comment le faire avec l'API?
Merci d'avance
Ce que vous voulez est supporté par l’API Kubernetes côté serveur comme ceci:
curl --cacert ca.crt --cert apiserver.crt --key apiserver.key https://<server>:<port>/api/v1/namespaces/<namespace>/pods?fieldSelector=spec.nodeName%3Dsomenodename
Cependant, cette option de sélecteur de champ n'est pas encore intégrée à kubectl
: https://github.com/kubernetes/kubernetes/pull/5014
Exemple de tri des pods par nodeName:
kubectl get pods -o wide --sort-by="{.spec.nodeName}"
Exemple d’obtention de pods sur des nœuds à l’aide du filtre étiquette:
for n in $(kubectl get nodes -l your_label_key=your_label_value --no-headers | cut -d " " -f1); do
kubectl get pods --all-namespaces --no-headers --field-selector spec.nodeName=${n}
done
ou par nombre de redémarrages
kubectl get pods --sort-by="{.status.containerStatuses[:1].restartCount}"
Exemple de filtrage par nodeName à l'aide de l'indicateur --template:
$ kubectl get nodes
NAME STATUS AGE
ip-10-0-90-30.ec2.internal Ready 2d
ip-10-0-90-35.ec2.internal Ready 2d
ip-10-0-90-50.ec2.internal Ready,SchedulingDisabled 2d
ip-10-0-91-60.ec2.internal Ready 2d
ip-10-0-91-65.ec2.internal Ready 2d
$kubectl get pods --template '{{range .items}}{{if eq .spec.nodeName "ip-10-0-90-30.ec2.internal"}}{{.metadata.name}}{{"\n"}}{{end}}}{{end}}'
filebeat-pezch
app-5xole
node-exporter-6kfs8
prometheus-0
sso-359976856-wu8zt
Comme mentionné dans la réponse acceptée, le PR est maintenant fusionné et vous pouvez obtenir des pods par nœud comme suit:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node>
Vous pouvez également interroger tous les pods sur un nœud avec la commande suivante
kubectl get pods -o wide --all-namespaces | grep <YOUR-NODE>
kubectl describe node <node>
affichera tous les pods non terminés s'exécutant sur ce noeud
J'ai suivi le même processus avec le Go Client et il découvre quelques raccourcis pris par la CLI.
func doNodesHavePods(clientset *kubernetes.Clientset) error {
nodeLabelSelector := "nodelabel=interesting_nodes"
nodes, err := clientset.CoreV1().Nodes().List(metav1.ListOptions{LabelSelector: nodeLabelSelector})
if err != nil {
return err
}
nodeNames := []string{}
for _, node := range nodes.Items {
nodeNames = append(nodeNames, node.Name)
}
// --all-namespaces -> listing and looping on namespaces
namespaces, err := clientset.CoreV1().Namespaces().List(metav1.ListOptions{})
if err != nil {
return err
}
for _, namespace := range namespaces.Items {
for _, name := range nodeNames {
// pods need a namespace to be listed.
pods, err := clientset.CoreV1().Pods(namespace.Name).List(metav1.ListOptions{FieldSelector: "spec.nodeName=" + name})
if err != nil {
println("%v", err)
}
for _, pod := range pods.Items {
fmt.Println(pod.Namespace, pod.Name)
}
}
}
return nil
}
J'ai commencé à constater que beaucoup de questions que je devais poser devenaient trop complexes pour la CLI, qui est un excellent bourreau de travail, mais apprendre à utiliser le Go Client peut vous aider à obtenir la première réponse que vous cherchez, mais creuser aussi plus profondément dans les questions que ces réponses soulèvent.