دنبال یه سولوشنی هستی که لاگ گیری رو به صورت self-hosted هندل کنی؟ میخوای لاگ های کانتینر هاتو با ELK به صورت centralized داشته باشی؟ کاری که من سردردشو دارم؟ جای درستی اومدی.
sudu su root; echo 262144 > /proc/sys/vm/max_map_count
یا مستقیم بزن
sudo sysctl -w vm.max_map_count=262144;
حالا وقت ران کردن ELK مون هست. پس توی اون ریپویی که کلون کردی ترمینال رو باز کن و دستور `docker compose up` رو بزن (ممکنه برای تو هم مثل مال من docker compose کار نکنه، یه باگی بوده که فیکس شده ولی تا توی پروژه اصلی بیاد زمان بره)
docker-compose up
چند تا مسئله:
حالا فرض کن یه اپ نود.جیاسی داری که لاگ هاشو میخوای ship کنی توی ELK خودت و ۳ تا option داری:
رفرنس، رفرنس کانفیگ های Elasticsearch
دنبال یه سولوشنی دیگه هستی که ریسورس کمتری نسبت به ELK بخوره. چطوره به جای Logstash از Filebeat استفاده کنی؟ چرا ریسورس زیادی میخوره logstash؟ چونکه JVM میخواد. پس بریم سراغ مراحل:
همونطوری که میبینی داکر به صورت پیشفرض لاگ هاشو با درایور پیشفرضش توی فایل ذخیره میکنه. filebeat هم که یسری فایل بهش میدی و اونم اون فایل ها رو به elasticsearch میده. پس فقط کافیه filebeat رو بگی باید از کجا فایل ها رو برداره.
برای اینکه این EFK رو بیاری بالا یه docker compose فایل لازم داری:
version: "3.7"
services:
elasticsearch:
image: "docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION}"
environment:
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
- "discovery.type=single-node"
ports:
- "9200:9200"
- "9300:9300"
volumes:
- elasticsearch_data:/usr/share/elasticsearch/data
kibana:
image: "docker.elastic.co/kibana/kibana:${ELK_VERSION}"
ports:
- "5601:5601"
filebeat:
image: "docker.elastic.co/beats/filebeat:${ELK_VERSION}"
user: root
volumes:
- ./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
- /var/lib/docker:/var/lib/docker:ro
- /var/run/docker.sock:/var/run/docker.sock
volumes:
elasticsearch_data:
همونطوری که متوجه شدی این filebeat رو باس یجوری کانفیگ کنی: پس ما یه yaml فایل دیگه هم میخوایم تا کانفیگ های filebeat رو توش بنویسیم، پس یه volume رو به صورت Readonly به کانتینر میدیم.
- ./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
حالا وارد بخش بعدی میشیم: filebeat برای اینکه لاگ های داکر رو به elasticsearch بده باید به لاگ های داکر دسترسی داشته باشه، لاگ های کانتینر های داکری معمولا توی مسیر زیر هستن. فکر کنم حالا حکمت دومین volume رو بیشتر فهمیده باشید.
/var/lib/docker/containers
ولی خب پس چرا socket داکر رو با کانتینر به اشتراک گذاشتیم؟ چونکه filebeat ممکنه به اسم ایمیج یا اسم کانتینر نیاز داشته باشه و اینا چیزایی نیستن که توی log فایل ها باشن. در ضمن ما برای kibana نیازی به volume نداریم، چونکه تنظیماتش رو elasticsearch برامون persist میکنه. ولی خود elasticsearch نیاز به volume داره.
حالا بیایید filebeat رو کانفیگ کنیم:
filebeat.inputs: - type: container paths: - "/var/lib/docker/containers/*/*.log" processors: - add_docker_metadata: host: "unix:///var/run/docker.sock" - decode_json_fields: fields: ["message"] target: "json" overwrite_keys: true output.elasticsearch: hosts: ["elasticsearch:9200"] indices: - index: "filebeat-%{[agent.version]}-%{+yyyy.MM.dd}" logging.json: true logging.metrics.enabled: false
کلش رو هم میتونی از این ریپو کلون کنی. نکته مهم اینه که یوزر پیشفرض ایمیج filebeat نمیتونه به این فایل دسترسی داشته باشه و ما مجبوریم chown این فایل رو به root تغییر بدیم و اگه تغییر ندی همچین اروری میگیری که اینجا در موردش توضیح داده
Exiting: error loading config file: config file ("filebeat.yml") must be owned by the user identifier (uid=0) or root
البته ممکنه بعد از کامند `sudo chown root filebeat.yml` کارت حل نشه. پس بهتره که کامند زیر رو بزنی:
sudo chmod go-w filebeat.yml
مرحله بعدی اضافه کردن یه index pattern هست:
وب بعدش:
در نهایت هم اینو داری
حال کردی بکوب لایک رو