CronJob یکی از بنیادیترین بخشهای خودکارسازی در لینوکس/یونیکس برای زمانبندی انجام کارها در یک زمان یا بازه زمانی مشخص است. حال در دنیای کوبرنتیز نیز ما میتوانیم از توانمندیهای آن بهره گرفته و در کلاستر کوبرنتیز از آن استفاده کنیم. به همین دلیل در این مطلب از وبلاگ همروش با چیستی CronJob و اهمیت آن در محیط کوبرنتیز آشنا میشویم.
Kubernetes CronJob چیست؟
CronJobها در کوبرنتیز روشی برای اجرا یک تسک خاص براساس زمانبندی مشخص است. این تکنولوژی برای سالها در محیطهای یونیکس و لینوکس وجود داشته و برای خودکارسازی کارها و مدیریت سیستم از اهمیت بسیار بالایی برخوردار است. در محیط کلاستر کوبرنتیز ما میتوانیم از CronJobها برای تسکهایی مانند بکاپگیری، گزارشگیری، راهاندازی مجدد کانتینرها و… استفاده کنیم.
CronJob چگونه کار میکند؟
در سیستمهای مبتنی بر یونیکس، شیوه کار کردن CronJobها به شکل زیر است:
- مدیر سیستم ابتدا با استفاده از دستور crontab فایل «crontab» را ویرایش میکند. در این فایل لیستی از دستورات و اسکریپتهایی که باید اجرا شوند، همراه با زمان اجرای آنها قرار میگیرد. انجام این کار در نهایت به ساخته شدن CronJob جدید منجر میشود.
- در قدم بعدی cron daemon که یک پردازش پسزمینهای یا Background Process است فایل crontab تمام کاربران را بهصورت مداوم برای پیدا کردن تغییرات و مشاهده تسکهای جدیدی که زمانبندی شدهاند مشاهده میکند.
- اگر تسک جدیدی که زمانبندی شده مشاهده شود، cron daemon آن را در زمان تعریف شده اجرا میکند.
در کوبرنتیز تمام موارد گفته شده توسط Control plane مربوط به کلاستر بهصورت خودکار مدیریت میشود.
چه زمانی باید از CronJobها در کوبرنتیز استفاده کنید؟
مهمترین استفاده و البته مزیت CrobJobها، خودکارسازیهای تسکهای تکرارشونده مانند بکاپگیری، همگامسازی دادهها و کارهای مربوط به نگهداری و مدیریت است. در نتیجه شما باید براساس کارهایی که انجام میدهید، در هر حالتی که انجام کارها بهصورت خودکار را ضرورت دانستید از آن استفاده کنید. در ادامه بهصورت کاملتر برخی از سناریوهایی که استفاده از CrobJob در آنها میتواند رویکرد خوبی باشد را بررسی میکنیم.
۱. تهیه نسخه پشتیبان یا Backup
بکاپگیری یکی از مهمترین رویکردها برای جلوگیری از حذف و نابود شدن همیشگی دادههای مربوط به اپلیکیشن و دیتابیس است. عملیات بکاپگیری باید براساس یک زمانبندی مشخص انجام شود که انجام آن بهصورت دستی حقیقتا کار اشتباه و پرخطایی است. یکی از استفادههای CrobJob در این سناریو، خودکارسازی عملیاتهای بکاپگیری است.
۲. نگهداری از دیتابیس
انجام عملیاتهایی مانند پاکسازی دیتابیس، reindex کردن، ادغام و انتقال اطلاعات و… از جمله کارهایی هستند که در فرایند نگهداری از دیتابیس در بازههای زمانی ثابتی انجام میشوند. انجام این تسکها در یک فرایند خودکارسازی شده با استفاده از CrobJob میتواند به استفاده درستتر از زمان کمک کند.
۳. Log Rotation
Rotate کردن لاگها به شما کمک میکند تا از «بسیار بزرگ شدن» لاگها جلوگیری کنید و آنها را بهصورت مدیریتپذیرتری نگهدارید. CrobJobها میتوانند در rotate کردن لاگها در بازههای زمانی مختلف بهصورت خودکار به شما کمک کنند.
۴. همگامسازی داده
همگامسازی دادهها بین سرویسها و دیتابیسهای مختلف یکی دیگر از کارهایی است که ممکن است هر چند وقت یکبار در یک سازمان انجام شود.
۵. گزارشگیری
تهیه گزارشات از میزان مصرف منابع و یا عملکرد کامپوننتهای مختلف ممکن است در هر سازمانی براساس زمانبندیهای روزانه، هفتگی و ماهانه اتفاق بیفتد. با استفاده از CrobJob میتوانید فرایند گزارشگیری در بازههای زمانی مختلف را بهصورت خودکار پیش ببرید.
۶. اسکن امنیتی
اسکن سرویسها و دیتاها بهصورت مداوم برای کشف آسیبپذیری و مشکلات امنیتی یکی از رویکردهای جاری در بیشتر سازمانهاست.
در تمام موارد گفته شده انجام کارهای دستی در بازههای زمانی نزدیک به هم اتفاق میافتد. در نتیجه اگر موارد مشابه با این حالت داشتید نیز میتوانید با استفاده از CrobJob آن را خودکارسازی کنید.
آشنایی با سینتکس CronJob
سینتکس CrobJob کمی عجیب و غریب بوده و برای زمانبندی اجرا تسکها نیاز است که از الگوی زیر بهره ببرید:
* * * * *
حال شاید بپرسید که این پنج ستاره به چه معناست! هر کدام از این ستارهها نماد یک موجودیت زمانی (ساعت، دقیقه، روز و…) است. از سمت چپ به ترتیب هر کدام از این موجودیتها عبارت است از: دقیقه، ساعت، روز از ماه (۱ تا ۳۱)، ماه و روز از هفته (۰ تا ۶). همچنین منظور از خود ستاره موجودیت کامل است. برای مثال اگر در قسمت روز از علامت ستاره استفاده کنیم به معنی «تمام روزهای ماه» است.
برای درک این مسئله با یک مثال پیش میرویم:
0 23 * * *
در مثال بالا تسکی که قرار است انجام شود هر روز در ساعت ۱۱ شب اجرا میشود.
* * * * *
در این مثال نیز تسک هر ۱ دقیقه یکبار اجرا میشود.
برای پیدا کردن درک بهتر از این قضیه و امتحان کردن آن میتوانید از وبسایت Crontab.guru استفاده کنید.
پیادهسازی CrobJob در کوبرنتیز
در قدم اول مانیفستی مانند زیر را در فایلی با عنوان cronjob.yaml قرار دهید:
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
همانطور که از مقدار kind مشخص است این مانیفست مربوط به یک CrobJob است. در بخش spec ما با مقداردهی schedule میتوانیم از سینتکس CrobJob برای زمانبندی استفاده کنیم. در این مثال از آنجایی که تمام پارامترها برابر علامت ستاره است، هر دقیقه یکبار تسک (command) مشخص شده در ادامه اجرا میشود.
بنابراین با اجرایی شدن این مانیفست، هر دقیقه یکبار پیام Hello from the Kubernetes cluster
در قسمت log نمایش داده میشود.
در قدم بعدی نیاز است که با استفاده از kubectl دیپلویمنت مورد نظر را ایجاد کنیم:
kubectl create -f .\cronjob.yaml
برای تایید ساخته شدن CronJob مورد نظر میتوانید دستور زیر را وارد کنید:
kubectl get cronjob hello
خروجی شما در نهایت باید به شکل زیر باشد:
مقدار ACTIVE به تسکهای در حال اجرا اشاره دارد. اگر این مقدار برابر صفر باشد یا به این معناست که تسک بهصورت کامل انجام شده و یا به معنای وجود خطا است. همچنین مقدار LAST SCHEDULE به میزان زمانی اشاره دارد که تسک اجرا شده است.
برای مشاهده Jobهای در حال اجرا بهصورت Real-time میتوانید از آرگومان --watch
استفاده کنید:
kubectl get jobs --watch
همچنین برای مشاهده پادهایی که برای اجرا این Jobها ساخته شدهاند میتوانید دستور زیر را وارد کنید:
kubectl get pods
خطاهای مرسوم در پیادهسازی CronJob در کوبرنتیز
اگر در فرایند پیادهسازی CronJob در کوبرنتیز به مشکل برخوردید احتمال دارد که در یکی از زمینههای زیر اشتباه پیش رفته باشید. مواردی که در زیر مطرح شدهاند مرسومترین مشکلات بوده و ممکن است مستقیما به مشکل شما مرتبط نباشند:
- سینتکس: یکی از مرسومترین خطاهایی که در پیادهسازی CronJob اتفاق میافتد، وارد کردن سینتکس اشتباهی است. بنابراین این بخش را حتما مجددا بررسی کرده و براساس الگوی درست سینتکسی پیش بروید.
- timezone: یکی دیگر از مشکلات و خطاهای مرسوم مربوط به منطقه زمانی میشود. اگر منطقه زمانی کلاستر کوبرنتیز شما با اپلیکیشن یا دیگر بخشها تطابق ندارد بهتر است آن را درست کنید.
- ایمیج: اگر CronJob با ایمیج خاصی سر و کار داشته باشد و آن ایمیج در دسترس نباشد، برنامه به درستی اجرا نحواهد شد.
- مجوزها: برای انجام برخی از تسکها CronJob به سطح خاصی از دسترسی نیاز خواهد داشت. مطمئن شوید که متناسب با تسک برنامهریزی شده، CronJob دسترسیهای لازم را در اختیار دارد.
- منابع کافی: ممکن است محدودیتهای منابعی باعث fail شدن اجرا تسکها شود. در نتیجه نیاز است که در اختیار داشتن منابع کافی برای اجرا تسکها بررسی شود.
در پایان
همانگونه که در این مطلب گفتیم CronJob برای زمانبندی کردن تسکها استفاده میشود. استفاده از این قابلیت در فضای کوبرنتیز بسیار کاربردی بوده و در مواقع بسیار زیادی میتواند کاربردی باشد.