کوبرنتیس v1.36: مقابله با Staleness در کنترلرها
خلاصهٔ کاملتر
یکی از مشکلات قدیمی در دنیای کوبرنتیس اینه که کنترلرها برای سرعت بیشتر، یه کش محلی از وضعیت کلاستر نگه میدارن. این کش با watch کردن API server بهروز میشه، ولی گاهی ممکنه از واقعیت عقب بمونه؛ مثلاً وقتی کنترلر ریاستارت میشه یا API server موقتاً در دسترس نیست. این وضعیت «Staleness» یا کهنگی کش میتونه باعث بشه کنترلر اقدام اشتباه انجام بده، اقدام لازم رو نادیده بگیره، یا خیلی دیر عمل کنه.
کوبرنتیس ۱.۳۶ دو دسته بهبود در این زمینه ارائه داده: یکی در سطح client-go و دیگری در kube-controller-manager. این بهبودها با هم کار میکنن تا مطمئن بشن کنترلرها قبل از هر تصمیمی، کش بهروزی دارن.
در سطح client-go، یه مکانیزم جدید به اسم «پردازش اتمی FIFO» (feature gate: AtomicFIFO) اضافه شده. قبلاً رویدادها به ترتیب دریافت به صف اضافه میشدن و این میتونست منجر به وضعیت ناسازگار در کش بشه. حالا عملیاتی که دستهای دریافت میشن (مثل لیست اولیه اشیاء هنگام populate شدن کش) به صورت اتمی پردازش میشن و کش همیشه در یه وضعیت سازگار قرار داره.
علاوه بر این، یه تابع جدید به اسم LastStoreSyncResourceVersion() به اینترفیس Store اضافه شده که بهتون میگه آخرین resource versionای که کش دیده چیه. این تابع پایه و اساس قابلیتهای جدید ضد-Staleness در kube-controller-manager هستش.
در سطح kube-controller-manager، چهار کنترلر پرمصرف که روی Podها کار میکنن این قابلیت رو به صورت پیشفرض فعال دارن:
- DaemonSet controller
- StatefulSet controller
- ReplicaSet controller
- Job controller
این کنترلرها قبل از reconcile کردن هر شیء، resource version کش رو با آخرین چیزی که به API server نوشتن مقایسه میکنن. اگه کش از آنچه نوشته شده عقبتر باشه، کنترلر منتظر میمونه تا کش بهروز بشه. میتونید این feature gate رو برای هر کنترلر جداگانه خاموش کنید؛ مثلاً با غیرفعال کردن StaleControllerConsistencyDaemonSet برای کنترلر DaemonSet.
برای نویسندگان informer که از client-go استفاده میکنن هم یه ساختار داده جدید به اسم ConsistencyStore در دسترسه. این ساختار سه تابع اصلی داره:
type ConsistencyStore interface {
WroteAt(owningObj runtime.Object, uid types.UID, groupResource schema.GroupResource, resourceVersion string)
EnsureReady(namespacedName types.NamespacedName) bool
Clear(namespacedName types.NamespacedName, uid types.UID)
}تابع WroteAt هر بار که کنترلر چیزی به API server مینویسه صدا زده میشه تا آخرین resource version ثبت بشه. تابع EnsureReady قبل از reconcile بررسی میکنه که آیا کش بهروزه یا نه و در صورت بهروز بودن true برمیگردونه. تابع Clear هم برای پاکسازی هنگام حذف یه شیء استفاده میشه تا consistency store بینهایت بزرگ نشه.
یه نکته جالب اینه که UID شیء هم در ConsistencyStore ذخیره میشه؛ این برای مواقعیه که یه شیء حذف و دوباره با همون نام ساخته میشه. به این شکل سیستم میتونه بین دو نسخه مختلف از یه شیء تمایز قائل بشه و entry اشتباه رو پاک نکنه.
نکات کلیدی:
- Staleness یعنی کش کنترلر از وضعیت واقعی کلاستر عقب افتاده باشه
- کوبرنتیس ۱.۳۶ با feature gate AtomicFIFO پردازش اتمی صف رویدادها رو اضافه کرده
- تابع جدید LastStoreSyncResourceVersion() در Store interface آخرین resource version دیدهشده توسط کش رو برمیگردونه
- چهار کنترلر DaemonSet، StatefulSet، ReplicaSet و Job به صورت پیشفرض از این قابلیت بهرهمند میشن
- ConsistencyStore یه ابزار جدید برای نویسندگان informer هستش تا Staleness رو مدیریت کنن
- تمام این feature gateها قابل غیرفعالسازی جداگانه برای هر کنترلر هستن




