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


102

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

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


Пожалуйста, подумайте об изменении принятого ответа, так как текущий принятый ответ устарел.
дейга

Ответы:


174

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

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

8
Это самое элегантное решение.
Серджиу Марсавела

У меня есть пояснение: --all-namespacesсначала будут извлечены все модули из всего кластера, а затем он будет отфильтрован для узла? или он просто будет извлекать все модули только из этого узла, не сильно вытягивая все модули пространства имен из всего кластера?
AhmFM

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

или по количеству перезапусков

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".
Regnoult

Фильтры выполняются на стороне сервера, сортировка на стороне клиента
Тим Хокин

18

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

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

1
используйте -a также с kubectl ----- kubectl get pods -a -o wide --all-namespaces | grep <YOUR-NODE>
Паван Кумар

3
Фактически это запрос всех модулей (а затем фильтрация в клиенте), что может быть намного медленнее в больших кластерах. Лучшим решением будет ответ @Kristofer.
Гильерме Гарнье


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
К вашему сведению, это теперь объединено
deedubs

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
}

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


2
Можно использовать пустое пространство имен для получения модулей во всех пространствах имен
dimm

Это решение, которое помогло мне, не знаю, почему оно было отклонено.
Ingytron,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.