Kubernetes API-특정 노드에서 포드 가져 오기


109

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로 수행하는 방법은 무엇입니까?

미리 감사드립니다


현재 수락 된 답변은 더 이상 사용되지 않으므로 수락 된 답변을 변경하는 것이 좋습니다.
deiga

답변:


187

수락 된 답변에서 언급했듯이 PR이 이제 병합되었으며 다음과 같이 노드별로 포드를 가져올 수 있습니다.

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

9
이것은 가장 우아한 솔루션입니다.
Sergiu Marsavela

1
설명이 있습니다. --all-namespaces먼저 전체 클러스터에서 모든 포드를 가져온 다음 노드를 필터링 할 것입니까? 아니면 전체 클러스터에서 모든 네임 스페이스 포드를 많이 가져 오지 않고 해당 노드에서만 모든 포드를 가져 오나요?
AhmFM

105

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}"

--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"에있는 것입니다.
Regnoult

필터는 서버 측에서 실행되며 정렬은 클라이언트 측에서 이루어집니다
Tim Hockin 2016 년

19

다음 명령을 사용하여 모든 pod와 노드를 쿼리 할 수도 있습니다.

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

1
-a도 kubectl과 함께 사용하십시오. ----- kubectl get pods -a -o wide --all-namespaces | 그렙 <YOUR-NODE>
파완 쿠마르

3
이것은 실제로 모든 포드를 쿼리 한 다음 클라이언트에서 필터링하며, 대규모 클러스터에서는 훨씬 느릴 수 있습니다. 가장 좋은 해결책은 @Kristofer의 대답입니다.
Guilherme Garnier

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
}

저는 제가 물어봐야 할 많은 질문이 CLI에 비해 너무 복잡해지고 있다는 사실을 알게되었습니다. CLI는 훌륭한 도구이지만 Go 클라이언트를 사용하는 방법을 배우면 찾고있는 첫 번째 답변을 얻을 수 있습니다. 또한 그 답변이 제기하는 질문을 더 깊이 파고 듭니다.


2
빈 네임 스페이스를 사용하여 모든 네임 스페이스에서 포드를 가져올 수 있음
dimm

이것이 저에게 도움이 된 솔루션이지만 왜 비추천을 받았는지 확실하지 않습니다.
Ingytron
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.