Cara mempermudah analisis log kontena Docker dengan Elastic Stack

Pembalakan adalah komponen penting dalam aplikasi apa pun. Log membolehkan anda menganalisis dan menyelidiki apa yang berlaku dalam kod aplikasi anda seperti cerita. Pembangun perisian menghabiskan sebahagian besar aplikasi pemantauan, penyelesaian masalah dan penyahpepijatan kehidupan seharian mereka, yang kadang-kadang boleh menjadi mimpi buruk. Pembalakan membolehkan pembangun perisian menjadikan proses yang sibuk ini lebih mudah dan lancar.

Sekiranya anda telah menggunakan aplikasi anda dengan platform wadah seperti Docker, anda mungkin biasa dengan log dockeryang membolehkan anda melihat log yang dibuat dalam aplikasi anda berjalan di dalam wadah dok anda. Mengapa kemudian memikirkan Elastic Stack untuk menganalisis log anda? Terdapat dua masalah yang membakar di sini:

  • Bayangkan anda mempunyai puluhan, beratus-ratus, atau bahkan ribuan kontena yang menghasilkan log - SSH masuk ke semua pelayan tersebut dan mengekstrak log tidak akan berfungsi dengan baik.
  • Bekas juga tidak berubah dan tidak ketara, yang bermaksud ia mempunyai jangka hayat yang lebih pendek. Oleh itu, setelah bekas anda hilang dan diganti dengan bekas baru, semua log aplikasi anda yang berkaitan dengan bekas lama akan hilang.

Jadi penyelesaian utama untuk ini adalah dengan membuat komponen pembalakan terpusat untuk mengumpulkan semua log kontena anda ke satu tempat. Di sinilah Elastic Stacks masuk.

Elastic Stack terdiri daripada empat komponen utama:

  • Beats adalah ahli baru yang menjadikan ELK Stack dikenali sebagai Elastic Stack. Beats adalah pengirim data log ringan yang dapat mendorong log ke ELK Stack. Untuk catatan ini saya akan menggunakan Filebeats, ahli keluarga Beats, yang menawarkan cara ringan untuk mengumpulkan dan meneruskan dan memusatkan log dan fail.
  • Logstash adalah komponen yang menggabungkan, memodifikasi, dan memindahkan log dari beberapa lokasi input ke Elasticsearch.
  • Elasticsearch adalahenjin carian dan analitik berasaskan JSON yang diedarkan yang menyimpan dan mengindeks data (catatan log dalam kes ini) dengan cara yang terukur dan terkawal.
  • Kibana adalah UI yang diperkaya untuk menganalisis dan mengakses data dengan mudah di Elasticsearch.

Dalam catatan ini, kita akan melihat bagaimana menggunakan komponen yang disebutkan di atas dan melaksanakan penganalisis log terpusat untuk mengumpulkan dan mengekstrak log dari bekas Docker.

Untuk tujuan artikel ini, saya telah menggunakan dua contoh AWS EC2 t2.small, menjalankan Ubuntu 18.04 yang dipasang dengan Docker dan Docker compose. Instance 1 menjalankan webapp tomcat dan instance 2 menjalankan stack ELK (Elasticsearch, Logstash, Kibana).

Di Linux secara automatik log docker boleh didapati di lokasi ini:

/ var / lib / docker / kontena // gt; -json.log

Semua log pelabuhan akan dikumpulkan melalui Filebeat yang berjalan di dalam mesin hos sebagai bekas. Filebeat akan dipasang pada setiap mesin host docker (kami akan menggunakan fail file docker Filebeat dan unit systemd untuk ini yang akan dijelaskan di bahagian Configuring Filebeat.)

Webapp tomcat kami akan menulis log ke lokasi di atas dengan menggunakan pemandu logging docker lalai. Filebeat kemudian akan mengekstrak log dari lokasi tersebut dan mendorongnya ke arah Logstash.

Perkara penting lain yang perlu diperhatikan ialah selain daripada log yang dihasilkan aplikasi, kami juga memerlukan metadata yang berkaitan dengan bekas, seperti nama kontena, gambar, tag, host dll ... Ini akan membolehkan kami mengenal pasti host dan kontena yang tepat yang dihasilkan oleh log. . Data ini juga dapat dikirim dengan mudah oleh Filebeat bersama dengan entri log aplikasi.

Dengan melakukan implementasi seperti ini, container yang sedang berjalan tidak perlu bimbang tentang driver log, bagaimana log dikumpulkan dan didorong. Filebeat akan menjaga mereka. Ini sering dikenali sebagai prinsip tanggungjawab tunggal.

Mengkonfigurasi Filebeat

Untuk bahagian ini filebeat.yml dan Dockerfile telah diperolehi dari repo github log-Bruneb COSTE-filebeat-docker-logging. Terima kasih atas karya hebatnya. Tetapi kerana saya telah melakukan beberapa perubahan pada filebeat.yml mengikut kehendak artikel ini, saya telah menghoskan mereka yang mempunyai filebeat.service (file systemd) secara berasingan di repo saya sendiri. Anda boleh mengakses repo di sini.

Sebagai langkah awal, anda perlu mengemas kini fail filebeat.yml anda yang mengandungi konfigurasi Filebeat. Diberikan di bawah adalah contoh fail filebeat.yml yang boleh anda gunakan. Perhatikan baris 21, medan output.logstash dan medan hos. Saya telah mengkonfigurasinya ke alamat IP pelayan yang saya jalankan tumpukan ELK saya, tetapi anda boleh mengubahnya jika anda menjalankan Logstash pada pelayan yang berasingan. Secara lalai Logstash sedang mendengar Filebeat di port 5044.

Untuk mengetahui lebih lanjut mengenai parameter konfigurasi Filebeat Docker, lihat di sini.

Selepas itu anda boleh membuat gambar Filebeat Docker anda sendiri dengan menggunakan Dockerfile berikut.

Setelah gambar dibina, anda boleh memasukkannya ke repositori docker anda. Sekarang kerana anda mempunyai kemampuan untuk menjalankan Filebeat sebagai container docker, hanya masalah menjalankan container Filebeat pada host anda yang menjalankan container. Berikut adalah arahan run docker.

docker run -v '/var/lib/docker/containers:/usr/share/dockerlogs/data:ro' -v '/var/run/docker.sock:/var/run/docker.sock' --name filebeat ${YOUR_FILEBEAT_DOCKER_IMAGE}:latest

In the above Docker command, note the two bind mount parameters: /var/lib/docker/containers is the path where docker logs exist within the host machine, and it has been bound to /usr/share/dockerlogs/data path within Filebeat container with read only access. In the second bind mount argument, /var/run/docker.sock is bound into the Filebeat container’s Docker daemon. It is the unix socket the Docker daemon listens on by default and it can be used to communicate with the daemon from within a container. This allows our Filebeat container to obtain Docker metadata and enrich the container log entries along with the metadata and push it to ELK stack.

If you want to automate this process, I have written a Systemd Unit file for managing Filebeat as a service.

Configuring the ELK Stack

Untuk ini saya akan menggunakan contoh EC2 kedua saya, di mana saya menjalankan ELK stack. Anda boleh melakukannya dengan hanya memasang Docker compose dan melihat repo deviantony / docker-elk yang hebat ini dan hanya menjalankan docker-compose up -d

Perhatikan bahawa semua peraturan firewall anda membenarkan lalu lintas masuk ke Logstash, Elasticsearch dan Kibana.

Sebelum menjalankan timbunan ELK, anda perlu memastikan fail logstash.conf anda dikonfigurasi dengan betul untuk mendengar log rentak masuk pada port 5044 dan log dimasukkan dengan betul ke host elasticsearch. Anda juga perlu memastikan untuk menambahkan parameter indeks ke Elasticsearch anda untuk mengenal pasti log yang dihasilkan oleh Filbeat secara unik.

In your docker-elk repo you can find your logstash.conf file by following docker-elk/logstash/pipeline pathname. This is the configuration file for setting up Logstash configurations. You need to update it as follows:

Once you do it, you can access your Kibana dashboard on port 5601 by default as defined on the docker-compose.yml file on deviantony/docker-elk repo.

Under the management tab, you can create an index pattern for Filebeat logs. This has to be done before you can view the logs on Kibana dashboard.

If your containers are pushing logs properly into Elasticsearch via Logstash, and you have successfully created the index pattern, you can go to the Discover tab on the Kibana dashboard and view your Docker container application logs along with Docker metadata under the filebeat* index pattern.

References

  1. //www.elastic.co/guide/en/beats/filebeat/current/filebeat-getting-started.html
  2. //medium.com/@bcoste/powerful-logging-with-docker-filebeat-and-elasticsearch-8ad021aecd87
  3. //www.elastic.co/guide/en/logstash/current/configuration.html
  4. //medium.com/lucjuggery/about-var-run-docker-sock-3bfd276e12fd