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?


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

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 .


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


13

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

kubectl logs -f deployment/app

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


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.



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.


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>

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

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.


-1

Saya menggunakan perintah ini.

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.