KubernetesAPI-特定のノードでポッドを取得します


109

http://kubernetes.io/docs/user-guide/labels/#selecting-sets-of-nodesを見ると、ラベルに基づいて特定の範囲のポッドを選択できるようです。しかし、私の場合、1つのノードですべてのポッドを選択したいのですが、対応するノードで各ポッドにラベルを付けたくありません。

ドキュメントに何かが足りないのですか、それともノードで選択できないのですか?私が行った場合:

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

これらのヘッダーのいずれかをセレクターとして使用できますか?はいの場合、kubectl bustでそれを行う方法が最も重要ですが、APIでそれを行う方法は?

前もって感謝します


現在受け入れられている回答は非推奨になっているため、受け入れられた回答の変更を検討してください。
deiga

回答:


186

受け入れられた回答で述べたように、PRはマージされ、次のようにノードごとにポッドを取得できます。

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

9
これは最もエレガントなソリューションです。
Sergiu Marsavela 2018年

1
私は明確にしました:これ--all-namespacesは最初にクラスター全体からすべてのポッドをプルし、次にノードをフィルタリングしますか?それとも、クラスター全体からすべての名前空間ポッドを大幅にプルすることなく、そのノードからすべてのポッドをプルするだけですか?
AhmFM

103

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 2016

フィルタはサーバー側で実行され、並べ替えはクライアント側で行われます
Tim Hockin 2016

19

次のコマンドを使用して、ノードのすべてのポッドをクエリすることもできます。

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

1
kubectlでも-aを使用します----- kubectl get pods -a -o wide --all-namespaces | grep <YOUR-NODE>
Pawan Kumar 2018

3
これは実際にはすべてのポッドをクエリし(そしてクライアントでフィルタリングし)、大規模なクラスターでははるかに遅くなる可能性があります。最善の解決策は、@ Kristoferの答えです。
GuilhermeGarnier19年

14

kubectl describe node <node> そのノードで実行されている終了していないポッドがすべて表示されます


10

必要なものは、次のようにKubernetesAPIサーバー側でサポートされます。

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
参考

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クライアントの使い方を学ぶことで、探している最初の答えを得ることができます。また、それらの回答が提起する質問をより深く掘り下げます。


2
すべての名前空間にポッドを取得するには、空の名前空間を使用することができます
DIMM

これは私を助けた解決策ですが、なぜそれが反対票を投じられたのかわかりません。
Ingytron
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.