কুবারনেটস এপিআই - নির্দিষ্ট নোডগুলিতে পড পেয়েছে


102

এ খুঁজছি http://kubernetes.io/docs/user-guide/labels/#selecting-sets-of-nodes দেখে মনে হচ্ছে লেবেল উপর ভিত্তি করে pods একটি নির্দিষ্ট ব্যাপ্তি নির্বাচন করা সম্ভব হবে। তবে আমার ক্ষেত্রে আমি একটি নোডের সমস্ত শুঁটি নির্বাচন করতে চাই তবে আমি প্রতিটি পোডকে তাদের নোডে লেবেল করতে চাই না।

আমি কি ডকুমেন্টেশন থেকে কিছু অনুপস্থিত বা নোড দ্বারা নির্বাচন করা সম্ভব নয়? যদি আমি করি:

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

এই শিরোলেখগুলির মধ্যে কেউ কি নির্বাচক হিসাবে ব্যবহার করতে পারেন? যদি হ্যাঁ কীভাবে এটি সবচেয়ে গুরুত্বপূর্ণভাবে কুবেটেল বুস্টের সাথে করবেন তবে এটিআইপি দিয়ে কীভাবে করবেন?

আগাম ধন্যবাদ


বর্তমান গৃহীত উত্তর হ্রাস করা হয়েছে হিসাবে দয়া করে গ্রহণযোগ্য উত্তর পরিবর্তন বিবেচনা করুন।
দেইগা

উত্তর:


174

গৃহীত উত্তরে উল্লিখিত হিসাবে পিআর এখন মার্জ হয়ে গেছে এবং আপনি নোড দ্বারা নীচে নীচে পোড পেতে পারেন:

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

8
এটি সবচেয়ে মার্জিত সমাধান।
সের্গিউ মার্সাভেলা

আমার একটি স্পষ্টতা আছে: এটি --all-namespacesপ্রথমে পুরো ক্লাস্টার থেকে সমস্ত শুঁটি টানতে যাচ্ছে এবং তারপরে নোডের জন্য ফিল্টার করবে? বা পুরো ক্লাস্টার থেকে সমস্ত নেমস্পেসের শুঁকিকে ভারীভাবে না টানিয়েই কেবল সেই নোড থেকে সমস্ত শুঁটি টানা যাচ্ছে?
আহমএফএম

98

নোডনাম অনুসারে পোড বাছাইয়ের উদাহরণ:

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

বা পুনঃসূচনা সংখ্যা দ্বারা by

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

--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" এ নির্বাচক দ্বারা ফিল্টার করা যায়।
পুনরায় রেজল্ট করুন

ফিল্টারগুলি সার্ভার-সাইড চালিত হয়, বাছাইয়ের বিষয়টি ক্লায়েন্ট-সাইড
টিম হকিন

18

আপনি নিম্নলিখিত কমান্ডের সাথে একটি নোডের সমস্ত পোডের জন্যও জিজ্ঞাসা করতে পারেন

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

4
ব্যবহার করুন - কুবেটেল ----- কুবেক্টেল সহ শুকানও পাবেন - সমস্ত-নেমস্পেস | গ্রেপ <YOUR-NODE>
পবন কুমার

4
এটি আসলে সমস্ত পোডের জন্য অনুসন্ধান করছে (এবং তারপরে ক্লায়েন্টে ফিল্টারিং), যা বড় ক্লাস্টারে খুব ধীর হতে পারে। সেরা সমাধানটি হ'ল ক্রিস্টোফারের উত্তর।
গিলহার্ম গার্নিয়ার


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


4
এফওয়াইআই এটি এখন একীভূত করা হয়েছে
23:38

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
}

আমি সন্ধান করতে শুরু করেছি যে আমাকে জিজ্ঞাসা করা উচিত অনেকগুলি প্রশ্ন সিএলআইয়ের জন্য খুব জটিল হয়ে উঠছে যা একটি দুর্দান্ত ওয়ার্কস ঘোড়া, তবে গো ক্লায়েন্ট ব্যবহার করা শিখলে আপনি যে উত্তরটি সন্ধান করছেন তার প্রথম উত্তর পেতে আপনাকে সহায়তা করতে পারে তবে সেই উত্তরগুলি যে প্রশ্নগুলি উত্থাপন করে তার আরও গভীর খনন।


4
সমস্ত নেমস্পেসে
শুঁটি

এটি সেই সমাধান যা আমাকে সহায়তা করেছিল, কেন এটি ডাউনভিটেড হয়েছিল তা নিশ্চিত নয়।
ইনজিট্রন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.