Kubernetes API-在特定节点上获取Pods


109

通过查看http://kubernetes.io/docs/user-guide/labels/#selecting-sets-of-nodes,可以根据标签选择一定范围的Pod。但是在我的情况下,我想选择一个节点上的所有Pod,但不想在其相应节点上标记每个Pod。

我是否在文档中缺少某些内容,还是无法按节点进行选择?如果我做:

kubectl --server="<SERVER>" --namespace=<NS> get pods -o wide | head
    NAME   READY     STATUS             RESTARTS   AGE       NODE

这些标头可以用作选择器吗?如果是的话,最重要的是如何使用kubectl破产,如何使用API​​?

提前致谢


由于不赞成使用当前接受的答案,因此请考虑更改接受的答案。
deiga

Answers:


187

如已接受的答案中所述,PR现在已合并,您可以按如下所示按节点获取吊舱:

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

9
这是最优雅的解决方案。
Sergiu Marsavela,

1
我有一个澄清:这--all-namespaces将是首先从整个集群中拉出所有Pod,然后再为节点进行过滤?还是只是从该节点中拉出所有Pod而不会从整个集群中大量拉出所有命名空间Pod?
AhmFM'6

104

按nodeName排序Pod的示例:

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标志按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

有趣的是,可以对这些数据进行排序,但是选择器唯一可以过滤的是“ .spec.selector”上的内容。
退回

过滤器是在服务器端执行的,排序是在客户端执行的
Tim Hockin

19

您还可以使用以下命令查询节点中的所有Pod

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

1
-a还要与kubectl一起使用----- kubectl获取容器-a -o wide --all-namespaces | grep <您的节点>
Pawan Kumar,

3
这实际上是在查询所有Pod(然后在客户端中进行过滤),这在大型集群中可能要慢得多。最好的解决方案是@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

但是该字段选择器选项尚未内置kubectlhttps : //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
}

我已经开始发现,对于CLI来说,我需要问的许多问题变得太复杂了,这是一个很好的选择,但是学习使用Go Client可以帮助您获得所要的第一个答案,但是还更深入地研究那些答案提出的问题。


2
可以使用一个空的名称空间来获取所有名称空间中的Pod
dimm

这是对我有帮助的解决方案,不确定为什么会被否决。
Ingytron '20
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.