कुबेरनेट्स एपीआई - विशिष्ट नोड्स पर पॉड्स प्राप्त करता है


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

क्या इनमें से किसी हेडर को चयनकर्ता के रूप में इस्तेमाल किया जा सकता है? यदि हाँ, इसे कुबेटेकल बस्ट के साथ कैसे करना है, तो इसे एपीआई के साथ कैसे करें?

अग्रिम में धन्यवाद


कृपया स्वीकृत उत्तर को बदलने पर विचार करें, क्योंकि वर्तमान स्वीकृत उत्तर को हटा दिया गया है।
डिगा

जवाबों:


187

जैसा कि स्वीकृत उत्तर में उल्लेख किया गया है कि पीआर अब विलय कर दिया गया है और आप नोड को निम्नानुसार प्राप्त कर सकते हैं:

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

9
यह सबसे सुरुचिपूर्ण समाधान है।
सेर्गी मारसावेल

1
मेरे पास एक स्पष्टीकरण है: यह --all-namespacesपहले पूरे पॉड से सभी पॉड्स खींचने जा रहा है और फिर नोड के लिए फ़िल्टर करने जा रहा है? या यह सिर्फ उस नोड से सभी पॉड्स को खींचने के लिए जा रहा है बिना पूरे क्लस्टर से सभी नेमस्पेस फली को खींचने के बिना?
अहम्फल

104

नोडनेम द्वारा फली छाँटने का उदाहरण:

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}"

नोड फिल्टर द्वारा उदाहरण फ़िल्टरिंग

$ 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

फ़िल्टर सर्वर-साइड निष्पादित किए जाते हैं, सॉर्टिंग क्लाइंट-साइड है
टिम हॉकिन

19

आप निम्न आदेश के साथ सभी नोड्स के लिए एक नोड क्वेरी कर सकते हैं

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

1
उपयोग -a भी kubectl के साथ ----- kubectl पॉड्स प्राप्त करें -a -o चौड़े --all-namespaces | grep <Your-NODE>
पवन कुमार

3
यह वास्तव में सभी पॉड्स (और फिर क्लाइंट में फ़िल्टरिंग) के लिए क्वेरी कर रहा है, जो बड़े समूहों में बहुत धीमा हो सकता है। सबसे अच्छा समाधान होगा @Kristofer का जवाब।
गिलहर्मे गार्नियर

14

kubectl describe node <node> उस नोड पर चलने वाले सभी गैर-समाप्त पॉड्स दिखाएगा


10

आप इस तरह से कुबेरनेट्स एपीआई सर्वर-साइड में समर्थित हैं:

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 करें अब यह विलय कर दिया गया है
deedubs

3

मैं गो क्लाइंट के साथ एक ही प्रक्रिया से गुजरा हूं और यह कुछ शॉर्टकट्स को खोलती है जिन्हें सीएलआई ले रहा है।

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
}

मैंने यह पता लगाना शुरू कर दिया है कि मेरे द्वारा पूछे जाने वाले बहुत सारे प्रश्न सीएलआई के लिए बहुत जटिल होते जा रहे हैं, जो कि एक बेहतरीन वर्कहॉर्स है, लेकिन गो क्लाइंट का उपयोग करना सीखने में मदद कर सकता है जो आपको पहले उत्तर की तलाश में है, लेकिन उन सवालों को भी गहराई से खोदते हैं जो उत्तर देते हैं।


2
सभी नामस्थान में फली प्राप्त करने के लिए एक खाली नाम स्थान का उपयोग कर सकता
DIMM

यह वह समाधान है जिसने मेरी मदद की, यह सुनिश्चित नहीं किया कि यह नीचा क्यों हुआ।
इंगेट्रॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.