Dengan melihat http://kubernetes.io/docs/user-guide/labels/#selecting-sets-of-nodes , tampaknya mungkin untuk memilih kisaran pod tertentu berdasarkan label. Tetapi dalam kasus saya, saya ingin memilih semua pod pada satu node tetapi saya tidak ingin memberi label pada setiap pod pada node yang sesuai.
Apakah saya kehilangan sesuatu dari dokumentasi atau tidak mungkin memilih dengan node? Bila saya lakukan:
kubectl --server="<SERVER>" --namespace=<NS> get pods -o wide | head
NAME READY STATUS RESTARTS AGE NODE
Dapatkah tajuk ini digunakan sebagai pemilih? Jika ya, bagaimana melakukannya dengan kubectl bust yang terpenting, bagaimana melakukannya dengan API?
Terima kasih sebelumnya
kubernetes
kubectl
Menyesal
sumber
sumber
Jawaban:
Seperti yang disebutkan dalam jawaban yang diterima, PR sekarang digabungkan dan Anda bisa mendapatkan pod berdasarkan node sebagai berikut:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node>
sumber
--all-namespaces
pertama-tama akan menarik semua pod dari seluruh cluster dan kemudian akan memfilter node? atau hanya akan menarik semua pod dari node itu saja tanpa menarik semua pod namespace dari seluruh cluster?Contoh pengurutan pod berdasarkan nodeName:
kubectl get pods -o wide --sort-by="{.spec.nodeName}"
Contoh mendapatkan pod pada node menggunakan filter label:
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
atau dengan jumlah restart
kubectl get pods --sort-by="{.status.containerStatuses[:1].restartCount}"
Contoh pemfilteran oleh nodeName menggunakan --template flag:
$ 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
sumber
Anda juga dapat membuat kueri untuk semua pod dan sebuah node dengan perintah berikut
kubectl get pods -o wide --all-namespaces | grep <YOUR-NODE>
sumber
kubectl describe node <node>
akan menampilkan semua pod yang tidak dihentikan yang berjalan di node tersebutsumber
Apa yang Anda inginkan didukung di sisi server Kubernetes API seperti ini:
curl --cacert ca.crt --cert apiserver.crt --key apiserver.key https://<server>:<port>/api/v1/namespaces/<namespace>/pods?fieldSelector=spec.nodeName%3Dsomenodename
Namun opsi pemilih bidang tersebut
kubectl
belum ada di dalamnya : https://github.com/kubernetes/kubernetes/pull/50140sumber
Saya telah melalui proses yang sama dengan Go Client dan menemukan beberapa pintasan yang diambil 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 }
Saya mulai menemukan bahwa banyak pertanyaan yang perlu saya tanyakan menjadi terlalu rumit untuk CLI yang merupakan pekerja keras yang hebat, tetapi belajar menggunakan Go Client dapat membantu Anda mendapatkan jawaban pertama yang Anda cari, tetapi juga menggali lebih dalam pertanyaan yang muncul dari jawaban tersebut.
sumber