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?

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

Ответы

Ответ 1

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

Ответ 2

Пример сортировки контейнеров по имени 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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

Я прошел через тот же процесс с 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 может помочь вам получить первый ответ, который вы ищете, но также углубиться в вопросы, которые поднимают эти ответы.