Bagaimana cara mendapatkan log dari semua pod dari pengontrol replikasi Kubernetes?

123

Menjalankan kubectl logsmenunjukkan kepada saya stderr / stdout dari satu container Kubernetes.

Bagaimana saya bisa mendapatkan stderr / stdout gabungan dari satu set pod, sebaiknya yang dibuat oleh pengontrol replikasi tertentu?

Torsten Bronger
sumber
Perlu diingat bahwa tidak menyetel argumen tail saat menggunakan selector akan membuat default setiap pod log menjadi 10 baris panjang
chachan

Jawaban:

175

Anda bisa menggunakan label

kubectl logs -l app=elasticsearch
Adrian Ng
sumber
21
Solusi bagus dan kemungkinan besar cukup untuk menjawab pertanyaan awal tetapi tidak akan menghasilkan: "kesalahan: hanya satu dari ikuti (-f) atau pemilih (-l) yang diizinkan".
Nestor Urquiza
3
Juga tidak --all-namespaces.
Eric Walker
Apa urutan log tersebut? Maksud saya, jika ada beberapa pod dan setiap pod akan memiliki lognya sendiri. Jadi jika log dari semua ditampilkan, lalu dalam urutan apa mereka akan ditampilkan dan bagaimana cara mengidentifikasi pod sumber dari baris log tertentu?
Shubham
6
Sepertinya ini berfungsi dengan -fsekarang (mulai Kubernetes 1.12+ / kubectl1.12+). Juga @Shubham - ini menampilkan pesan dalam urutan yang diterima, tidak ada tag atau apapun di baris log. Ini hanya untuk debugging cepat. Jika Anda membutuhkan lebih banyak detail log, Anda harus mengirimkan log Anda ke sistem logging pusat seperti EFK, SumoLogic, Datadog, dll.
Geerlingguy
1
Apakah ada cara untuk melakukan hal yang sama menggunakan dasbor kubernetes.
mchawre
70

Saya telah membuat skrip bash kecil yang disebut kubetailyang memungkinkan hal ini. Misalnya, untuk mengikuti semua log untuk pod bernama "app1", Anda dapat melakukan:

kubetail app1

Anda dapat menemukan skripnya di sini .

Johan
sumber
Dipasang dengan: brew tap johanhaleby/kubetail && brew install kubetail --with-short-namesdokumentasi mendetail: kt -hLuar biasa!
Khalil Gharbaoui
Mengagumkan. Saya punya beberapa pertanyaan. `` 1. Bisakah kita mengikuti log dari beberapa pod yang termasuk dalam penerapan berbeda? Sesuatu seperti "kt -l app = service1, app = service2" 2. Bagaimana cara menulis semuanya ke sebuah file? Melakukan ini "kt -l app = service1` >> filename.log" hanya menulis nama pod padanya. 3. Apakah itu juga ekor dalam kasus penerapan penskalaan otomatis? ``
Vasudev
19

Anda bisa mendapatkan log dari beberapa kontainer menggunakan label seperti yang disarankan Adrian Ng:

kubectl logs --selector app=yourappname

Jika Anda memiliki pod dengan banyak container, perintah di atas akan gagal dan Anda harus menentukan nama container:

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

Catatan: Jika Anda ingin melihat label mana yang tersedia untuk Anda, perintah berikut akan mencantumkan semuanya:

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

... di mana hasilnya akan terlihat seperti ini

map [app: yourappname controller-revision-hash: 598302898 pod-template-generation: 1]

Perhatikan bahwa beberapa label mungkin tidak dibagikan oleh pod lain - memilih "app" sepertinya yang paling mudah

Jean Spector
sumber
13

Untuk membangun jawaban sebelumnya jika Anda menambahkan -fAnda dapat mengikuti log.

kubectl logs -f deployment/app
Ruben
sumber
10

Solusi yang diberikan sebelumnya tidak begitu optimal. Tim kubernetes sendiri sudah memberikan solusi beberapa waktu yang lalu yaitu stern.

stern app1

Ini juga cocok dengan ekspresi reguler dan melakukan tail dan -f (follow) secara default. Manfaat yang bagus adalah, ini menunjukkan kepada Anda pod yang menghasilkan log juga.

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

Ambil go-binary untuk linux atau instal via brew untuk OSX.

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

https://github.com/wercker/stern

vienna
sumber
6

Saya menggunakan skrip sederhana ini untuk mendapatkan log dari pod penerapan:

#!/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

Inti dari skrip

Penggunaan: log_deployment.sh "nama-penerapan".

Kemudian skrip akan menampilkan log dari semua pod yang dimulai dengan "nama-penerapan" itu.

Martlark
sumber
4

Anda bisa mendapatkan bantuan dari kubectl logs -hdan sesuai infonya,

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

-cadalah nama penampung dan --tailakan menampilkan baris nomor terbaru , tetapi ini akan memilih satu pod dari penerapan, tidak semua pod. Ini adalah sesuatu yang harus Anda ingat.

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

Jika Anda ingin menampilkan log dari semua pod, Anda dapat menggunakan -ldan menentukan label, tetapi pada saat yang sama -ftidak akan digunakan.

zimmer
sumber
3

Anda juga dapat melakukan ini dengan nama layanan.

Pertama, coba temukan nama layanan dari masing-masing pod yang sesuai dengan beberapa pod dari layanan yang sama. kubectl get svc.

Selanjutnya, jalankan perintah berikut untuk menampilkan log dari setiap penampung.

kubectl logs -f service/<service-name>
Harshit
sumber
2

Dalam contoh ini, Anda bisa mengganti <namespace>dan <app-name>untuk mendapatkan log ketika ada beberapa Container yang ditentukan dalam sebuah Pod.

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

Jika pod diberi nama secara bermakna, seseorang dapat menggunakan Plain Old Bash sederhana:

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

Penjelasan: Perulangan melalui pod yang berjalan dengan nama yang mengandung "nodejs". Ekor log untuk masing-masing pod secara paralel (simbol ampersand tunggal berjalan di latar belakang) untuk memastikan bahwa jika ada pod yang gagal, seluruh perintah akan keluar (ampersand ganda). Cat aliran dari setiap perintah ekor menjadi aliran yang unik. Evaluasi diperlukan untuk menjalankan perintah yang dibuat secara dinamis ini.

Nestor Urquiza
sumber
-1

Saya menggunakan perintah ini.

kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
Muhammad Naeem
sumber
1
Halo! Meskipun perintah itu dapat menyelesaikan pertanyaan, termasuk penjelasan tentang bagaimana dan mengapa ini menyelesaikan masalah akan sangat membantu meningkatkan kualitas posting Anda, dan mungkin menghasilkan lebih banyak suara. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, bukan hanya orang yang bertanya sekarang. Harap edit jawaban Anda untuk menambahkan penjelasan dan memberikan indikasi batasan dan asumsi apa yang berlaku.
Brian
-4

Tidak yakin apakah ini hal baru, tetapi dengan penerapan dimungkinkan untuk melakukannya seperti ini:

kubectl logs deployment/app1
Rasmus Rømer
sumber
8
Saat Anda mendapatkan log melalui penerapan, ia memilih salah satu pod yang direplikasi (memilih secara acak) tetapi tidak semuanya.
Akhil Bojedla
Downvoting karena ini hanya memilih satu pod
Maximilian