سلام تو این پست میخواهیم در مورد مانیتورینگ باهم صحبت کنیم. مانیتورینگ و لاگینگ چشم و گوش ما برای دیدن سرورها و سرویسهای خودمون هستند. اگر به این موارد به خوبی دقت نکنیم همواره با مشکلاتی روبهرو خواهیم بود که تشخیص آنها برای ما خیلی سخت و دشوار خواهد بود.
همواره سرویسها و سرورها یک سری متریک و لاگ ایجاد میکنند که ما با جمعآوری و نگهداری آنها تحلیلهای خوبی بر روی وضعیت سرویس خود خواهیم داشت.
قبلا در نظرسنجی سال ۹۹ سایت داکرمی ازتون پرسیده بودم که کدام سناریوهای داکر رو دوست دارید که پیادهسازی کنم و مانیتورینگ و لاگینگ رتبهی ۵ را بدست آورده بود. از این رو در این پست سناریوی مانیتورینگ و در پست دیگری سناریوی لاگینگ رو خدمتتون توضیح خواهم داد.
سرویسی که برای این منظور در نظر گرفتم مجموعهی به شدت قدرتمند و در عین حال سادهای میباشد که پیادهسازی ابتدایی آن بسیار راحت است و این قابلیت را دارد که در سایزهای بزرگ و با پیچیدگیهای زیاد هم پیادهسازی و اجرا شود. این مجموعه شامل موارد زیر میباشد:
- سرویس Prometheus: برای مانیتورینگ و جمعآوری متریکها استفاده میشود.
- سرویس Alertmanager: برای ایجاد اعلانها و اطلاعرسانی آنها استفاده میشود.
- سرویس Grafana: برای Visualize کردن متریکها و لاگها میباشد. برامون گرافهای خیلی خوبی میکشد.
- سرویس CAdvisor: برای مانیتورینگ و گزارش متریکهای کانتینرها میباشد.
- سرویس Node-Exporter: برای مانیتورینگ و گزارش متریکهای سیستمعامل لینوکس کاربرد دارد. برای سیستمعامل ویندوز هم exporter به نام Wmi-Exporter وجود دارد.
- سرویس Traefik: به عنوان reverse proxy برای ایجاد دسترسی وب به سرویسهای مانیتورینگ لازم است.
حالا همه کامپوننتها رو معرفی کردیم و در ادامه با ارائه یک تصویر، نحوهی ارتباط آنها با یکدیگر را بررسی کرده و بعد از یه توضیح چند خطی در مورد هر کدام، به پیادهسازی میپردازیم.
نحوهی کار سرویس مانیتورینگ:
در تصویر بالا مشخص است که قسمت اصلی و مرکزی Prometheus server میباشد که تمام متریکها از طریق Exporterها آماده میشود و خود Prometheus server آنها را Pull میکند. اگر جایی محدودیتی وجود داشته باشد و نیاز باشد که حتما متریکها توسط exporterها push شود از ابزاری به نام pushgateway استفاده میشود که exporterها به آن سرویس push میکنند و بعد خود سرور prometheus مجدد از سرور pushgateway آنها را pull میکند.
سرویس prometheus انواع روشهای کانفیگ را دارد که بنا به استفادهی شما، میتوان یکی از آن روشها را انتخاب و از آن استفاده کرد. میتوان تمام موارد را در کانفیگ فایلها نوشت یا از قابلیت service discovery آن استفاده کرد و هر زمان که نود با مشخصات مورد نظر وارد شد به صورت خودکار وارد فرآیند مانیتورینگ شود و متریکهای آن ارسال، ذخیره و نمایش داده شود.
یکی از موارد دیگه که در prometheus کانفیگ میشود ruleهای مربوط به alerting میباشد که با استفاده از آنها مشخص میکند که اگر چه شرایطی پیش آمد یک alert ایجاد شود. مثلا اگر رم سرور بیشتر از ۸۰ درصد پر شد به من خبر بده یا اینکه اگر لود سرور بیشتر از ۷۰ درصد شد به من خبر بده. این موارد تماما در فایلهایی به صورت rule آماده میشود و در کانفیگ مربوط به prometheus میباشد.
این موارد به سمت alertmanager ارسال میشود. این ابزار با استفاده از قابلیتی که دارد میتواند به ابزارهای مختلف متصل شود و از طریق آنها به ما خبر دهد و Alert را ارسال کند. از متداولترین ابزارهایی که برای اطلاعرسانی استفاده میشود میتوان به ایمیل، slack، rocketchat و sms اشاره کرد.
یک قسمت مهم دیگه که برای هر ابزار مانیتورینگی لازم است کشیدن داشبورد و گرافهای مربوط به مانیتورینگ میباشد. برای این منظور از ابزار قدرتمند grafana استفاده میشود که کنار prometheus راهاندازی میشود و به آن متصل شده و از روی datastore آن گرافهای عالی و خوبی برای ما میکشد. یکی از مزایای خوب grafana اینه که داشبوردهای آماده خیلی زیاد دارد؛ از این رو میتوانیم با import کردن آنها به راحتی داشبورد داشته باشیم و دیگه نیاز نیست به ازای هر متریک، خودمون داشبورد آماده کنیم.
راهاندازی سرویس مانیتورینگ:
برای راهاندازی این سرویس تمام کامپوننتهایی که بالاتر توضیح دادیم را لازم است که راهاندازی کنیم. از این رو یک کامپوز فایل آماده میکنیم که تمام این موارد داخل آن نوشته شده باشد.
قبلا در اینجا در مورد کامپوزفایل و نحوهی نوشتن آن صحبت کردیم که میتوانید آن را بررسی کنید.
کامپوزفایل به همراه کانفیگفایلهای مورد نیاز را از اینجا همانند دستور زیر دریافت کنید.
git clone https://gitlab.com/scenario1/docker/monitoring.git
پس از دریافت، وارد دایرکتوری monitoring شده و کانفیگها رو بررسی کنید. برای شروع لازم است این اقدامات را انجام دهید. به جای کلمهی DOMAIN داخل کامپوز فایل domain مخصوص خود را قرار دهید که بعد از اعمال آن شما بعد از راهاندازی سرویس این دامنهها را خواهید داشت.
- prometheus.DOMAIN: prometheus dashboard
- web.DOMAIN: traefik2 dashboard
- alert.DOMAIN: alertmanager dashboard
- grafana.DOMAIN: grafana dashboard
برای کانفیگ alerting برای ارسال ایمیل لازم است که شما فایل config.yml داخل دایرکتوری alertmanager را کانفیگ کنید. داخل آن فایل، اطلاعات مربوط به email خود را برای دریافت ایمیل و اطلاعات کامل یک mailbox شامل یوزر و پسورد و smtp server آن را برای ارسال ایمیلها میبایست تغییر دهید.
بعد از اعمال این تغییرات با دستور زیر فایل کامپوز را تست کنید که مشکل نداشته باشد. در صورتی که بدون مشکل بود با دستور بعدی کل سرویسها را راهاندازی کنید.
docker-compose config
docker-compose up -d
با استفاده از دستور زیر بررسی کنید که تمام سرویسهای داخل کامپوزفایل بدون مشکل راهاندازی شده است یا خیر و بعد از آن، لاگ مربوط به سرویسها را برای اطمینان از صحت عملکرد آنها بررسی کنید.
docker-compose ps
docker-compose logs -f --tail 100
همانطور که در تصویر بالا مشاهده میکنید تنها پورتی که از این کلاستر به بیرون publish شده است پورت ۸۰ میباشد که مربوط به سرویس traefik بوده و تمام سرویسهای دیگه داخل شبکهی داکر باهم صحبت میکنند و نیازی نیست که پورتی از آنها publish شود و اگر سرویسی بیرون از شبکهی داکر بخواهد به آن وصل شود میتواند از طریق وب به این سرویسها متصل شود.
یک نکتهی مهم دیگه اینکه سرویس مانیتورینگ و کل استک آن میبایست در شبکهی داخلی شما و پشت فایروالهای شما در دسترس باشند. هیچگاه نباید آنها به صورت public در دسترس باشد و اگر مجبور بودید این کار رو انجام بدید حتما میبایست authentication برای آنها در نظر بگیرید و بهتر است که از طریق فایروال دسترسی به آنها را محدود کنید.
کانفیگ ابتدایی سرویس مانیتورینگ:
بعد از راهاندازی صحیح سرویسهای مانیتورینگ ابتدا بررسی کنید که داشبورد traefik در اختیار شما باشد. داخل آن میتوانید سرویسهایی که راهاندازی شده و صفحهی وب دارند را بررسی کنید. توضیحات مربوط به این سرویس بعدا در سناریوی وبسرویسها توضیح داده میشود. اینجا به همین جمله اکتفا میکنیم که این سرویس تمام وبهای مد نظر ما را در اختیار ما قرار میدهد.
سپس داشبورد مربوط به prometheus را باز میکنیم و از منوی status زیر-منوی targets را باز میکنیم. همانند تصویر زیر میبایست تمام تارگتها را ببینیم و اینکه ارتباط بین آنها با prometheus برقرار باشد. یعنی اینکه prometheus بتواند متریکهای آنها را به درستی دریافت کند.
بعد از این مرحله که از صحت راهاندازی prometheus اطمینان پیدا کردیم، سراغ کانفیگ مربوط به grafana خواهیم رفت.
ابتدا داخل grafana با یوزر و پسورد admin لاگین میکنیم. این یوزر و پسورد دیفالت هنگام اولین راهاندازی میباشد. حتما بعد از لاگین در پنجرهای همانند تصویر زیر که برای شما باز میشود پسورد جدید را برای آن وارد کنید که پسورد پیشفرض عوض شود.
بعد از لاگین در grafana میبایست آن را کانفیگ کنیم تا داشبوردهای مربوط به مانیتورینگ خود را مشاهده کنیم.
اضافه کردن data source مربوط به prometheus:
برای این کار از منوی سمت چپ روی setting کلیک کرده و از آنجا data sources را انتخاب کنید. اگر بار اول grafana را باز میکنید در صفحهی home قسمت add data source را انتخاب کنید.
بر روی Add data source کلیک کنید و سپس از منویی که جلوی شما باز میشود گزینهی prometheus را انتخاب کنید و سپس کانفیگ زیر را برای آن انجام دهید. در انتها بعد از کلیک بر روی گزینهی Save & Test از صحت عملکرد خود اطمینان حاصل کنید.
دقت کنید که حتما Data source is working را دریافت کنید. این پیغام به شما نشان میدهد که دیتا سورس به درستی اضافه شده است.
در پنجرهی کناری داشبوردهای مربوط به این دیتاسورس را نمایش میدهد که میتوانید روی آنها کلیک کنید تا به grafana شما اضافه شوند.
اضافه کردن dashbord مربوط به cadvisor و node-exporter:
برای اینکه این داشبوردها رو پیدا کنید میبایست در سایت grafana جستجو کنید و آنها را پیدا کنید. برای اینکه کار شما راحتتر باشه این داشبوردها را در دایرکتوری به نام grafana-dashboard قرار دادم و باهم آنها را داخل grafana اضافه میکنیم.
از منوی بالا روی داشبورد کلیک کرده و از آنجا روی گزینهی import dashboard کلیک کرده و json مربوط به داشبورد خود را آنجا معرفی کنید.
بعد از اضافه کردن این دو تا داشبورد میتوانید از منوی داشبوردها آنها را ببینید.
میتونید تو داشبورد alertmanager هم سرویسهایی که الان alert برای آنها ایجاد شده است را مشاهده کنید و اقدامات لازم را روی آنها انجام دهید.
خوب دیگه الان مانیتورینگ ما کامل شده و شما میتوانید سرویسها و سرورهای خودتون رو بهش اضافه کنید. این سادهترین روشی بود که میشد مانیتورینگ را پیادهسازی و استفاده کرد. این سامانه بسیار قدرتمند بوده و شما میتوانید از انواع سرویسهای نرمافزاری تا سختافزارهای مختلف را با آن مانیتور کنید و در مواقع لزوم هم از آلرتینگ آن نهایت استفاده را داشته باشید.
راهاندازی مانیتورینگ و لاگینگ باهم:
دوستان عزیز اگر خواستید که مانیتورینگ و لاگینگ را باهم در یک کامپوز راهاندازی کنید از پروژهی زیر استفاده کنید که ترکیب این دو تا پروژه با یکدیگر می باشد.
git clone git@gitlab.com:scenario1/docker/monlog.git