Penebangan Terpusat

Pusatkan Logging Docker Anda Dengan Syslog

Cara terbaik untuk memahami sistem kami dan keberhasilan atau kegagalannya adalah melalui logging yang baik

Latar Belakang

Dalam salah satu proyek yang saya kerjakan beberapa tahun terakhir, saya mendapat tugas untuk mengintegrasikan sistem logging terpusat dengan tumpukan aplikasi yang kami gunakan (mengikuti arsitektur layanan mikro). Ide pertama yang terlintas dalam pikiran adalah membangun tumpukan ELK (Elasticsearch, Logstash, Kibana) untuk menyelesaikan tugas ini. Namun, ternyata hal ini bukanlah suatu pilihan karena keterbatasan sumber daya proyek.

Hasilnya, saya menyelidiki semua opsi dan ide yang akan membantu saya menerapkan fitur ini tanpa bertentangan dengan keterbatasan kami. Saya akhirnya mendapatkan ide-ide berikut:

  • Kumpulkan log Docker secara langsung.
  • Menggunakan Syslog untuk mengumpulkan log.

Seperti yang sudah saya katakan, ide pertama adalah membangun tumpukan ELK untuk mengumpulkan kayu gelondongan. Namun, hal tersebut bukanlah suatu pilihan karena keterbatasan anggaran dan sumber daya untuk proyek tersebut.

Ide lainnya adalah meneruskan log ke layanan terkelola seperti logz.io. Opsi ini juga tidak memungkinkan karena server produksi tidak memiliki akses internet—ditambah keterbatasan anggaran yang sama.

Ide ketiga adalah menyiapkan skrip Logrotate yang melakukan tindakan berikut untuk menghasilkan file log:

  • Kumpulkan log Docker dari /var/lib/docker/containers/*.
  • Ganti nama file dengan nama kontainer, bukan id.
  • Kompres file log.

Langkah kedua dari ide ini adalah menyiapkan pekerjaan Cron untuk menyalin file log ke server terpusat tempat log dapat dimuat dan diperiksa.

Ide ini memiliki banyak kelemahan dan lebih seperti menciptakan kembali roda. Salah satu kelemahan yang paling penting adalah log akan hilang jika terjadi penerapan baru dan kontainer diganti.

Itu sebabnya saya mulai mencari solusi alternatif yang akan membantu kami mengumpulkan log dari server ke server terpusat tanpa kehilangan log. Untungnya, Docker mendukung banyak driver log (lihat daftar lengkap). Salah satu driver log ini adalah Syslog, yang secara default diinstal pada sistem Linux (tidak perlu menginstal perangkat lunak tambahan). Untuk alasan ini, saya memutuskan untuk menerapkan sistem logging terpusat dengan Syslog.

Implementasi

Untuk alasan kesederhanaan saja, mari kita asumsikan bahwa infrastruktur yang menghosting layanan mikro terdiri dari node berikut:

  • Kluster Docker dua node yang menghosting layanan tersebut.
  • Satu node untuk menyimpan log.

Catat konfigurasi server

Untuk mengonfigurasi server log dan menyiapkannya untuk mengumpulkan log dari host Docker, saya harus melakukan langkah-langkah berikut:

  • Pastikan Syslog sudah terinstal atau instal menggunakan perintah di bawah ini:
$> yum update -y
$> sudo yum install rsyslog rsyslog-doc
  • Daftar pada port TCP yang benar. Baris di bawah ini harus ada di file konfigurasi Syslog /etc/rsyslog.conf:
$ModLoad imtcp $InputTCPServerRun 514
  • Perbarui konfigurasi batas Nilai Jurnal untuk Syslog dan journald. Konfigurasi di bawah ini harus ditambahkan ke file /etc/rsyslog.conf untuk menghindari kehilangan log jika ada terlalu banyak pesan log. Lihat dokumentasi Syslog untuk informasi lebih lanjut.
$imjournalRatelimitInterval 0
$imjournalRatelimitBurst 0
  • Selain itu, Konfigurasi batas kecepatan perlu disetel ke 0 di file konfigurasijournald /etc/systemd/journald.conf.
RateLimitInterval=0

Secara default, Syslog akan menyimpan semua log di /var/log/messages. Namun, kami ingin memisahkan log berdasarkan nama container untuk memudahkan penyelidikan. Untuk mengonfigurasi server Syslog agar memisahkan log dari kontainer berbeda ke dalam file berbeda, kita perlu melakukan langkah-langkah berikut:

  • Putuskan dan buat folder untuk menyimpan semua log.
$> mkdir /var/log/dockerlfs
  • Kumpulkan log untuk daemon Docker dan simpan ke disk. Aturan konfigurasi Syslog di bawah ini (disimpan di /etc/rsyslog.d/docker_daemon.conf) membuat Syslog menyimpan semua log milik program yang dimulai docker hingga /var/log/dockerlfs/daemon.log.
  • Kumpulkan log kontainer Docker dan simpan ke file log terpisah. Aturan konfigurasi Syslog di bawah ini akan menyimpan log ke dalam file individual untuk setiap container yang berjalan berdasarkan nama container. Aturannya harus disimpan di /etc/rsyslog.d/docker_container.con. Aturan ini mengandalkan host Docker untuk menandai semua log dengan container_name.

Langkah selanjutnya adalah menyiapkan aturan Logrotate untuk merotasi log dan menghindari file log besar di server. Log lama dapat diarsipkan oleh administrator sistem. Aturan di bawah ini akan merotasi log di server setiap hari atau jika ukuran file lebih dari 20MB. Itu juga hanya akan menyimpan 30 file log terakhir untuk setiap kontainer.

Sebagai langkah terakhir untuk konfigurasi server, kita perlu me-restart layanan untuk memastikan bahwa konfigurasi kita dimuat.

$> systemctl restart rsyslog
$> systemctl restart systemd-journald

Konfigurasikan Host Docker

Sekarang setelah kita selesai mengonfigurasi server Syslog, kita dapat melanjutkan dan mulai mengonfigurasi host Docker untuk meneruskan log dari server ke server Syslog.

Hal pertama yang perlu dilakukan adalah mengkonfigurasi ulang daemon Docker untuk menggunakan driver log syslog alih-alih journald dan menandai log dengan nama kontainer. Untuk mencapai tujuan ini, kita perlu memodifikasi file konfigurasi daemon Docker yang terletak di bawah /etc/docker. daemon.json harus mencakup konten berikut:

Variabel SYSLOG_SERVER_IP harus diganti dengan IP server Syslog. Variabel ENV_NAME harus diganti dengan nama lingkungan (pengujian, pementasan, atau produksi). Dengan konfigurasi di atas, Docker akan meneruskan log langsung ke server Syslog. Jika server Syslog sedang down atau tidak ada koneksi yang valid, kami mungkin kehilangan beberapa log dengan konfigurasi di atas.

Untuk meningkatkan sistem logging kami dan menghindari kehilangan log, kami akan melakukan perubahan berikut:

  • Meneruskan log dari Docker ke server lokal.
  • Konfigurasikan Syslog lokal untuk meneruskan log ke server log terpusat.

Untuk meneruskan log dari Docker ke server Syslog lokal, kita hanya perlu menghapus baris berikut dari /etc/docker/daemon.json atau mengganti SYSLOG_SERVER_IP dengan 127.0.0.1:

"syslog-address": "tcp://${SYSLOG_SERVER_IP}:514",

Setelah kita selesai dengan konfigurasi Docker, kita perlu me-restart daemon Docker.

$> systemctl restart docker

Langkah selanjutnya adalah memperbarui konfigurasi Syslog pada node Docker agar dapat menyimpan log Docker secara lokal dan meneruskannya ke server terpusat.

konfigurasi syslog dan journald

Kami memerlukan item konfigurasi berikut untuk journald di file /etc/systemd/journald.conf: RateLimitInterval=0.

Kami memerlukan item konfigurasi berikut untuk Syslog di file /etc/rsyslog.conf:

$ActionQueueFileName fwdRule1
$ActionQueueSaveOnShutdown on
$ActionQueueType LinkedList
$ActionResumeRetryCount -1
$imjournalRatelimitInterval 0
$imjournalRatelimitBurst 0
  • ActionQueueFileName:Menambahkanawalan nama unik untuk file spul.
  • ActionQueueSaveOnShutdown:Simpan pesan ke disk saat dimatikan.
  • ActionQueueType: Jalankan secara asinkron.
  • ActionResumeRetryCount:Sayamencoba ulang tanpa batas jika host sedang down.

Dengan konfigurasi di atas, Syslog akan terus mencoba mengirim log ke server terpusat hingga log ditangkap oleh server tujuan. Namun, hingga saat ini, kami belum mengonfigurasi server Syslog lokal di host Docker untuk meneruskan log ke server lain. Oleh karena itu, semua log yang dikumpulkan dari Docker akan disimpan dalam file default /var/log/messages.

Meneruskan log dari Syslog ke server lain sangat sederhana. Anda hanya perlu menambahkan aturan berikut di akhir file /etc/rsyslog.conf dan mengganti SYSLOG_SERVER_IP dengan IP server log yang valid. Aturan ini pada dasarnya memeriksa semua log dan memfilternya berdasarkan tag dan nama program. Jika tag pesan berisi tag bernama container_name atau programname, mulailah dengan docker. Kemudian ia akan meneruskan log ke SYSLOG_SERVER_IP.

Kita dapat memperbaiki aturan di atas dengan menyimpan salinan log secara lokal di server Docker. Dengan perubahan di bawah ini, aturan Syslog kami akan mengirimkan log ke server Syslog jarak jauh dan akan menyimpan salinan file log secara lokal di masing-masing server yang menjalankan Docker di bawah /var/log/dockerlfs.

Karena kita sekarang memiliki salinan file log di server Docker, masuk akal untuk menambahkan aturan Logrotate untuk memutar file ini juga. Kita dapat menggunakan aturan yang sama dengan yang digunakan untuk node server.

Terakhir, diperlukan restart untuk Syslog dan journald untuk mengambil konfigurasi baru.

$> systemctl restart rsyslog
$> systemctl restart systemd-journald

Kesimpulan

Sistem dan tumpukan logging terpusat dapat diterapkan dengan berbagai metode dan alat. Syslog adalah salah satu metode ini—dan ini sangat berguna ketika ada beberapa keterbatasan pada lingkungan yang berjalan dan kurangnya pengalaman dalam mengelola dan menjalankan tumpukan yang lebih canggih seperti ELK.