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でそれを行う方法?
前もって感謝します
必要なものは、次のように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
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
受け入れられた回答で述べたように、PRは現在マージされており、次のようにノードごとにポッドを取得できます。
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node>
次のコマンドを使用して、ノードのすべてのポッドを照会することもできます
kubectl get pods -o wide --all-namespaces | grep <YOUR-NODE>
kubectl describe node <node>
は、そのノードで実行されているすべての終了していないポッドを表示します
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の使い方を学ぶことで、探している最初の答えを得ることができますが、また、それらの答えが提起する質問をより深く掘り下げます。