Cara memiliki beberapa aliran log di buruh pelabuhan

21

Kami memiliki aplikasi yang menulis tiga jenis log menjadi tiga file terpisah: log akses, log aplikasi umum, dan log sistem. Format (dan tujuan) log-log ini sangat berbeda. Dan kami memiliki logforwarder terpisah yang mengirimkannya secara terpisah ke sistem logging terpusat kami.

Berdasarkan memperlakukan log sebagai prinsip aliran acara , kami berpikir tentang pindah dari menggunakan file ke stdout. Meskipun kami mengetahui beberapa manfaat dari pendekatan ini, ini juga berarti bahwa kami akan mendapatkan aliran gabungan dari log yang diformat berbeda, yang perlu kami bagi lagi sebelum kami dapat mengirimkannya ke sistem pusat kami (Kibana / Splunk / etc.), atau di dalam sana.

Kami bertanya-tanya apakah ada alat atau rekomendasi tentang bagaimana kita harus mendekati situasi ini.

SztupY
sumber
4
Saya tidak berpikir itu sepadan. Mengapa bekerja lebih keras untuk menggabungkan dan kemudian memecah aliran log, hanya karena beberapa "prinsip"? File-file itu bagus. File berfungsi. Ini kedengarannya terlalu direkayasa. Saya akan mengatakan mungkin pipa semua log ke syslog, dengan tag yang berbeda, dll. Tetapi saya harus mengatakan, jika seseorang di tim saya menyarankan ini .. Saya akan .. kecewa.
Assaf Lavie
Karena menggunakan file memiliki beberapa jenis mimpi buruk manajemen lainnya, terutama jika mereka dihasilkan dari dalam wadah buruh pelabuhan. Untuk saat ini sepertinya kerugian dari beralih ke stdout lebih besar daripada manfaatnya untuk kasus penggunaan kami, tetapi kami sudah mengalami masalah dengan pendekatan berbasis file kami
SztupY
3
Saya tidak tahu tentang "mimpi buruk". Saya tahu ini adalah cara mereka dilakukan untuk sementara waktu sekarang, dan ada banyak perangkat lunak di luar sana yang membantu Anda melakukan ini. File log diputar, dibaca dengan pos pemeriksaan - file adalah abstraksi yang bagus untuk ini. Saya tidak akan setuju dengan prinsip yang menjual mimpi buruk baru kepada saya karena takut akan pola lama yang sudah dikenal. Catatan log Anda ditulis ke file, atau ditangani dalam memori (setidaknya selama mereka dipindahkan di dalam wadah). Semoga berhasil mencapai keandalan file log dengan splitter & merger stream in-memory.
Assaf Lavie
@ AssafLavie Anda harus menuliskannya dalam jawaban yang dapat di-upvotasikan. IMHO itu sudut pandang yang benar-benar valid.
Dan Cornilescu
2
Saya datang ke sini dengan pertanyaan yang sama. Fakta sederhananya adalah fungsionalitas logging bawaan docker bergantung pada semuanya yang akan stdout / stderr, karenanya driver logging dan ekosistem alat pihak ketiga yang membangun di sekitarnya juga. Saya tergoda untuk membuang semua log saya di volume host juga, tapi saya tahu saya harus terus kembali dan mengelola bahwa ketika kontainer saya pindah ke k8s atau openshift atau gke atau apa pun, sedangkan jika saya mengikuti buruh pelabuhan Jika pendekatan ini jauh lebih lancar. Sementara itu saya akan terus mencari jawaban untuk pertanyaan yang sah ini
Rhubarb

Jawaban:

13

Saya sendiri masih mencari pendekatan penggabungan / pemisahan, tetapi sementara itu pendekatan yang direkomendasikan oleh dokumentasi Kubernetes sepertinya solusi yang baik: Gunakan wadah sespan untuk masing-masing log terpisah Anda .

"Sespan" adalah setiap wadah buruh pelabuhan yang Anda gunakan di samping wadah buruh pelabuhan lain untuk bekerja dengannya dalam beberapa cara. Dalam hal ini untuk masing-masing dari tiga log Anda, Anda akan memiliki wadah terpisah yang memindai atau mengekor log dan output ke stdout.

Dengan cara ini setiap log-sidecar-container Anda memiliki buruh pelabuhan-log dari stdout sendiri. Menjadi terpisah seperti ini, Anda dapat menggunakan praktik buruh pelabuhan standar (dan kubernetes, dll) untuk memisahkan atau menggabungkan. Inilah yang dikatakan halaman Kubernetes:

Pendekatan ini memungkinkan Anda untuk memisahkan beberapa aliran log dari berbagai bagian aplikasi Anda, beberapa di antaranya dapat kurang mendukung penulisan ke stdout atau stderr. Logika di balik pengalihan log minimal, sehingga hampir tidak ada overhead yang signifikan. Selain itu, karena stdout dan stderr ditangani oleh kubelet, Anda dapat menggunakan alat bawaan seperti log kubectl.

"Stream log terpisah" berasal dari penandaan internal yang berlaku bagi buruh pelabuhan untuk log dari wadah yang berbeda, dijelaskan dalam dokumentasi buruh pelabuhan di sini:

Opsi log tag menentukan cara memformat tag yang mengidentifikasi pesan log kontainer. Secara default, sistem menggunakan 12 karakter pertama dari id wadah. Untuk mengganti perilaku ini, tentukan opsi tag

Perkelahian
sumber
Perlu disebutkan kelemahan pendekatan log-sidecar-container ini, kutipan: "Perhatikan, meskipun CPU dan penggunaan memori rendah, menulis log ke file dan kemudian streaming ke stdout dapat menggandakan penggunaan disk". Saya ingin tahu apakah ada yang mencoba pendekatan ini dalam praktik.
yusong
8

Gagasan menggabungkan mereka menjadi satu aliran hanya untuk membaginya nanti terdengar menyakitkan. Saya tidak punya alasan untuk melakukan ini sendiri, tetapi di sinilah saya mulai:

  • Saat Anda menjalankan wadah buruh pelabuhan, buat volume agar mudah dilihat / dikirim log dari host.
  • Gunakan sesuatu seperti remote_syslog2 untuk mengirimkan log ke pengumpul log Anda

Rasanya agak kurang elegan untuk harus melakukan beberapa pengaturan pada host juga, tetapi jika Anda menggunakan sesuatu seperti mungkin di mana Anda dapat menjalankan buku pedoman dan mengaturnya selama Anda menyebarkan ke kotak itu seharusnya tidak terlalu buruk.

bradym
sumber
Solusi ini dapat dikombinasikan dengan pipa bernama, satu-satunya masalah dengan pipa bernama adalah mereka tidak bekerja pada semua sistem saat ini. Mereka tidak bekerja di Mac
Jens