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

Menyesal
sumber
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>
Kristofer
sumber
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
Camil
sumber
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>
Mal
sumber
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

Matt Hamann
sumber
10

Apa yang Anda inginkan didukung di sisi server Kubernetes API seperti ini:

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

Namun opsi pemilih bidang tersebut kubectlbelum ada di dalamnya : https://github.com/kubernetes/kubernetes/pull/50140

coreypobrien.dll
sumber
3
FYI Ini sekarang telah digabungkan
deedubs
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.

Breedly
sumber
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