API Kubernetes - nhận Pod trên các nút cụ thể


103

Nhìn vào http://kubernetes.io/docs/user-guide/labels/#selecting-sets-of-nodes, có vẻ như bạn có thể chọn một loạt nhóm nhất định dựa trên nhãn. Nhưng trong trường hợp của tôi, tôi muốn chọn tất cả các nhóm trên một nút nhưng tôi không muốn gắn nhãn từng nhóm trên nút tương ứng của chúng.

Tôi có thiếu thứ gì đó trong tài liệu hay chỉ là không thể chọn theo nút? Nếu tôi làm:

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

Có thể sử dụng bất kỳ tiêu đề nào trong số này làm bộ chọn không? Nếu có, làm thế nào để làm điều đó với kubectl bust quan trọng nhất, làm thế nào để làm điều đó với API?

Cảm ơn trước


Vui lòng xem xét việc thay đổi câu trả lời được chấp nhận, vì câu trả lời được chấp nhận hiện tại không được dùng nữa.
deiga

Câu trả lời:


175

Như đã đề cập trong câu trả lời được chấp nhận, PR hiện đã được hợp nhất và bạn có thể nhận các nhóm theo nút như sau:

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

8
Đây là giải pháp thanh lịch nhất.
Sergiu Marsavela

Tôi có một sự giải thích rõ ràng: điều này --all-namespacestrước tiên sẽ kéo tất cả các nhóm từ toàn bộ cụm và sau đó nó sẽ lọc cho nút? hay nó sẽ chỉ kéo tất cả các nhóm từ nút đó mà không kéo nặng tất cả các nhóm không gian tên từ toàn bộ cụm?
AhmFM

98

Ví dụ sắp xếp các nhóm theo nodeName:

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

Ví dụ về nhận các nhóm trên các nút bằng bộ lọc nhãn:

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

hoặc theo số lần khởi động lại

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

Ví dụ về lọc theo nodeName bằng cờ --template:

$ 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

Điều thú vị là có thể sắp xếp theo những dữ liệu này nhưng thứ duy nhất có thể được lọc bằng bộ chọn là những gì có trên ".spec.selector".
Regnoult,

Các bộ lọc được thực hiện phía máy chủ, phân loại là client-side
Tim Hockin

18

Bạn cũng có thể truy vấn cho tất cả các nhóm một nút bằng lệnh sau

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

1
sử dụng -a cũng với kubectl ----- kubectl nhận các nhóm -a -o rộng - tất cả các không gian tên | grep <YOUR-NODE>
Pawan Kumar

3
Điều này thực sự đang truy vấn cho tất cả các nhóm (và sau đó lọc trong máy khách), có thể chậm hơn nhiều trong các cụm lớn. Giải pháp tốt nhất sẽ là câu trả lời của @Kristofer.
Guilherme Garnier

14

kubectl describe node <node> sẽ hiển thị tất cả các nhóm không kết thúc đang chạy trên nút đó


10

Những gì bạn muốn được hỗ trợ ở phía máy chủ Kubernetes API như sau:

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

Tuy nhiên, tùy chọn bộ chọn trường đó chưa được tích hợp sẵn kubectl: https://github.com/kubernetes/kubernetes/pull/50140


3
FYI Điều này hiện đã được hợp nhất
deedubs

3

Tôi đã trải qua quá trình tương tự với Go Client và nó phát hiện ra một số phím tắt mà CLI đang sử dụng.

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
}

Tôi bắt đầu nhận thấy rằng nhiều câu hỏi tôi cần hỏi đang trở nên quá phức tạp đối với CLI, đây là một công cụ tuyệt vời, nhưng học cách sử dụng Go Client có thể giúp bạn có câu trả lời đầu tiên mà bạn đang tìm kiếm, nhưng cũng đi sâu hơn vào các câu hỏi mà những câu trả lời đó nêu ra.


2
Có thể sử dụng một không gian tên trống để nhận các nhóm trong tất cả các không gian tên
dimm

Đây là giải pháp đã giúp tôi, không rõ tại sao nó lại bị downvot.
Ingytron
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.