در دنیای معماری بومی ابری، میکروسرویسها انعطافپذیری بینظیری ارائه میدهند، اما پیچیدگی قابل توجهی نیز ایجاد میکنند. وقتی صدها سرویس با یکدیگر ارتباط برقرار میکنند، مدیریت ترافیک، اجرای سیاستهای امنیتی و جمعآوری دادههای مشاهدهپذیری به یک کار دشوار تبدیل میشود. در اینجا الگوی Service Mesh به عنوان یک جزء معماری حیاتی ظهور میکند. با جدا کردن منطق شبکه از کد برنامه، شبکههای سرویس مانند Istio و Linkerd راهی استاندارد برای مدیریت ارتباط بین سرویسها ارائه میدهند و به توسعهدهندگان امکان میدهند بر منطق کسبوکار تمرکز کنند در حالی که پلتفرم از لولهکشی شبکه مراقبت میکند.
Service Mesh چیست؟
در هسته اصلی، یک Service Mesh یک لایه زیرساختی اختصاصی برای مدیریت ارتباط بین سرویسها است. این یک برنامه واحد نیست، بلکه مجموعهای از پروکسیهای سبک شبکه است که در کنار هر نمونه از میکروسرویسها استقرار داده میشوند. این پروکسیها، که اغلب سایدکار (sidecar) نامیده میشوند، تمام ترافیک ورودی و خروجی را متوقف میکنند. این توقف به شبکه اجازه میدهد نگرانیهای عرضی یکپارچه را بدون تغییر در کد برنامه ارائه دهد.
قابلیتهای کلیدی که معمولاً توسط یک Service Mesh ارائه میشوند عبارتند از:
- مدیریت ترافیک: بارگیری متوازن، قطع مدار (circuit breaking)، تلاش مجدد و تقسیم ترافیک.
- امنیت: رمزنگاری متقابل TLS (mTLS) بین سرویسها، که نیاز به کشف سرویس از طریق آدرسهای IP را از بین میبرد.
- مشاهدهپذیری: جمعآوری متریکها، ردیابیها و لاگها برای هر درخواست و پاسخ.
Istio در مقابل Linkerd: انتخاب ابزار مناسب
اگرچه هر دو Istio و Linkerd الگوی Service Mesh را پیادهسازی میکنند، اما در فلسفه و جزئیات پیادهسازی با هم تفاوت دارند. Istio یک پلتفرم پربار است که بر روی پروکسیهای Envoy ساخته شده است. این ابزار از طریق تعاریف منابع سفارشی (CRD) مانند VirtualService و DestinationRule گزینههای پیکربندی گستردهای ارائه میدهد. این امر آن را برای سازمانهای بزرگ که به استراتژیهای مسیریابی ترافیک پیچیده نیاز دارند، ایدهآل میکند، اما به دلیل پیچیدگی کنترلپلن، منحنی یادگیری تندتر و سربار منابع بالاتری دارد.
Linkerd از سوی دیگر، رویکردی مینیمالیستی دارد. این ابزار توسط Buoyant توسعه یافته و پروکسی آن (Linkerd2-proxy) به زبان Rust و کنترلپلن آن به زبان Java نوشته شده است. Linkerd به دلیل سبک بودن، امنیت بالا به صورت پیشفرض و آسان بودن استقرار شناخته میشود. این ابزار به پیکربندی کمتر از همان ابتدا نیاز دارد و به همین دلیل مورد علاقه تیمهایی است که به دنبال پذیرش Service Mesh با حداقل بار عملیاتی هستند.
مثال عملی: تقسیم ترافیک با Istio
یکی از قدرتمندترین موارد استفاده برای یک Service Mesh استقرارهای کاناری (canary deployments) است. فرض کنید یک سرویس reviews با دو نسخه دارید: v1 و v2. شما میخواهید ۹۰٪ ترافیک را به v1 و ۱۰٪ را به v2 مسیریابی کنید تا ریلیز جدید را آزمایش کنید.
با Istio، این کار به صورت اعلانی (declarative) با استفاده از یک VirtualService انجام میشود. در اینجا پیکربندی YAML آورده شده است:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews-route
namespace: default
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 90
- destination:
host: reviews
subset: v2
weight: 10
این پیکربندی به پروکسی Istio دستور میدهد که ترافیک را بر اساس وزنهای تعریف شده تقسیم کند. اگر نرخ خطای بالایی در v2 مشاهده کنید، میتوانید وزن را بهروزرسانی کنید یا مسیر را بدون استقرار مجدد هیچ کانتینر برنامهای بازگردانید. این تغییر فوراً در کل شبکه اعمال میشود.
امنیتسازی ارتباط با TLS متقابل
امنیت یک انگیزه اصلی برای پذیرش Service Mesh است. به طور سنتی، امنیت ترافیک سرویسهای داخلی نیاز به پیادهسازی TLS در هر برنامه داشت، که مستعد خطا و پیچیده بود. یک Service Mesh این کار را از طریق TLS متقابل (mTLS) خودکار میکند.
در Istio، میتوانید mTLS را برای یک namespace با یک سیاست ساده PeerAuthentication اجبار کنید:
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: default
spec:
mtls:
mode: STRICT
پس از اعمال این سیاست، تمام ارتباطات بین سرویسها در namespace default رمزنگاری و احراز هویت میشوند. شبکه به طور خودکار چرخش و توزیع گواهیها را مدیریت میکند و اطمینان حاصل میکند که فقط سرویسهای تأیید شده میتوانند با یکدیگر ارتباط برقرار کنند. این مدل اعتماد صفر (zero-trust) وضعیت امنیتی خوشه شما را به طور قابل توجهی بهبود میبخشد.
مشاهدهپذیری: دیدن نامرئیها
قبل از Service Mesh، عیبیابی مشکلات شبکه اغلب شامل جستجو در لاگها از چندین پاد بود. با یک شبکه، مشاهدهپذیری استاندارد میشود. هر دو Istio و Linkerd متریکهای Prometheus را برای هر درخواست، از جمله توزیع تأخیر، تعداد درخواستها و نرخ خطا، آشکار میکنند.
برای مثال، میتوانید از istioctl برای بصریسازی گراف سرویس در زمان واقعی استفاده کنید:
istioctl analyze
istioctl dashboard grafana
این دستورات بینش فوری در مورد جریانهای ترافیک ارائه میدهند و به شما کمک میکنند گلوگاهها یا رفتارهای غیرعادی را شناسایی کنید. تلهمتری استاندارد همچنین یکپارچهسازی با استکهای پایش موجود مانند Prometheus و Grafana را آسانتر میکند و تلاش مورد نیاز برای ساخت داشبوردهای سفارشی را کاهش میدهد.
نتیجهگیری
شبکههای سرویس مانند Istio و Linkerd دیگر فناوریهای آزمایشی نیستند؛ آنها اجزای بنیادین زیرساخت بومی ابری مدرن هستند. با انتزاع نگرانیهای شبکه به یک لایه اختصاصی، آنها به توسعهدهندگان امکان میدهند میکروسرویسهای مقاوم، امن و قابل مشاهده را با اطمینان بسازند. در حالی که Istio انعطافپذیری بینظیری برای سناریوهای مسیریابی پیچیده ارائه میدهد، Linkerd یک نقطه ورود ظریف و کماصطکاک برای پذیرش شبکه ارائه میکند. فارغ از اینکه کدام ابزار را انتخاب میکنید، پیادهسازی یک Service Mesh شبکهسازی را از یک فرآیند دستی و مستعد خطا به یک قابلیت خودکار سطح پلتفرم تبدیل میکند و در نهایت سرعت تحویل تیم شما را افزایش میدهد.