در چشمانداز بهسرعت در حال تحول محاسبات بومی ابری، میکروسرویسها به معماری استاندارد برای ساخت برنامههای مقیاسپذیر و مقاوم تبدیل شدهاند. با این حال، با افزایش تعداد سرویسها، پیچیدگی مدیریت ارتباطات بین سرویسها نیز افزایش مییابد. ابزارهای نظارتی سنتی اغلب در مواجهه با ماهیت زودگذر کانتینرها و مسیریابی پویای ذاتی در سیستمهای توزیعشده ناتوان میمانند. در اینجا است که الگوهای مش سرویس (Service Mesh) و پراکسی سایدکار (Sidecar Proxy) به عنوان اجزای حیاتی معماری ظاهر میشوند و راهی استاندارد برای مدیریت نگرانیهای زیرساختی مانند امنیت، قابلیت اطمینان و از همه مهمتر، قابلیت مشاهده (Observability) ارائه میدهند.
چالش قابلیت مشاهده در سیستمهای توزیعشده
قابلیت مشاهده در یک برنامه تکتکه (Monolithic) نسبتاً ساده است: شما یک فرآیند واحد با یک نقطه ورودی شناختهشده را نظارت میکنید. در یک معماری میکروسرویس، یک درخواست کاربری واحد میتواند از دهها سرویس عبور کند که هر کدام ممکن است در فضای نامها، خوشهها یا حتی ارائهدهندگان ابری متفاوتی میزبانی شوند. بدون یک لایه یکپارچه، کسب بینش درباره تأخیر، نرخ خطا و ردیابی درخواستها به یک فرآیند پراکنده و دستی تبدیل میشود. توسعهدهندگان اغلب خود را در حال نوشتن کدهای ابزارسازی سفارشی در هر سرویس مییابند که منجر به تکرار کد و ناسازگاری میشود.
ورود پراکسی سایدکار
الگوی پراکسی سایدکار با جداسازی نگرانیهای زیرساختی از منطق برنامه، این مشکل را حل میکند. با استقرار یک پراکسی شبکه سبکوزن در کنار هر کانتینر برنامه، میتوانیم تمام ترافیک ورودی و خروجی را رهگیری کنیم. این پراکسی که به عنوان سایدکار شناخته میشود، مانند یک مأمور راهنمایی ترافیک عمل کرده و وظایفی مانند پایاندهی TLS، تعادل بار و شکستن مدار (Circuit Breaking) را بدون نیاز به هرگونه تغییر در کد برنامه انجام میدهد.
محبوبترین پیادهسازی این الگو Envoy است که به عنوان لایه داده (Data Plane) برای بسیاری از پیادهسازیهای مش سرویس، از جمله Istio و Linkerd عمل میکند. Envoy بهطور خاص برای محیطهای بومی ابری طراحی شده است و عملکرد بالا و یکپارچگی عمیق با مجموعههای قابلیت مشاهده مدرن مانند Prometheus، Jaeger و Zipkin را ارائه میدهد.
پیادهسازی قابلیت مشاهده با مش سرویس
هنگامی که یک مش سرویس را یکپارچه میکنید، قابلیت مشاهده خودکار و بدون نیاز به کدنویسی کسب میکنید. پراکسیهای سایدکار بهطور خودکار متادیتا را به هدرهای HTTP، متادیتای gRPC و زمینههای ردیابی تزریق میکنند که به شما امکان میدهد گزارشها، معیارها و ردیابیها را در سراسر گراف سرویس همبستهسازی کنید. این کار یک دید یکپارچه از سلامت و عملکرد سیستم شما ایجاد میکند.
بیایید یک پیکربندی استقرار ساده در Kubernetes را در نظر بگیریم. برای فعالسازی پراکسی سایدکار برای یک برنامه، معمولاً مشخصات پاد (Pod) را برای شامل کردن کانتینر Envoy تغییر میدهید. در اینجا یک مثال مفهومی از نحوه به نظر رسیدن مشخصات پاد با تزریق کانتینر سایدکار آورده شده است:
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: app
image: my-application:latest
ports:
- containerPort: 8080
- name: envoy
image: envoyproxy/envoy:v1.20-latest
ports:
- containerPort: 15001
protocol: TCP
volumeMounts:
- name: envoy-config
mountPath: /etc/envoy
volumes:
- name: envoy-config
configMap:
name: envoy-config-map
در این مثال، کانتینر envoy در کنار کانتینر app اجرا میشود. برنامه ترافیک را به localhost:15001 ارسال میکند که پراکسی Envoy آن را رهگیری میکند. سپس Envoy ارتباط خروجی واقعی را مدیریت کرده و ترافیک را با دادههای قابلیت مشاهده مانند اسپنهای ردیابی توزیعشده و معیارهای دقیق غنی میسازد.
بهترین شیوهها برای پیادهسازی
در حالی که مشهای سرویس مزایای عظیمی ارائه میدهند، پیچیدگیهایی نیز ایجاد میکنند. برای اطمینان از یک پیادهسازی روان، بهترین شیوههای زیر را در نظر بگیرید:
- کوچک شروع کنید: با یک سرویس یا فضای نام واحد شروع کنید تا تنظیمات قابلیت مشاهده خود را قبل از مقیاسدهی به کل مش اعتبارسنجی کنید.
- مش را نظارت کنید: اطمینان حاصل کنید که نظارت قویای برای خود لایه کنترل (Control Plane) دارید. اگر مش از دسترس خارج شود، قابلیتهای قابلیت مشاهده شما ممکن است به شدت تحت تأثیر قرار گیرد.
- SLOهای واضح تعریف کنید: از دادههای تلهمتری غنی برای تعریف و نظارت بر اهداف سطح سرویس (SLOs) استفاده کنید که تجربه واقعی کاربر را منعکس کنند، نه فقط معیارهای فنی.
نتیجهگیری
پیادهسازی یک مش سرویس با پراکسیهای سایدکار تنها درباره مدیریت ترافیک نیست؛ بلکه درباره کسب بینشهای عمیق و قابل اجرا در سیستمهای توزیعشده خود است. با انتزاع نگرانیهای قابلیت مشاهده به یک لایه زیرساختی اختصاصی، تیمهای توسعه میتوانند بر ساخت ویژگیهای ارزشآفرین تمرکز کنند و در عین حال به مش برای ارائه دید کامل در مورد برنامههایشان اعتماد کنند. با بلوغ بیشتر معماریهای بومی ابری، تسلط بر این الگوها برای هر توسعهدهندهای که هدفش ساخت سیستمهای مقاوم، قابل مشاهده و مقیاسپذیر است، ضروری خواهد بود.