web-dev-qa-db-fra.com

API Kubernetes - Obtient des pods sur des nœuds spécifiques

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

42
Regnoult

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

6
coreypobrien

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
68
Camil

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>
44
Kristofer

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>
13
Mal

kubectl describe node <node> affichera tous les pods non terminés s'exécutant sur ce noeud

11
Matt Hamann

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.

0
Breedly