کانفیگ کردن ELK و EFK روی داکر

دنبال یه سولوشنی هستی که لاگ گیری رو به صورت self-hosted هندل کنی؟ میخوای لاگ های کانتینر هاتو با ELK به صورت centralized داشته باشی؟ کاری که من سردردشو دارم؟ جای درستی اومدی.

مقدمات

  • این ریپو رو کلون کن.
  • حالا یه `ss -ntl` بزن و مطمئن شد که پورت های زیر ازاد هستن
  • برو توی تنظیمات کرنل و مقدار vm_max_map_count رو زیاد کن (حداقل ۲۶۲۱۴۴ باشه).
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

چند تا مسئله:

  • نام کاربری Elasticsearch اینه: elastic و پسوردش هم changeme هست.
  • اگه کانتینر های kibana و Logstash برای تو هم مثل مال من exit شدن و ارور داشت به ریپوی خودم توی گیت هاب یه سر بزن و اون کلون کن



قسمت ساده تموم شد. حالا میرسیم سر بخش های سخت

حالا فرض کن یه اپ نود.جی‌اسی داری که لاگ هاشو میخوای ship کنی توی ELK خودت و ۳ تا option داری:

  1. کانفیگ کردن filebeat: توی filebeat ما یسری فایل مشخص رو به عنوان سورس در نظر میگیریم. میتونی لاگ ها رو از filebeat بدی به logstash یا مستقیم بدی دست خود elastic (هر چند ما این کارو نمیکنیم، چونکه توی logstash ازادی عمل بیشتری داریم و به راحتی میتونیم بگیم لاگ ها با چه فرمتی به elastic برن).

رفرنس، رفرنس کانفیگ های Elasticsearch







کانفیگ کردن EFK

دنبال یه سولوشنی دیگه هستی که ریسورس کمتری نسبت به 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:
      - &quot/var/lib/docker/containers/*/*.log&quot

processors:
  - add_docker_metadata:
      host: &quotunix:///var/run/docker.sock&quot

  - decode_json_fields:
      fields: [&quotmessage&quot]
      target: &quotjson&quot
      overwrite_keys: true

output.elasticsearch:
  hosts: [&quotelasticsearch:9200&quot]
  indices:
    - index: &quotfilebeat-%{[agent.version]}-%{+yyyy.MM.dd}&quot

logging.json: true
logging.metrics.enabled: false

کلش رو هم میتونی از این ریپو کلون کنی. نکته مهم اینه که یوزر پیشفرض ایمیج filebeat نمیتونه به این فایل دسترسی داشته باشه و ما مجبوریم chown این فایل رو به root تغییر بدیم و اگه تغییر ندی همچین اروری میگیری که اینجا در موردش توضیح داده

Exiting: error loading config file: config file (&quotfilebeat.yml&quot) must be owned by the user identifier (uid=0) or root

البته ممکنه بعد از کامند `sudo chown root filebeat.yml` کارت حل نشه. پس بهتره که کامند زیر رو بزنی:

sudo chmod go-w filebeat.yml

مرحله بعدی اضافه کردن یه index pattern هست:

وب بعدش:

در نهایت هم اینو داری

حال کردی بکوب لایک رو

رفرنس