Kubernetes API - отримує Pods на певних вузлах


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, найголовніше, як це зробити за допомогою API?

Спасибі заздалегідь


Будь ласка, подумайте про зміну прийнятої відповіді, оскільки поточна прийнята відповідь застаріла.
deiga

Відповіді:


174

Як згадувалося у прийнятій відповіді, PR тепер об’єднано, і ви можете отримувати стручки по вузлу наступним чином:

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

8
Це найелегантніше рішення.
Сергіу Марсавела

У мене є роз’яснення: це --all-namespacesспочатку витягне всі стручки з цілого кластера, а потім фільтрує для вузла? або це просто буде витягувати всі стручки з цього вузла, лише не сильно витягуючи всі простори імен стручки з цілого кластера?
AhmFM

98

Приклад сортування стручків за 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".
Перерегулювати

Фільтри виконуються на стороні сервера, сортування відбувається на стороні клієнта
Тім Хокін

18

Ви також можете запитати для всіх стручків вузол за допомогою наступної команди

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

1
використовувати -a також із kubectl ----- kubectl отримати стручки -a -o широкий - всі простори імен | grep <YOUR-NODE>
Pawan Kumar

3
Це фактично запит для всіх стручків (а потім фільтрація в клієнті), що може бути набагато повільнішим у великих кластерах. Найкращим рішенням буде відповідь @Kristofer.
Guilherme Garnier


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 Зараз це об’єднано
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
}

Я почав виявляти, що багато запитань, які мені потрібно задати, стають занадто складними для CLI, що є чудовим конем, але навчитися користуватися Go Client може допомогти вам отримати першу відповідь, яку ви шукаєте, але також глибше заглибитися у питання, які ці відповіді викликають.


2
Можна використовувати порожній простір імен , щоб отримати стручки у всіх просторах імен
DIMM

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