Kubernetes API - belirli düğümlerde Kapsüller alır


103

Baktığımızda http://kubernetes.io/docs/user-guide/labels/#selecting-sets-of-nodes görünüyor etiketlere dayalı bölmelerin belirli bir aralık seçmek mümkün olduğu. Ama benim durumumda tek bir düğümdeki tüm bölmeleri seçmek istiyorum, ancak her bölmeyi karşılık gelen düğümlerinde etiketlemek istemiyorum.

Belgelerden bir şey mi eksik yoksa düğüme göre seçim yapmak mümkün değil mi? Eğer yaparsam:

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

Bu başlıklardan herhangi biri seçici olarak kullanılabilir mi? Cevabınız evet ise kubectl bust ile nasıl yapılır en önemlisi, API ile nasıl yapılır?

Şimdiden teşekkürler


Mevcut kabul edilen yanıt kullanımdan kaldırıldığı için lütfen kabul edilen yanıtı değiştirmeyi düşünün.
deiga

Yanıtlar:


175

Kabul edilen cevapta belirtildiği gibi, PR şimdi birleştirildi ve aşağıdaki gibi düğümlere göre kapsüller alabilirsiniz:

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

8
Bu en zarif çözümdür.
Sergiu Marsavela

Bir açıklamam var: bu --all-namespacesönce tüm bölmeleri tüm kümeden çekecek ve sonra düğüm için filtreleyecek mi? yoksa tüm bölmeleri yalnızca o düğümden tüm ad alanı kapsüllerini tüm kümeden yoğun bir şekilde çekmeden mi çekecek?
AhmFM

98

Bölmeleri düğüme göre sıralama örneği:

kubectl get pods -o wide --sort-by="{.spec.nodeName}"

Etiket filtresi kullanarak düğümlerde kapsül alma örneği:

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

veya yeniden başlatma sayısına göre

kubectl get pods --sort-by="{.status.containerStatuses[:1].restartCount}"

--Template bayrağı kullanarak düğümAdı ile örnek filtreleme:

$ 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

Bu verilere göre sıralamanın mümkün olması ilginçtir, ancak seçici tarafından filtrelenebilecek tek şey ".spec.selector" da olan şeydir.
Regnoult

Filtreler sunucu tarafında yürütülür, sıralama istemci tarafında yapılır
Tim Hockin

18

Aşağıdaki komutla tüm bölmeler için bir düğüm de sorgulayabilirsiniz.

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

1
-a'yı kubectl ile de kullanın ----- kubectl kapsülleri al -a -o geniş --tüm ad alanları | grep <SİZİN DÜĞÜMÜNÜZ>
Pawan Kumar

3
Bu aslında tüm bölmeleri sorgulamaktır (ve daha sonra istemcide filtrelemek), ki bu büyük kümelerde çok daha yavaş olabilir. En iyi çözüm @Kristofer'ın cevabı olacaktır.
Guilherme Garnier

14

kubectl describe node <node> o düğümde çalışan sonlandırılmamış tüm kapsülleri gösterecek


10

İstediğiniz şey Kubernetes API sunucu tarafında şu şekilde desteklenir:

curl --cacert ca.crt --cert apiserver.crt --key apiserver.key  https://<server>:<port>/api/v1/namespaces/<namespace>/pods?fieldSelector=spec.nodeName%3Dsomenodename

Ancak bu alan seçici seçeneği henüz yerleşik değildir kubectl: https://github.com/kubernetes/kubernetes/pull/50140


3
Bilginize Bu şimdi birleştirildi
deedubs

3

Go Client ile aynı işlemi yaptım ve CLI'nin kullandığı birkaç kısayolu ortaya çıkarıyor.

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
}

Sormam gereken soruların çoğunun CLI için çok karmaşık hale geldiğini bulmaya başladım, bu harika bir çalışma atıdır, ancak Go Client'ı kullanmayı öğrenmek, aradığınız ilk yanıtı almanıza yardımcı olabilir, ancak ayrıca bu yanıtların ortaya çıkardığı sorulara daha derine inin.


2
Tüm ad alanlarında kapsüller almak için boş bir ad alanı kullanabilir
dimm

Bana yardımcı olan çözüm bu, neden reddedildiğinden emin değilim.
Ingytron
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.