اپلیکیشنهای مونولیتیک قدیمی اغلب گلوگاههای معماری مهمی هستند. در حالی که روند صنعت به شدت به نفع میکروسرویسهاست، بسیاری از سازمانها همچنان به مونولیتهای مستحکم اما انعطافناپذیر تکیه دارند. مهاجرت این سیستمها به معماری میکروسرویس یک تلاش پرریسک و پرتلاش است. با این حال، شما مجبور نیستید بین بازنویسی کامل و پذیرش محدودیتهای سیستمهای قدیمی یکی را انتخاب کنید. اینجا Istio و قابلیتهای قدرتمند تزریق سایدکار آن وارد میشوند.
با تزریق یک پراکسی Envoy به عنوان سایدکار در پادهای (Pods) مونولیت خود، میتوانید قابلیتهای مش سرویس (Service Mesh) مانند mTLS، مدیریت ترافیک و قابلیت مشاهده (Observability) را بدون تغییر حتی یک خط از کد برنامه معرفی کنید. این پست وبلاگ الگوهای فنی و استراتژیهای اتوماسیون مورد نیاز برای پیادهسازی مؤثر این موضوع را بررسی میکند.
درک مکانیسم تزریق سایدکار
هسته اتوماسیون Istio در mutatingwebhookconfiguration نهفته است. هنگامی که یک پاد جدید در یک ناسپیس (Namespace) کوبرنیتیز که برای تزریق Istio برچسبگذاری شده است ایجاد میشود، وبهوک مشخصات پاد را دستکاری کرده و قبل از اینکه زمانبند (Scheduler) گرهای را اختصاص دهد، آن را اصلاح میکند. این عمل، کانتینر Envoy (سایدکار) را اضافه کرده و پیکربندی لازم را تزریق میکند.
برای مونولیتهای قدیمی، این موضوع یک بازیتغییردهنده است. مونولیت دستنخورده باقی میماند، اما لایه شبکه هوشمند میشود. شما میتوانید ترافیک ورودی را کنترل کنید، محدودیت نرخ (Rate Limiting) را اعمال کنید و ردیابی توزیعشده را در سراسر زیرساخت خود جمعآوری کنید.
برچسبگذاری هدفمند ناسپیس
سادهترین راه برای فعالسازی تزریق، برچسبگذاری کل ناسپیس است. اگرچه این روش برای میکروسرویسهای جدید مؤثر است، اما این رویکرد کلی ممکن است برای یک مونولیت پیچیده که زیرساخت را با سایر اجزای قدیمی حیاتی به اشتراک میگذارد، بیش از حد تهاجمی باشد.
# Label the namespace to enable injection
kubectl label namespace legacy-app-ns istio-injection=enabled
با این حال، رویکردی دقیقتر اغلب برای پایداری ترجیح داده میشود. به جای برچسبگذاری ناسپیس، میتوانید پادها یا دیپلویمنهای خاصی را نشانگذاری (Annotate) کنید. این کار تضمین میکند که فقط بارهای کاری خاصی که نمایانگر مونولیت شما هستند، سایدکار را دریافت کنند و سایر منابع قدیمی مشترک دستنخورده باقی بمانند.
اتوماسیون تزریق از طریق Helm و CI/CD
مداخله دستی در استقرارهای تولید، منبع خطا است. برای مقیاسپذیری این الگو، اتوماسیون کلیدی است. اگر از Helm برای مدیریت استقرار مونولیت خود استفاده میکنید، میتوانید فرآیند تزریق را سادهسازی کنید.
اول، مطمئن شوید که برچسب istio-injection در خوشه شما فعال است. سپس، برنامه خود را استقرار دهید. اگر از Istio Operator یا نمودارهای Helm Istio استفاده میکنید، تزریق به طور خودکار هنگام ایجاد پاد انجام میشود.
# Deploy the legacy application
helm install legacy-monolith ./charts/monolith \
--namespace legacy-app-ns \
--set service.type=ClusterIP
پس از استقرار، وضعیت تزریق صحیح سایدکار را با بررسی وضعیت پاد تأیید کنید.
kubectl get pods -n legacy-app-ns -o wide
شما باید دو کانتینر در حال اجرا ببینید: کانتینر برنامه شما و کانتینر istio-proxy.
مدیریت محدودیتهای شبکه قدیمی
مونولیتهای قدیمی اغلب دارای آدرسهای IP از پیش تعیینشده (Hardcoded) هستند یا به رفتارهای خاصی از شبکه وابستهاند که ممکن است با مکانیسمهای دستکاریکننده پراکسی Envoy تداخل داشته باشد. برای کاهش این مشکل، باید قوانین iptables را در داخل سایدکار با دقت پیکربندی کنید.
به طور پیشفرض، Istio از منابع SidecarIngress و SidecarEgress برای کنترل ترافیکی که پراکسی میشود استفاده میکند. برای یک مونولیت، شما معمولاً میخواهید تمام ترافیک ورودی را پراکسی کنید اما اتصالات خروجی مستقیم به پایگاههای داده قدیمی یا APIهای شخص ثالث را مجاز بدانید تا از افزایش تأخیر جلوگیری شود.
apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
name: legacy-sidecar-config
namespace: legacy-app-ns
spec:
workloadSelector:
labels:
app: legacy-monolith
egress:
- hosts:
- "./*" # Allow all outbound traffic
- "istio-system/*"
ingress:
- port:
number: 8080
protocol: HTTP
name: http
defaultEndpoint: "127.0.0.1:8080"
نتیجهگیری
پذیرش یک مش سرویس برای مونولیتهای قدیمی درباره اصلاح کد نیست؛ بلکه درباره اصلاح لایه شبکه است. با بهرهگیری از الگوهای تزریق سایدکار Istio، شما امنیت و قابلیت مشاهده در سطح سازمانی را کسب میکنید در حالی که یکپارچگی منطق کسبوکار موجود خود را حفظ میکنید. چه از برچسبهای سراسری ناسپیس استفاده کنید و چه از نشانگذاریهای دقیق، کلید موضوع اتوماسیون است. با ادغام این الگوها در پایپلاینهای CI/CD خود، میتوانید زیرساخت خود را به صورت تدریجی مدرنسازی کنید، ریسک را کاهش دهید و راه را برای تغییرات معماری آینده هموار کنید. کوچک شروع کنید، تأثیر را پایش کنید و اجازه دهید مش کارهای سنگین را انجام دهد.