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?

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

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

Ответы:

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>
Mal
источник
1
используйте -a также с kubectl ----- kubectl get pods -a -o wide --all-namespaces | grep <YOUR-NODE>
Паван Кумар
3
Фактически это запрос всех модулей (а затем фильтрация в клиенте), что может быть намного медленнее в больших кластерах. Лучшим решением будет ответ @Kristofer.
Гильерме Гарнье
14

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

Мэтт Хаманн
источник
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,