Kubernetes API - mendapatkan Pod di node tertentu


109

Dengan melihat http://kubernetes.io/docs/user-guide/labels/#selecting-sets-of-nodes , tampaknya mungkin untuk memilih kisaran pod tertentu berdasarkan label. Tetapi dalam kasus saya, saya ingin memilih semua pod pada satu node tetapi saya tidak ingin memberi label pada setiap pod pada node yang sesuai.

Apakah saya kehilangan sesuatu dari dokumentasi atau tidak mungkin memilih dengan node? Bila saya lakukan:

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

Dapatkah tajuk ini digunakan sebagai pemilih? Jika ya, bagaimana melakukannya dengan kubectl bust yang terpenting, bagaimana melakukannya dengan API?

Terima kasih sebelumnya


Harap pertimbangkan untuk mengubah jawaban yang diterima, karena jawaban yang diterima saat ini sudah usang.
deiga

Jawaban:


187

Seperti yang disebutkan dalam jawaban yang diterima, PR sekarang digabungkan dan Anda bisa mendapatkan pod berdasarkan node sebagai berikut:

kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node>

9
Ini adalah solusi paling elegan.
Sergiu Marsavela

1
Saya memiliki klarifikasi: ini --all-namespacespertama-tama akan menarik semua pod dari seluruh cluster dan kemudian akan memfilter node? atau hanya akan menarik semua pod dari node itu saja tanpa menarik semua pod namespace dari seluruh cluster?
AhmFM

104

Contoh pengurutan pod berdasarkan nodeName:

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

Contoh mendapatkan pod pada node menggunakan filter label:

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

atau dengan jumlah restart

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

Contoh pemfilteran oleh nodeName menggunakan --template flag:

$ 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

Menarik bahwa mungkin untuk mengurutkan berdasarkan data ini tetapi satu-satunya hal yang dapat difilter oleh selector adalah apa yang ada di ".spec.selector".
Regnoult

Filter dijalankan di sisi server, pengurutan adalah sisi klien
Tim Hockin

19

Anda juga dapat membuat kueri untuk semua pod dan sebuah node dengan perintah berikut

kubectl get pods -o wide --all-namespaces | grep <YOUR-NODE>

1
gunakan -a juga dengan kubectl ----- kubectl get pods -a -o wide --all-namespaces | grep <YOUR-NODE>
Pawan Kumar

3
Ini sebenarnya membuat kueri untuk semua pod (dan kemudian memfilter di klien), yang mungkin jauh lebih lambat di cluster besar. Solusi terbaik adalah jawaban @Kofer.
Guilherme Garnier

14

kubectl describe node <node> akan menampilkan semua pod yang tidak dihentikan yang berjalan di node tersebut



3

Saya telah melalui proses yang sama dengan Go Client dan menemukan beberapa pintasan yang diambil 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
}

Saya mulai menemukan bahwa banyak pertanyaan yang perlu saya tanyakan menjadi terlalu rumit untuk CLI yang merupakan pekerja keras yang hebat, tetapi belajar menggunakan Go Client dapat membantu Anda mendapatkan jawaban pertama yang Anda cari, tetapi juga menggali lebih dalam pertanyaan yang muncul dari jawaban tersebut.


2
Dapat menggunakan namespace kosong untuk mendapatkan pod di semua namespace
dimm

Ini adalah solusi yang membantu saya, tidak yakin mengapa itu diturunkan suara.
Ingytron
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.