معرفی
کوبرنتیز (Kubernetes یا K8s) یک پلتفرم متنباز برای ارکستراسیون کانتینرها است. تیمها با آن برنامههای کانتینری را روی چند سرور اجرا، مقیاسدهی و بهروزرسانی میکنند. کوبرنتیز بهجای اجرای دستی هر کانتینر، وضعیت مطلوب برنامه را دریافت میکند و کنترلرهای آن برای حفظ این وضعیت عمل میکنند.
Pod کوچکترین واحد قابل استقرار در کوبرنتیز است و میتواند یک یا چند کانتینر را دربر بگیرد. در کار روزمره معمولاً با Deployment برای مدیریت نسخه و تعداد Podها، Service برای فراهمکردن دسترسی پایدار به مجموعهای از Podها، ConfigMap برای تنظیمات غیرمحرمانه و Secret برای دادههای حساس کار میکنید. تعریف این منابع در فایلهای YAML نگهداری میشود تا استقرارها تکرارپذیر و قابل بازبینی باشند.
کوبرنتیز زمانی ارزش بیشتری دارد که چند سرویس، چند محیط اجرا، نیاز به انتشار تدریجی یا نیازمندیهای مشخص مقیاسدهی و دسترسپذیری دارید. برای یک برنامه کوچک با یک یا چند کانتینر، پیچیدگی کلاستر، شبکه، کنترل دسترسی و پایش ممکن است از مزیت آن بیشتر باشد. در چنین شرایطی، بسته به نیاز پروژه، استفاده از یک ارکستراتور سادهتر یا یک سرویس مدیریتشده میتواند گزینه مناسبتری باشد. با این حال، در هر دو حالت باید مسئولیتهای مربوط به تنظیمات برنامه، منابع، شبکه و امنیت را بررسی کنید.
مهندسان دواپس و تیمهای پلتفرم از کوبرنتیز برای اجرای سرویسهای متعدد، انتشار تدریجی نسخهها و بازیابی خطاهای قابل تشخیص استفاده میکنند. برای شناخت واقعیت شغلی و مسیر ورود به این نقش، راهنمای شغلی مهندس دواپس را بررسی کنید. برای کسب تجربه عملی در زمینه کانتینرها میتوانید از Docker یا ابزارهای دیگر ساخت و اجرای کانتینر استفاده کنید. کوبرنتیز به Docker وابسته نیست و از طریق Container Runtimeهای سازگار با استانداردهای مورد استفاده خود، کانتینرها را اجرا میکند.
تمرین عملی پیشنهادی
یک کلاستر محلی یا آزمایشی ایجاد کنید و یک سرویس وب ساده را با Deployment اجرا کنید.
برای سرویس یک Service بسازید و از داخل کلاستر، نام DNS آن را آزمایش کنید.
یک ConfigMap برای یک تنظیم غیرحساس تعریف کنید و آن را بهصورت متغیر محیطی یا فایل در اختیار Pod قرار دهید. سپس مقدار آن را تغییر دهید و بررسی کنید که تغییرات در چه حالتی به Pod موجود منتقل میشود. در صورت استفاده از متغیر محیطی، با ایجاد Rollout یا راهاندازی دوباره Pod اعمال مقدار جدید را آزمایش کنید.
نسخه جدید تصویر را منتشر کنید، وضعیت Rollout را ببینید و در صورت خطا به نسخه قبلی بازگردید.
عمداً نام تصویر یا یک متغیر ضروری را نادرست وارد کنید و با بررسی رویدادها و لاگها علت خطا را پیدا کنید.
وقتی بتوانید علت Pending یا CrashLoopBackOff را از رویدادها، وضعیت Pod و لاگ کانتینر تشخیص دهید، این تمرین به نتیجه رسیده است.
ویژگیهای کلیدی
برای آشنایی بهتر با این ابزار، توجه به موارد زیر میتواند مفید باشد.
-
استقرار و مدیریت وضعیت مطلوب
با Deployment تعداد Replicaهای موردنیاز و نسخه تصویر کانتینر را تعریف میکنید. ReplicaSet مرتبط تلاش میکند تعداد Podهای در حال اجرا را حفظ کند. برای نمونه، پس از حذف Pod یا خاتمه کانتینر، نمونه جایگزین ایجاد میشود.
-
Service و کشف سرویس
Service یک نقطه دسترسی پایدار برای مجموعهای از Podها فراهم میکند. با تغییر یا بازسازی Podها، مصرفکنندگان سرویس لازم نیست نشانی هر Pod را بدانند.
-
مدیریت تنظیمات و دادههای حساس
ConfigMap تنظیماتی مانند نشانی سرویس یا متغیرهای محیطی غیرحساس را از تصویر برنامه جدا میکند. Secret برای نگهداری و انتقال دادههایی مانند رمز عبور و کلید دسترسی استفاده میشود، اما استفاده از Secret بهتنهایی امنیت این دادهها را تضمین نمیکند. باید دسترسی به Secretها محدود شود و برای دادههای ذخیرهشده در کلاستر، از رمزنگاری مناسب در محل نگهداری مانند etcd استفاده شود.
-
پروب سلامت و بازیابی خودکار
پروبهای liveness، readiness و startup وضعیت کانتینر را بررسی میکنند. شکست readiness باعث میشود Pod آماده دریافت ترافیک محسوب نشود و از Endpointهای مربوط به Service خارج شود، اما بهتنهایی باعث راهاندازی مجدد کانتینر نمیشود. شکست liveness یا startup، در صورت عبور از آستانه خطای تعیینشده، میتواند باعث توقف کانتینر و اجرای مجدد آن طبق سیاست راهاندازی مجدد شود.
-
Rollout و بازگشت نسخه
Deployment از بهروزرسانی تدریجی نسخه پشتیبانی میکند تا Podهای جدید مرحلهبهمرحله جایگزین شوند. در صورت مشاهده خطا، میتوانید تاریخچه Rollout را بررسی و به نسخه قبلی بازگردید.
-
مقیاسدهی و زمانبندی بار کاری
کوبرنتیز Podها را با توجه به منابع درخواستی، محدودیتها و قواعد زمانبندی روی Nodeها قرار میدهد. مقیاسدهی افقی نیز میتواند تعداد Replicaها را بر اساس معیارهای تعریفشده تغییر دهد.
کاربردها
در ادامه، مهمترین موارد این بخش به تفکیک معرفی شدهاند.
-
استقرار چند سرویس در یک محصول
برای محصولی با API، پردازشگر پسزمینه و سرویسهای مستقل، هر سرویس را در Deployment جداگانه اجرا و ارتباط داخلی آنها را با Service مدیریت میکنید.
-
انتشار تدریجی نسخه جدید
وقتی نسخه تازه یک API منتشر میشود، با Rollout تدریجی، رفتار Podهای جدید و خطاها را زیر نظر میگیرید و در صورت مشکل به نسخه پیشین بازمیگردید.
-
اجرای برنامه با تنظیمات متفاوت
میتوانید تصویر یکسان برنامه را در محیطهای توسعه، آزمایش و عملیاتی اجرا کنید و تفاوت نشانی سرویسها یا متغیرهای محیطی را با ConfigMap و Secret اعمال کنید.
-
واکنش به اختلال سرویس
اگر readiness ناموفق باشد، Pod از Endpointهای مناسب برای دریافت ترافیک خارج میشود، اما کانتینر همچنان میتواند به اجرای خود ادامه دهد. liveness برای تشخیص وضعیتهایی مانند قفلشدن یا ازکارافتادن برنامه و راهاندازی مجدد کانتینر در صورت عبور از آستانه خطا استفاده میشود. startup نیز برای برنامههایی مناسب است که هنگام شروع به زمان بیشتری نیاز دارند و کمک میکند liveness و readiness پیش از آمادهشد
-
عیبیابی اختلال در استقرار
در خطاهایی مانند ImagePullBackOff، CrashLoopBackOff یا Pending، وضعیت Pod، رویدادها، لاگ کانتینر، منابع درخواستی و اتصال Service را بررسی میکنید تا علت واقعی مشخص شود.
پرسشهای رایج درباره کوبرنتیز
اگر درباره این ابزار پرسشی دارید، ممکن است پاسخ آن را در میان موارد زیر پیدا کنید.
آیا برای یادگیری کوبرنتیز باید Docker را بلد باشم؟
خیر، Docker الزام کوبرنتیز نیست. اما باید درک عملی کانتینر، تصویر، رجیستری، شبکه، Volume و متغیرهای محیطی را داشته باشید. Docker یکی از رایجترین راهها برای کسب این تجربه است، ولی ابزارهای ساخت تصویر و runtimeهای دیگری نیز وجود دارند.
تفاوت Pod و Deployment در کوبرنتیز چیست؟
Pod کوچکترین واحد اجرایی است و یک یا چند کانتینر را دربر میگیرد. Deployment مشخص میکند چه تعداد Pod از یک نسخه برنامه اجرا شود و فرایند بهروزرسانی یا جایگزینی آنها را مدیریت میکند.
Service در کوبرنتیز چه مشکلی را حل میکند؟
Podها ممکن است حذف و با نمونههای جدید جایگزین شوند و نشانی شبکه آنها تغییر کند. Service یک نام و نقطه دسترسی پایدار فراهم میکند و ترافیک را به Podهای انتخابشده میرساند.
آیا Secret در کوبرنتیز بهتنهایی برای امنیت رمز عبور کافی است؟
خیر. Secret برای جداکردن داده حساس از تنظیمات عادی مفید است، اما امنیت آن به کنترل دسترسی، شیوه تحویل Secret به برنامه و پیکربندی رمزنگاری دادههای ذخیرهشده نیز وابسته است.
برای عیبیابی Pod اجرانشده از کجا شروع کنم؟
ابتدا وضعیت Pod و رویدادهای آن را بررسی کنید تا مشخص شود مشکل در زمان زمانبندی، دریافت Image، ایجاد کانتینر یا اجرای برنامه رخ داده است. برای وضعیتهایی مانند Pending، منابع درخواستی، وضعیت Node و محدودیتهای زمانبندی را بررسی کنید. برای وضعیتهایی مانند ImagePullBackOff، نام Image و دسترسی به Registry را بررسی کنید. برای CrashLoopBackOff، لاگ کانتینر و علت خروج آن را بررسی کنید. سپس تنظیمات ConfigMap و Secret، Volumeها و اتصال Service را بررسی کنید.