web-dev-qa-db-ja.com

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

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バストでそれを行う方法、APIでそれを行う方法?

前もって感謝します

42
Regnoult

必要なものは、次のように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/5014

6
coreypobrien

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
68
Camil

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

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

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

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

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

11
Matt Hamann

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にとって複雑になりすぎていることに気づき始めましたが、Go Clientの使い方を学ぶことで、探している最初の答えを得ることができますが、また、それらの答えが提起する質問をより深く掘り下げます。

0
Breedly