Làm cách nào để bạn liệt kê rõ ràng tất cả các vùng chứa trong một nhóm kubernetes?


82

Tôi đang tìm cách liệt kê tất cả các vùng chứa trong một nhóm trong một tập lệnh thu thập nhật ký của sau khi chạy thử nghiệm. kubectl describe pods -l k8s-app=kube-dnstrả về rất nhiều thông tin, nhưng tôi chỉ đang tìm kiếm thông tin trả về như:

etcd
kube2sky
skydns

Tôi không thấy một cách đơn giản để định dạng đầu ra mô tả. Có lệnh khác không? (và tôi đoán trường hợp xấu nhất luôn có phân tích cú pháp đầu ra của mô tả).

Câu trả lời:


57

Bạn có thể sử dụng getvà chọn một trong các mẫu đầu ra được hỗ trợ với cờ --output( -o).

Lấy jsonpathví dụ, kubectl get pods -l k8s-app=kube-dns -o jsonpath={.items[*].spec.containers[*].name}cung cấp cho bạn etcd kube2sky skydns.

Các mẫu đầu ra đầu ra được hỗ trợ khác là go-template, go-template-file, jsonpath-file. Xem http://kubernetes.io/docs/user-guide/jsonpath/ để biết cách sử dụng mẫu jsonpath. Xem https://golang.org/pkg/text/template/#pkg-overview để biết cách sử dụng go template.

Cập nhật: Kiểm tra tài liệu này để biết các lệnh mẫu khác để liệt kê hình ảnh vùng chứa: https://kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/


3
Nếu bạn muốn xem đầu ra json, hãy sử dụng kubectl get pods -o json.
janetkuo

19
Nếu bạn đang làm việc với một nhóm cụ thể, lệnh làkubectl get pods kube-dns-q2oh6 -o jsonpath={.spec.containers[*].name}
Charles L.

65

Câu trả lời

kubectl get pods POD_NAME_HERE -o jsonpath='{.spec.containers[*].name}'

Giải trình

Điều này nhận đối tượng JSON đại diện cho nhóm. Sau đó, nó sử dụng JSONpath của kubectl để trích xuất tên của mỗi vùng chứa từ nhóm.


27

Hack nhanh để tránh xây dựng truy vấn JSONpath cho một nhóm duy nhất:

$ kubectl logs mypod-123
a container name must be specified for pod mypod-123, choose one of: [etcd kubesky skydns]

Câu trả lời này chính xác như những gì nó nói .. một bản hack nhanh chóng. Thực sự hữu ích :) Tất nhiên không thể được sử dụng trong một loại kịch bản. Nó phục vụ yêu cầu.
Rakesh N

Mới nhất cũng cho cả hai containersinit containers
Neo

@Neo Tôi không thấy init containersvới cách này trên v1.18.8 :(
subtleseeker

10

Tôi tổng hợp một số ý tưởng với nhau thành sau:

Dòng đơn giản:

kubectl get po -o jsonpath='{range .items[*]}{"pod: "}{.metadata.name}{"\n"}{range .spec.containers[*]}{"\tname: "}{.name}{"\n\timage: "}{.image}{"\n"}{end}'

Tách (để dễ đọc):

kubectl get po -o jsonpath='
    {range .items[*]}
    {"pod: "}
    {.metadata.name}
    {"\n"}{range .spec.containers[*]}
    {"\tname: "}
    {.name}
    {"\n\timage: "}
    {.image}
    {"\n"}
    {end}'

@EzLo Tôi không chắc mình có thích định dạng dòng đơn hơn không. Tôi không phải là người thích phải cuộn.
Shawn

bạn có thể hiển thị cả hai lựa chọn thay thế. Hãy đổi lại nếu bạn muốn. Sử dụng định dạng mã (CTRL + K) thường tốt hơn trích dẫn (CTRL + Q) vì kiểu chữ, cho mã.
EzLo

Có cách nào để tôi có thể liệt kê tên nhóm cho mỗi vùng chứa ở định dạng này không?
Sam Thomas

Để tránh cần phải cuộn và tìm kiếm thủ công - hãy chuyển nó đến lesshoặc đến vi: COMMAND | less hoặcvi<(COMMAND)
Sergey Smolnikov

di chuyển tại stack overflow @SergeySmolnikov
Shawn

7

nếu bạn muốn có kết quả rõ ràng về các vùng chứa nào từ mỗi Pod

kubectl get po -l k8s-app=kube-dns \
   -o=custom-columns=NAME:.metadata.name,CONTAINERS:.spec.containers[*].name

2

Nếu bạn sử dụng jsonlàm định dạng đầu ra, kubectl getbạn sẽ nhận được nhiều chi tiết về a pod. Với jsonbộ vi xử lý như jqvậy, thật dễ dàng để chọn hoặc lọc các phần nhất định mà bạn quan tâm.

Để liệt kê các vùng chứa của một nhóm, jqtruy vấn trông giống như sau:

kubectl get --all-namespaces --selector k8s-app=kube-dns --output json pods \
  | jq --raw-output '.items[].spec.containers[].name'

Nếu bạn muốn xem tất cả các chi tiết liên quan đến một vùng chứa cụ thể, hãy thử một cái gì đó như sau:

kubectl get --all-namespaces --selector k8s-app=kube-dns --output json pods \
  | jq '.items[].spec.containers[] | select(.name=="etcd")'

1

Tôi sử dụng điều này để hiển thị các phiên bản hình ảnh trên vỏ.

kubectl get pods  -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{end}{end}' && printf '\n'

Đây chỉ là một sửa đổi nhỏ của tập lệnh từ đây , với việc thêm dòng mới để bắt đầu lệnh console tiếp theo trên dòng mới, xóa dấu phẩy ở cuối mỗi dòng và chỉ liệt kê các nhóm của tôi, không có nhóm dịch vụ (ví dụ: --all-namespacestùy chọn bị xóa).


0

Sử dụng lệnh dưới đây để xem tất cả thông tin của một nhóm cụ thể

kubectl get pod <pod name> -n <namespace name> -o yaml

0

Để xem thông tin chi tiết cùng với sơ đồ cấu hình của tất cả các vùng chứa trong một nhóm cụ thể, hãy sử dụng lệnh sau: kubectl describe pod/<pod name> -n <namespace name>

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.