阅读Kubernets文档,似乎可以根据标签选择一定范围的pod。我想选择一个节点上的所有pod,但不想在相应的节点上标记每个pod。

我是否从文档中遗漏了一些东西,或者只是不可能按节点选择?

如果我这样做:

kubectl get pods \
--output=wide
--namespace=$NS \
--server=$SERVER | head

#=>

NAME   READY     STATUS             RESTARTS   AGE       NODE

这些头可以用作选择器吗?如果是,如何使用kubectl?如何用API做到这一点?


当前回答

我用Go客户端也经历了同样的过程,它揭示了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来说都变得太复杂了,而CLI是一个很好的工作工具,但是学习使用Go客户端可以帮助你得到你想要的第一个答案,而且还可以更深入地挖掘这些答案提出的问题。

其他回答

正如接受的答案中提到的,PR现在被合并了,你可以按节点获取pods,如下所示:

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

我用Go客户端也经历了同样的过程,它揭示了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来说都变得太复杂了,而CLI是一个很好的工作工具,但是学习使用Go客户端可以帮助你得到你想要的第一个答案,而且还可以更深入地挖掘这些答案提出的问题。

kubectl describe node $NODE

将显示在$NODE上运行的所有未终止的pod。

你也可以用下面的命令查询一个节点上的所有pod

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

你想要的在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