157

Reading the Kubernets documentation it looks to be possible to select a certain range of pods based on labels. I want to select all the pods on one node but I don't want to label each pod on their corresponding node.

Am I missing something from the documentation or is it just not possible to select by node?

If I do:

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

#=>

NAME   READY     STATUS             RESTARTS   AGE       NODE

Can any of these headers be used as selector? If yes, how to do it with kubectl? How to do it with the API?

4

6 回答 6

304

如已接受的答案中所述,PR 现在已合并,您可以按如下方式获取 pod:

kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node>
于 2018-06-12T07:53:42.243 回答
119

按 nodeName 对 pod 进行排序的示例:

kubectl get pods -o wide --sort-by="{.spec.nodeName}"

使用标签过滤器在节点上获取 pod 的示例:

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 标志按 nodeName 过滤的示例:

$ 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
于 2016-08-30T19:21:03.017 回答
22

您还可以使用以下命令查询一个节点的所有 pod

kubectl get pods -o wide --all-namespaces | grep <YOUR-NODE>
于 2018-01-26T14:51:33.097 回答
17
kubectl describe node $NODE

将显示所有在$NODE.

于 2018-06-02T03:57:33.290 回答
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

但是该字段选择器选项尚未内置kubectlhttps ://github.com/kubernetes/kubernetes/pull/50140

于 2017-08-05T04:03:49.723 回答
4

我已经使用 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 来说变得太复杂了,CLI 是一个很好的主力,但是学习使用 Go 客户端可以帮助你获得你正在寻找的第一个答案,但是还深入挖掘这些答案提出的问题。

于 2019-07-24T13:36:54.360 回答