مالتیکلاستر Linkerd؛ فیلوور خودکار بین سه ریجن
خلاصهٔ کاملتر
به گفتهٔ نویسنده، هر ستاپ چندریجنی بالاخره به یه لحظهٔ ناجور میرسه: یه کلاستر کامل از دسترس خارج میشه و اون نسخهٔ دقیقاً مشابهی که دو ریجن اونورتر بالاست عملاً به درد نمیخوره، چون هیچی جوری سیمکشی نشده که این دوتا رو یه چیز واحد ببینه. افزونهٔ مالتیکلاستر Linkerd همین شکاف رو پر میکنه و میذاره چند کلاستر یه سرویس رو به شکل یه اندپوینت واحدِ لودبالانسشده ارائه بدن.
Linkerd سه حالت داره و این سه تا با هم ناسازگار نیستن؛ روی همون مجموعه لینکها، حالت هر سرویس با یه لیبل انتخاب میشه. حالت فدریت یعنی یه سرویس همهجا بالا باشه و همهٔ نسخههاش زیر یه نام واحد لودبالانس بشن. میرور تخت یعنی سرویس ریموت رو با اسم مشخص خودش صدا بزنی و ترافیک مستقیم بره سراغ پادهای اون کلاستر. میرور از راه گیتوی هم وقتی به کار میاد که شبکهٔ تخت و اتصال مستقیم بین پادها نداری و فقط IP گیتوی در دسترسه.
تو دموی مقاله سه کلاستر GKE تو سه ریجن با شش لینک جهتدار به هم وصل شدن و هر سه سرویس هم از یه ایمیج یکسان استفاده میکنن، تا تنها تفاوتشون همون لیبل باشه. سرویس frontend فدریته و روی هر سه کلاستر بالاست:
kubectl --context west -n mc-demo label svc/frontend mirror.linkerd.io/federated=memberچند ثانیه بعد، سرویس frontend-federated تو هر سه کلاستر ساخته میشه و ترافیک بین هر ۹ پاد پخش میشه.
تست کیاس همهٔ دیپلویمنتهای کلاستر east رو صفر میکنه تا قطعی کامل شبیهسازی بشه. سرویس فدریتشده بدون هیچ خطایی توزیع ترافیک رو از ۳۳/۳۳/۳۳ به ۵۰/۵۰ میبره، ولی api-east کد ۵۰۳ و analytics-east-gw کد ۵۰۲ برمیگردونن — که رفتار درستیه، چون کلاینت صراحتاً یه ریموتِ مشخص رو خواسته بوده. جمعبندی نویسنده اینه که میرور بهت کنترل میده و فدریشن اتوماسیون؛ برای هر چیزی که باید همهجا در دسترس باشه، فدریشن انتخاب پیشفرضه.
نکات کلیدی:
- سه حالت مالتیکلاستر (فدریت، میرور تخت، میرور گیتوی) روی یه مجموعه لینک با هم کار میکنن و انتخابشون فقط یه لیبله
- فدریشن موقع قطعی یه کلاستر خودش ترافیک رو بین بقیه پخش میکنه، بدون تغییر تو اپلیکیشن
- میرور تخت و گیتوی موقع قطعی خطا میدن، چون کلاینت مقصد مشخصی رو خواسته؛ مدیریتش کار خود کلاینته
- رنجهای CIDR باید بین کلاسترها همپوشانی نداشته باشن، وگرنه پیرینگ VPC بیصدا خراب میشه
- هر کلاستر برای هر لینکی که مصرف میکنه به یه کنترلر service-mirror جدا نیاز داره
- اسم سرویس فدریتشده همیشه به شکل اسمسرویس-federated ساخته میشه و قابل تغییر نیست




