Kubernetes API - รับ Pods บนโหนดเฉพาะ


109

ดูที่http://kubernetes.io/docs/user-guide/labels/#selecting-sets-of-nodesดูเหมือนว่าจะสามารถเลือกพ็อดบางช่วงตามป้ายกำกับได้ แต่ในกรณีของฉันฉันต้องการเลือกพ็อดทั้งหมดในโหนดเดียว แต่ฉันไม่ต้องการติดป้ายกำกับแต่ละพ็อดบนโหนดที่เกี่ยวข้อง

ฉันขาดบางอย่างจากเอกสารประกอบหรือไม่สามารถเลือกตามโหนดได้หรือไม่? ถ้าฉันทำ:

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

สามารถใช้ส่วนหัวใด ๆ เหล่านี้เป็นตัวเลือกได้หรือไม่? ถ้าใช่จะทำอย่างไรกับ kubectl bust ที่สำคัญที่สุดจะทำอย่างไรกับ API?

ขอบคุณล่วงหน้า


โปรดพิจารณาเปลี่ยนคำตอบที่ยอมรับเนื่องจากคำตอบที่ยอมรับในปัจจุบันถูกเลิกใช้แล้ว
deiga

คำตอบ:


187

ดังที่ได้กล่าวไว้ในคำตอบที่ได้รับการยอมรับตอนนี้ PR ถูกรวมเข้าด้วยกันและคุณสามารถรับพ็อดตามโหนดได้ดังนี้:

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

9
นี่เป็นทางออกที่สง่างามที่สุด
Sergiu Marsavela

1
ฉันมีคำชี้แจง: ขั้นแรกนี้--all-namespacesจะดึงพ็อดทั้งหมดจากคลัสเตอร์ทั้งหมดจากนั้นจะกรองโหนด? หรือเป็นเพียงการดึงพ็อดทั้งหมดจากโหนดนั้นโดยไม่ดึงเนมสเปซพ็อดทั้งหมดจากคลัสเตอร์ทั้งหมดอย่างหนัก?
AhmFM

105

ตัวอย่างการจัดเรียงพ็อดตาม nodeName:

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

ตัวอย่างการรับพ็อดบนโหนดโดยใช้ตัวกรองฉลาก:

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

หรือตามจำนวนการรีสตาร์ท

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

ตัวอย่างการกรองตาม nodeName โดยใช้แฟล็ก --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

เป็นเรื่องที่น่าสนใจที่สามารถจัดเรียงตามข้อมูลเหล่านี้ได้ แต่สิ่งเดียวที่สามารถกรองได้ด้วยตัวเลือกคือสิ่งที่อยู่ใน ".spec.selector"
Regnoult

ตัวกรองถูกเรียกใช้งานฝั่งเซิร์ฟเวอร์การเรียงลำดับเป็นฝั่งไคลเอ็นต์
Tim Hockin

19

คุณยังสามารถค้นหาพ็อดทั้งหมดกับโหนดด้วยคำสั่งต่อไปนี้

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

1
ใช้ -a ยังกับ kubectl ----- kubectl รับพ็อด -a -o wide - all-namespaces | grep <YOUR-NODE>
Pawan Kumar

3
นี่คือการค้นหาพ็อดทั้งหมด (แล้วกรองในไคลเอนต์) ซึ่งอาจช้ากว่ามากในคลัสเตอร์ขนาดใหญ่ ทางออกที่ดีที่สุดคือคำตอบของ @Kristofer
Guilherme Garnier

14

kubectl describe node <node> จะแสดงพ็อดที่ไม่สิ้นสุดทั้งหมดที่ทำงานบนโหนดนั้น


10

สิ่งที่คุณต้องการได้รับการสนับสนุนในฝั่งเซิร์ฟเวอร์ Kubernetes API ดังนี้:

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

อย่างไรก็ตามตัวเลือกตัวเลือกฟิลด์นั้นยังไม่ได้รวมอยู่ในkubectl: https://github.com/kubernetes/kubernetes/pull/50140


3
FYI สิ่งนี้ได้ถูกรวมเข้าด้วยกัน
ทูบ

3

ฉันได้ผ่านขั้นตอนเดียวกันกับ Go Client แล้วและพบทางลัดบางอย่างที่ 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
}

ฉันเริ่มพบว่าคำถามมากมายที่ฉันต้องถามนั้นซับซ้อนเกินไปสำหรับ CLI ซึ่งเป็นวิธีที่ยอดเยี่ยม แต่การเรียนรู้ที่จะใช้ Go Client สามารถช่วยให้คุณได้รับคำตอบแรกที่คุณต้องการ แต่ เจาะลึกลงไปในคำถามที่คำตอบเหล่านั้นก่อให้เกิด


2
สามารถใช้ namespace ที่ว่างเปล่าที่จะได้รับในฝัก namespaces ทั้งหมด
DIMM

นี่เป็นวิธีแก้ปัญหาที่ช่วยฉันได้ไม่แน่ใจว่าทำไมจึงถูกโหวตลง
Ingytron
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.