Menjalankan kubectl logs
menunjukkan 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?
Menjalankan kubectl logs
menunjukkan 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?
Jawaban:
Anda bisa menggunakan label
kubectl logs -l app=elasticsearch
--all-namespaces
.
-f
sekarang (mulai Kubernetes 1.12+ / kubectl
1.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.
Saya telah membuat skrip bash kecil yang disebut kubetail
yang memungkinkan hal ini. Misalnya, untuk mengikuti semua log untuk pod bernama "app1", Anda dapat melakukan:
kubetail app1
Anda dapat menemukan skripnya di sini .
brew tap johanhaleby/kubetail && brew install kubetail --with-short-names
dokumentasi mendetail: kt -h
Luar biasa!
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
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/
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
Penggunaan: log_deployment.sh "nama-penerapan".
Kemudian skrip akan menampilkan log dari semua pod yang dimulai dengan "nama-penerapan" itu.
Salah satu opsinya adalah menyiapkan pencatatan cluster melalui Fluentd / ElasticSearch seperti yang dijelaskan di https://kubernetes.io/docs/user-guide/logging/elasticsearch/ . Setelah log berada di ES, mudah untuk menerapkan filter di Kibana untuk melihat log dari penampung tertentu.
Anda bisa mendapatkan bantuan dari kubectl logs -h
dan sesuai infonya,
kubectl logs -f deployment/myapp -c myapp --tail 100
-c
adalah nama penampung dan --tail
akan 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 -l
dan menentukan label, tetapi pada saat yang sama -f
tidak akan digunakan.
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>
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
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.
Saya menggunakan perintah ini.
kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
Tidak yakin apakah ini hal baru, tetapi dengan penerapan dimungkinkan untuk melakukannya seperti ini:
kubectl logs deployment/app1