Kubernetes API - получает поды на определенных узлах

Глядя на 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?

заранее спасибо


person Regnoult    schedule 30.08.2016    source источник
comment
Пожалуйста, подумайте об изменении принятого ответа, так как текущий принятый ответ устарел.   -  person deiga    schedule 31.01.2020


Ответы (6)


Как упоминалось в принятом ответе, PR теперь объединен, и вы можете получить поды по узлам следующим образом:

kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node>
person Kristofer    schedule 12.06.2018
comment
Это самое элегантное решение. - person Sergiu Marsavela; 09.10.2018
comment
У меня есть пояснение: этот --all-namespaces собирается сначала вытащить все поды из всего кластера, а затем отфильтровать узел? или он просто будет извлекать все модули только из этого узла, не сильно вытягивая все модули пространств имен из всего кластера? - person AhmFM; 11.06.2020
comment
Отличное решение, спасибо! - person user2279952; 30.04.2021
comment
Спасибо это самый красивый способ - person Jean-Marc Amon; 19.05.2021

Пример сортировки модулей по имени узла:

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

Пример фильтрации по имени узла с использованием флага --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
person Camil    schedule 30.08.2016
comment
Интересно, что по этим данным можно сортировать, но с помощью селектора можно фильтровать только то, что находится в .spec.selector. - person Regnoult; 31.08.2016
comment
Фильтры выполняются на стороне сервера, сортировка - на стороне клиента. - person Tim Hockin; 01.09.2016
comment
это отличный и чрезвычайно полезный ответ, спасибо - person Tommy; 13.07.2021

Вы также можете запросить все модули в узле с помощью следующей команды

kubectl get pods -o wide --all-namespaces | grep <YOUR-NODE>
person Mal    schedule 26.01.2018
comment
используйте -a также с kubectl ----- kubectl get pods -a -o wide --all-namespaces | grep ‹YOUR-NODE› - person Pawan Kumar; 03.06.2018
comment
Фактически это запрос для всех модулей (а затем фильтрация в клиенте), что может быть намного медленнее в больших кластерах. Лучшим решением будет ответ @Kristofer. - person Guilherme Garnier; 08.04.2019
comment
Я думаю, -a больше не работает. Нам нужно использовать «-A» вместо чего-то вроде, kubectl get pods -A -owide | grep ‹node_name› - person NightOwl19; 14.01.2021

kubectl describe node <node> покажет все незавершенные модули, работающие на этом узле.

person Matt Hamann    schedule 02.06.2018

То, что вы хотите, поддерживается на стороне сервера 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

person coreypobrien    schedule 05.08.2017
comment
К вашему сведению, теперь это объединено - person deedubs; 23.01.2018

Я проделал тот же процесс с 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
}

Я начал обнаруживать, что многие вопросы, которые мне нужно задать, становятся слишком сложными для интерфейса командной строки, который является отличной рабочей лошадкой, но обучение использованию Go Client может помочь вам получить первый ответ, который вы ищете, но также углубитесь в вопросы, которые поднимают эти ответы.

person Breedly    schedule 24.07.2019
comment
Может использовать пустое пространство имен для получения модулей во всех пространствах имен - person dimm; 14.08.2019
comment
Это решение, которое помогло мне, не знаю, почему оно было отклонено. - person Ingytron; 16.04.2020