حالا که با Traefik آشنا شدیم، توی این مقاله میخوام در مورد یکی از قابلیتهای جذاب و پرکاربردش به اسم "کشف خودکار سرویسها" (Automatic Service Discovery) صحبت کنم. این ویژگی باعث میشه سرویسها و کانتینرهای جدید بهصورت خودکار توسط Traefik شناسایی بشن و نیازی به کانفیگ دستی نداشته باشیم.
فرض کن داری تو محیطی مثل Docker یا Kubernetes کار میکنی که پر از سرویسها و کانتینرهای مختلفه. این سرویسها ممکنه خیلی داینامیک باشن؛ یعنی هر لحظه بالا بیان یا از بین برن. اگر بخوای هر بار که سرویس جدیدی راه افتاد یا متوقف شد، تنظیمات رو بهصورت دستی تغییر بدی، عملاً از کار و زندگی میافتی! اینجاست که قابلیت کشف خودکار سرویسهای Traefik به دادمون میرسه. این ویژگی به Traefik این توانایی رو میده که خودش سرویسهای جدید رو کشف کنه و بر اساس تنظیماتی که براش تعریف کردی، بهطور خودکار ترافیک رو به اونها هدایت کنه.
تو Traefik دو روش برای کانفیگ کردن وجود داره: داینامیک و استاتیک
روش داینامیک همین لیبل هایی که توی داکر تعریف میشه یا anotation های کوبرنتیز رو میگن.
روش استاتیک کانفیگ هایی که توی فایل کانفیگ خود traefik مینویسیم یا توی cli وارد میکنیم یا متغیر هایی که تو فایل env میزاریم.
تو Traefik هر سرویسی که بخواد شناسایی بشه، باید از طریق label (توی Docker) یا annotation (توی Kubernetes) معرفی بشه. این لیبل ها به Traefik میگن که چطور و از کجا باید ترافیک رو به سرویس مربوطه هدایت کنه.
اما جالبترین بخش ماجرا اینجاست که این پروسه کاملاً داینامیکه. مثلاً وقتی یه سرویس جدید میاد بالا، Traefik به کمک سیستم کشف خودکار سرویسها، اون رو شناسایی میکنه و ترافیک رو بهطور خودکار به سمتش هدایت میکنه، بدون اینکه لازم باشه دست به تنظیمات بزنی. برعکس، وقتی سرویس از کار میافته یا متوقف میشه، Traefik هم ترافیک رو به اون سرویس هدایت نمیکنه.
حالا بریم ببینیم این فرایند دقیقا چطور اتفاق میافته و under the hood چه خبره؟
وقتی Traefik به یه سیستم مدیریت کانتینر مثل Docker یا Kubernetes متصل میشه، به APIهای اونها گوش میده. مثلاً تو Docker، Traefik به Docker Daemon متصل میشه و وقتی کانتینر جدیدی راهاندازی میشه یا سرویس جدیدی بالا میاد، این تغییرات رو از طریق Docker Events دریافت میکنه. به همین ترتیب، وقتی سرویسی از کار میافته یا حذف میشه، Traefik از این تغییرات هم مطلع میشه و تنظیمات خودش رو آپدیت میکنه.
این یعنی هر تغییری تو سیستم Docker یا Kubernetes فوراً توسط Traefik دریافت و پردازش میشه و این پردازش بهطور کامل داینامیکه. تو Kubernetes هم Traefik همین روش رو استفاده میکنه و از APIهای Kubernetes برای شناسایی و مدیریت سرویسها کمک میگیره.
برای اینکه سرویسها بهطور خودکار توسط Traefik کشف بشن، باید براشون label یا annotation مناسب تعریف بشه. مثلاً تو Docker، میتونی این برچسبها رو به کانتینرت اضافه کنی:
labels: - "traefik.enable=true" - "traefik.http.routers.myservice.rule=Host(`example.com`)" -"traefik.http.services.myservice.loadbalancer.server.port=80"
این مثال نشون میده که کانتینر موردنظر ترافیک رو به پورت ۸۰ هدایت میکنه و هر درخواست HTTP که به دامین example.com
بیاد، به این کانتینر فرستاده میشه. همین روند تو Kubernetes هم به همین شکل انجام میشه با استفاده از annotationها.
خب، حالا که با Traefik و قابلیت کشف خودکار سرویسهاش آشنا شدیم، بد نیست یه مقایسه کوچیک هم با ابزارهای دیگه مثل Nginx و Caddy داشته باشیم. تو Nginx، هر وقت سرویس جدیدی میاد بالا یا کانفیگ تغییر میکنه، باید فایلهای کانفیگ بهصورت دستی ویرایش بشن و Nginx هم باید reload بشه. اما تو Traefik این کارها داینامیک و خودکار انجام میشه. Caddy هم تا حدودی شبیه Traefik عمل میکنه و قابلیتهای خوبی برای کشف سرویسها داره، ولی توی یکپارچگی با سیستمهای پیچیده مثل Kubernetes و Docker بهاندازه Traefik انعطافپذیر نیست.
ابزار Traefik با قابلیت کشف خودکار سرویسها کار رو تو محیطهای پیچیده و داینامیک مثل Docker و Kubernetes خیلی راحت کرده. این ویژگی نهتنها نیاز به تنظیمات دستی رو از بین میبره، بلکه باعث میشه زیرساختت همیشه آپدیت بشه و ترافیک بدون هیچ وقفهای به سمت سرویسهای درست هدایت بشه.
اگر تو محیطهایی کار میکنی که سرویسها مدام در حال تغییرن، Traefik یه انتخاب عالیه که کارها رو برات راحت و بیدردسر میکنه.