Kubernetes API - Ruft Pods auf bestimmten Knoten ab

103

Unter http://kubernetes.io/docs/user-guide/labels/#selecting-sets-of-nodes scheint es möglich zu sein, einen bestimmten Bereich von Pods basierend auf Etiketten auszuwählen. In meinem Fall möchte ich jedoch alle Pods auf einem Knoten auswählen, aber nicht jeden Pod auf dem entsprechenden Knoten kennzeichnen.

Fehlt mir etwas in der Dokumentation oder ist es einfach nicht möglich, nach Knoten auszuwählen? Wenn ich mache:

kubectl --server="<SERVER>" --namespace=<NS> get pods -o wide | head
    NAME   READY     STATUS             RESTARTS   AGE       NODE

Kann einer dieser Header als Selektor verwendet werden? Wenn ja, wie geht das mit Kubectl Bust am wichtigsten? Wie geht das mit der API?

Danke im Voraus

Regnoult
quelle
Bitte erwägen Sie, die akzeptierte Antwort zu ändern, da die aktuell akzeptierte Antwort veraltet ist.
Deiga

Antworten:

175

Wie in der akzeptierten Antwort erwähnt, wird der PR jetzt zusammengeführt und Sie können Pods nach Knoten wie folgt erhalten:

kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node>
Kristofer
quelle
8
Dies ist die eleganteste Lösung.
Sergiu Marsavela
Ich habe eine Klarstellung: Dies --all-namespaceswird zuerst alle Pods aus dem gesamten Cluster ziehen und dann nach Knoten filtern? oder werden nur alle Pods von diesem Knoten abgerufen, ohne dass alle Namespaces-Pods stark vom gesamten Cluster abgerufen werden?
AhmFM
98

Beispiel für das Sortieren von Pods nach Knotenname:

kubectl get pods -o wide --sort-by="{.spec.nodeName}"

Beispiel für das Abrufen von Pods auf Knoten mithilfe des Etikettenfilters:

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

oder nach Anzahl der Neustarts

kubectl get pods --sort-by="{.status.containerStatuses[:1].restartCount}"

Beispielfilterung nach Knotenname mit dem Flag --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
Camil
quelle
Das ist interessant, dass es möglich ist, nach diesen Daten zu sortieren, aber das einzige, was nach Selektor gefiltert werden kann, ist das, was sich auf ".spec.selector" befindet.
Regnoult
Die Filter werden serverseitig ausgeführt, die Sortierung erfolgt clientseitig
Tim Hockin
18

Mit dem folgenden Befehl können Sie auch alle Pods und Knoten abfragen

kubectl get pods -o wide --all-namespaces | grep <YOUR-NODE>
Mal
quelle
1
benutze -a auch mit kubectl ----- kubectl bekomme pods -a -o wide --all-namespaces | grep <IHR-KNOTEN>
Pawan Kumar
3
Dies fragt tatsächlich nach allen Pods (und filtert dann im Client), was in großen Clustern möglicherweise viel langsamer ist. Die beste Lösung wäre die Antwort von @Kristofer.
Guilherme Garnier
14

kubectl describe node <node> zeigt alle nicht terminierten Pods an, die auf diesem Knoten ausgeführt werden

Matt Hamann
quelle
10

Was Sie möchten, wird auf der serverseitigen Kubernetes-API wie folgt unterstützt:

curl --cacert ca.crt --cert apiserver.crt --key apiserver.key  https://<server>:<port>/api/v1/namespaces/<namespace>/pods?fieldSelector=spec.nodeName%3Dsomenodename

Diese Feldauswahloption ist jedoch noch kubectlnicht integriert: https://github.com/kubernetes/kubernetes/pull/50140

Coreypobrien
quelle
3
FYI Dies wurde jetzt zusammengeführt
deedubs
3

Ich habe den gleichen Prozess mit dem Go-Client durchlaufen und er deckt einige Verknüpfungen auf, die die CLI verwendet.

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
}

Ich habe festgestellt, dass viele der Fragen, die ich stellen muss, für die CLI zu komplex werden, was ein großartiges Arbeitstier ist. Wenn Sie jedoch lernen, den Go-Client zu verwenden, können Sie die erste Antwort erhalten, nach der Sie suchen vertiefen Sie sich auch tiefer in Fragen, die diese Antworten aufwerfen.

Rassig
quelle
2
Kann einen leeren Namespace verwenden, um Pods in allen Namespaces zu erhalten
dimm
Dies ist die Lösung, die mir geholfen hat, nicht sicher, warum sie abgelehnt wurde.
Ingytron