Kubernetes v1.36: اعتبارسنجی Declarative به مرحله GA رسید
خلاصهٔ کاملتر
سالهاست که اعتبارسنجی APIهای بومی کوبرنتیز روی دوش کدهای Go دستی بوده. هر بار که یه فیلد نیاز به محدودیت داشت یا دو فیلد باید mutually exclusive میبودن، توسعهدهندهها باید تابع جداگانهای مینوشتن. با گسترش API Surface کوبرنتیز، این رویکرد به حدود ۱۸ هزار خط کد boilerplate منجر شد که نگهداریشون سخت، پرخطا، و برای ابزارهای خارجی غیرقابل تفسیر بود.
راهحل پیشنهادی SIG API Machinery، Declarative Validation بود: تعریف قوانین اعتبارسنجی از طریق تگهای +k8s: مستقیماً داخل فایلهای types.go. قلب این سیستم یه code generator جدید به اسم validation-gen هست که این تگها رو میخونه و توابع Go متناظر رو به صورت خودکار تولید میکنه — دقیقاً مثل کاری که کوبرنتیز برای deep copy و defaulting انجام میده.
تگهای جدید +k8s: طیف گستردهای از قابلیتها رو پوشش میدن؛ از حضور فیلد تا محدودیتهای عددی و طول رشته، مدیریت collectionها، unionها، و حتی immutability. مثلاً اعتبارسنجی فیلد Replicas در ReplicationControllerSpec الان اینشکلی تعریف میشه:
type ReplicationControllerSpec struct {
// +k8s:optional
// +k8s:minimum=0
Replicas *int32 `json:"replicas,omitempty"`
}این تگها مستقیماً بالای تعریف فیلد قرار میگیرن و کد رو خودمستند میکنن — هر کسی که کد رو میخونه فوری میفهمه چه محدودیتهایی وجود داره.
یکی از مهمترین دستاوردهای این ویژگی، مکانیزم "Ambient Ratcheting" هست. قبلاً اگه میخواستیم یه قانون اعتبارسنجی رو سختگیرانهتر کنیم، اول باید کد ratcheting دستی اضافه میکردیم، یه release صبر میکردیم، و بعد تغییر رو اعمال میکردیم. حالا این مکانیزم به صورت توکار وجود داره: اگه کاربری یه object رو آپدیت کنه و مقدار یه فیلد خاص تغییر نکرده باشه، قانون جدید برای اون فیلد bypass میشه. این یعنی میشه قوانین رو بدون نگرانی از شکستن objectهای قدیمی تغییر داد.
از طرف دیگه، چون قوانین اعتبارسنجی حالا به صورت marker ساختارمند تعریف میشن، ابزاری مثل kube-api-linter میتونه APIها رو به صورت استاتیک آنالیز کنه و استانداردهای API رو به صورت خودکار enforce کنه — که بار بررسی دستی روی SIG API Machinery رو به طرز قابل توجهی کاهش میده.
در نسخه v1.36، feature gate مربوط به این قابلیت به نام DeclarativeValidation به صورت پیشفرض فعاله. برنامه آینده هم شامل مهاجرت کدهای قدیمی به این فرمت و الزامی کردنش برای تمام APIها و فیلدهای جدیده. همچنین چون قوانین حالا قابل پارس هستن، میتونن در OpenAPI schema منتشر بشن تا ابزارهایی مثل kubectl و IDEها اعتبارسنجی رو سمت کلاینت و قبل از ارسال درخواست به cluster انجام بدن.
نکات کلیدی:
- Declarative Validation در Kubernetes v1.36 به مرحله GA رسید و feature gate
DeclarativeValidationبه صورت پیشفرض فعاله - ابزار
validation-genتگهای+k8s:رو پارس کرده و توابع اعتبارسنجی Go رو خودکار تولید میکنه - این قابلیت جایگزین حدود ۱۸ هزار خط کد boilerplate دستی میشه
- مکانیزم Ambient Ratcheting به صورت توکار از شکستن objectهای قدیمی هنگام تغییر قوانین جلوگیری میکنه
- در آینده، قوانین اعتبارسنجی در OpenAPI schema منتشر میشن تا اعتبارسنجی سمت کلاینت ممکن بشه
- ابزارهایی مثل Kubebuilder و
kube-api-linterمیتونن از این فریمورک بهرهمند بشن




