Làm cách nào để có được nhật ký từ tất cả các nhóm của bộ điều khiển sao chép Kubernetes?


123

Chạy kubectl logscho tôi thấy stderr / stdout của một container Kubernetes.

Làm cách nào tôi có thể nhận được thiết bị xuất chuẩn / thiết bị xuất chuẩn của một nhóm các nhóm, tốt nhất là các nhóm được tạo bởi một bộ điều khiển sao chép nhất định?


lưu ý rằng việc không thiết lập đối số đuôi khi sử dụng bộ chọn sẽ mặc định mỗi nhật ký nhóm có độ dài 10 dòng
chachan

Câu trả lời:


175

Bạn có thể sử dụng nhãn

kubectl logs -l app=elasticsearch

21
Giải pháp tốt và rất có thể đủ để trả lời câu hỏi ban đầu nhưng nó sẽ không có đuôi: "lỗi: chỉ một trong số những người theo dõi (-f) hoặc bộ chọn (-l) được cho phép".
Nestor Urquiza

3
Ngoài ra, không --all-namespaces.
Eric Walker

Thứ tự của những bản ghi đó là gì? Ý tôi là nếu có nhiều nhóm và mỗi nhóm sẽ có nhật ký riêng. Vì vậy, nếu các bản ghi từ tất cả được hiển thị, thì chúng sẽ được hiển thị theo thứ tự nào và làm cách nào để xác định một nhóm nguồn của một dòng nhật ký cụ thể?
Shubham

6
Có vẻ như điều này hoạt động với -fbây giờ (kể từ Kubernetes 1.12+ / kubectl1.12+). Ngoài ra @Shubham - nó hiển thị các thông báo theo thứ tự nhận được, không có thẻ hoặc bất cứ điều gì trên các dòng nhật ký. Đây chỉ là để gỡ lỗi nhanh chóng. Nếu bạn cần thêm chi tiết nhật ký, bạn sẽ cần gửi nhật ký của mình đến một hệ thống ghi nhật ký trung tâm như EFK, SumoLogic, Datadog, v.v.
ge Muffguy

1
Có cách nào để làm tương tự bằng bảng điều khiển kubernetes.
mchawre

69

Tôi đã tạo một tập lệnh bash nhỏ được gọi là kubetaillàm cho điều này có thể. Ví dụ: để theo dõi tất cả các bản ghi cho các nhóm có tên "app1" bạn có thể làm:

kubetail app1

Bạn có thể tìm thấy kịch bản ở đây .


Cài đặt nó với: brew tap johanhaleby/kubetail && brew install kubetail --with-short-namestài liệu chi tiết: kt -hTuyệt vời!
Khalil Gharbaoui

Tuyệt vời. Tôi có một vài câu hỏi. `` `1. Chúng ta có thể theo dõi nhật ký của nhiều nhóm thuộc các triển khai khác nhau không? Một cái gì đó như "kt -l app = service1, app = service2" 2. Làm cách nào để tôi viết tất cả vào một tệp? Làm điều này "kt -l app = service1` >> filename.log" chỉ ghi tên nhóm vào nó. 3. Nó cũng có đuôi trong trường hợp triển khai tự động hóa? `` `
Vasudev

18

Bạn có thể lấy nhật ký từ nhiều container bằng cách sử dụng nhãn như Adrian Ng đề xuất:

kubectl logs --selector app=yourappname

Trong trường hợp bạn có một nhóm có nhiều vùng chứa, lệnh trên sẽ thất bại và bạn sẽ cần chỉ định tên vùng chứa:

kubectl logs --selector app=yourappname --container yourcontainername

Lưu ý: Nếu bạn muốn xem nhãn nào có sẵn cho bạn, lệnh sau sẽ liệt kê tất cả:

kubectl get pod <one of your pods> -o template --template='{{.metadata.labels}}'

... nơi đầu ra sẽ trông giống như

map [app: yourappname controller-revision-hash: 598302898 pod-template-tạo: 1]

Lưu ý rằng một số nhãn có thể không được chia sẻ bởi các nhóm khác - chọn "ứng dụng" có vẻ như là nhãn dễ nhất


13

Để xây dựng câu trả lời trước nếu bạn thêm, -fbạn có thể theo dõi nhật ký.

kubectl logs -f deployment/app

10

Các giải pháp được cung cấp trước đây không phải là tối ưu. Nhóm kubernetes đã cung cấp một giải pháp trước đây, được gọi là nghiêm khắc.

stern app1

Nó cũng phù hợp với các biểu thức thông thường và theo đuôi và -f (theo) theo mặc định. Một lợi ích tốt là, nó cũng cho bạn thấy nhóm tạo ra nhật ký.

app1-12381266dad-3233c foobar log
app1-99348234asd-959cc foobar log2

Lấy go-binary cho linux hoặc cài đặt qua brew cho OSX.

https://kubernetes.io/blog/2016/10/tail-kubernetes-with-stern/

https://github.com/wercker/stern


6

Tôi sử dụng tập lệnh đơn giản này để lấy nhật ký từ các nhóm triển khai:

#!/usr/bin/env bash

DEPLOYMENT=$1

for p in $(kubectl get pods | grep ^${DEPLOYMENT}- | cut -f 1 -d ' '); do 
    echo --------------------------- 
    echo $p 
    echo --------------------------- 
    kubectl logs $p
done

Ý chính của kịch bản

Cách sử dụng: log_deployment.sh "tên triển khai".

Script sau đó sẽ hiển thị nhật ký của tất cả các nhóm bắt đầu bằng "tên triển khai" đó.



4

Bạn có thể nhận trợ giúp từ kubectl logs -hvà theo thông tin,

kubectl logs -f deployment/myapp -c myapp --tail 100

-clà tên container và --tailsẽ hiển thị các dòng num mới nhất , nhưng điều này sẽ chọn một nhóm triển khai, không phải tất cả các nhóm. Đây là điều bạn phải ghi nhớ.

kubectl logs -l app=myapp -c myapp --tail 100

Nếu bạn muốn hiển thị nhật ký của tất cả các nhóm, bạn có thể sử dụng -lvà chỉ định một lable, nhưng đồng thời -fsẽ không được sử dụng.


3

Bạn cũng có thể làm điều này bằng tên dịch vụ.

Trước tiên, hãy thử tìm tên dịch vụ của nhóm tương ứng tương ứng với nhiều nhóm của cùng một dịch vụ. kubectl get svc.

Tiếp theo, chạy lệnh sau để hiển thị nhật ký từ mỗi container.

kubectl logs -f service/<service-name>

2

Trong ví dụ này, bạn có thể thay thế <namespace><app-name>để lấy nhật ký khi có nhiều Container được xác định trong Pod.

kubectl -n <namespace> logs -f deployment/<app-name>
--all-containers=true --since=10m

1

Nếu các nhóm được đặt tên một cách có ý nghĩa, người ta có thể sử dụng Plain Old Bash đơn giản:

keyword=nodejs
command="cat <("
for line in $(kubectl get pods | \
  grep $keyword | grep Running | awk '{print $1}'); do 
    command="$command (kubectl logs --tail=2 -f $line &) && "
  done
command="$command echo)"
eval $command

Giải thích: Lặp qua các pod đang chạy với tên chứa "nodejs". Đuôi song song nhật ký cho từng cái trong số chúng (các ký hiệu đơn và chạy ở chế độ nền) đảm bảo rằng nếu bất kỳ nhóm nào bị lỗi thì toàn bộ lệnh sẽ thoát (ký hiệu gấp đôi). Cat các luồng từ mỗi lệnh đuôi thành một luồng duy nhất. Eval là cần thiết để chạy lệnh được xây dựng động này.


-1

Tôi sử dụng lệnh này.

kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m

1
Xin chào! Mặc dù lệnh đó có thể giải quyết câu hỏi, bao gồm giải thích về cách thức và lý do giải quyết vấn đề này thực sự sẽ giúp cải thiện chất lượng bài đăng của bạn và có thể dẫn đến nhiều lượt bình chọn hơn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, không chỉ người hỏi bây giờ. Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những hạn chế và giả định được áp dụng.
Brian

-4

Không chắc đây có phải là một điều mới không, nhưng với việc triển khai, có thể làm như thế này:

kubectl logs deployment/app1

8
Khi bạn nhận được các bản ghi bằng cách triển khai, nó sẽ chọn bất kỳ một nhóm nào được sao chép (chọn ngẫu nhiên) nhưng không phải tất cả chúng.
Akhil Bojedla

Bỏ phiếu vì điều này chỉ chọn một nhóm
Maximilian
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.