Kubernetes Jobs & CronJobs

Fatima Babayeva
PASHA Bank
Published in
4 min readMar 30, 2020

Hamıya salam,

Adım Fatimədir, hal-hazırda PASHA Bankda Software Engineer vəzifəsində çalışıram. Biz qabaqcıl texnologiyalar istifadə edərək müştərilərimiz üçün rəqəmsal həllər yaradırıq. Bu texnologiyalardan bunları vurğulamaq olar: müxtəlif proqramlaşdırma dillərində yazılmış mikroservislər, Docker container sistemi, container-ləri idarə edən Kubernetes və s.

Bu məqalədə mən sizə Kubernetes-in bir parçası olan JobCronJob komponentlərdən danışmaq istərdim, amma düşünürəm ki, əvvəlcə Controller-lərin nə olduğunu müəyyənlişdirək.

Kubernetes Controller nədir?

Controller Kubernetes-in elə bir hissəsidir ki, o, cluster-ə daima nəzarət edir və onun mövcud vəziyyətini(current state) istədiyimiz vəziyyətə(desired state) gətirmək üçün dəyişikliklər edir və ya dəyişiklikləri həyata keçirməyini tələb edir. Hər bir controller ən azindan bir resurs tipini idarə edir.

Hal-hazırda Kubernetes-də bir neçə daxili controller mövcuddur ­– və Job Controller də həmin siyahıya daxildir.

İndi isə Job-un nə olduğundan və necə işlədiyindən danışa bilərik.

Kubernetes Job nədir?

Job Kubernetes-in elə bir obyektidir ki, o, sonlu bir işi ifadə edir. Beləliklə, bir Job-un arzu olunan vəziyyəti(desired state) həmin işin sona çatmasıdır, buna isə Job Controller nəzarət edir. O, işin sonuna çatmasını təmin etmək üçün bir və ya bir neçə Pod qaldırır, Pod-lar işi gördükdən sonra isə müvafiq Job obyektini “Finished” kimi işarə edir.

Real olaraq, bu sxemin tətbiqini sadə nümunə ilə göstərək. Qeyd edim ki, məqalədə olan hər iki nümunəni Minikube üzərindən, lokal mühitdə Kubernetes cluster-i qaldırıb qurmuşam.

Yuxarıda gördüyünüz .yml fayl formatında saxlanılmış Job-un da hər bir Kubernetes obyekti kimi apiVersion, kindmetadata xanaları mövcuddur, spesifikasiyada isə Job-un yaratdığı Pod-un şablonu müəyyən edilir. Həmin Pod sadəcə “Hello World!” sözlərini çap edəcək.

Job-u cluster-də yaratmaq üçün aşağıdakı komandadan istifadə edirik:

$ kubectl apply -f < .yml fayla yol >

Yaradılmış Job-un statusuna baxa bilərik:

$ kubectl get jobs

Eyni zamanda, yaratdığı Pod-ları da görə bilərik:

$ kubectl get pods

Pod-un loglarına baxaraq, “Hello World!” sözlərini çap etməsinə əmin ola bilərik:

$ kubectl logs <Pod-un adı>

Bəs Kubernetes CronJob nədir?

CronJob Kubernetes-də elə bir obyektdir ki, o, periodik və təkrarlanan işlərin yerinə yetirilməsini təmin edir. Düşünün ki, CronJob yaradarkən biz zaman əsasında qurulmuş bir qrafik yaradırıq, və bu qrafika uyğun cluster-də müvafiq Job-lar yaranır. Həmin Job-lar, məqalənin birinci hissəsində qeyd etdiyim kimi, Pod-lar qaldırır, hansılar ki istədiyimiz işi yerinə yetirirlər.

CronJob yaradaraq vaxt qrafikini Cron formatında, yəni * * * * * və ya @daily sətr formasına yazmalıyıq. İkinci yazılma üsulunu asanlıqla başa düşsək də, birincinin açıqlamasını verək. Beş ulduzun yerinə rəqəmlər yazdıqda:

1-ci rəqəm — dəqiqə deməkdir (0–59)
2-ci — saat (0–23)
3-cü — ayın günü (1–31)
4-cü — ay (1–12)
5-ci — bazar günündən başlayaraq həftənin günü (0–6)

İndi isə real nümunəyə keçə bilərik. Bu dəfə nümunəni bir az genişləndirmək istədim və CronJob-u Spring Scheduler əvəzinə işlətdim — bunun üçün Spring Boot-da balaca mikroservis yazdım və planlı icra olunan işi endpoint kimi qeyd etdim (/scheduler/print). Test məqsədi ilə yaradıldığına görə, həmin endpoint sadəcə mesajı və tarixi log-a yazır.

Mikroservisin Dockerfile-ı aşağıdaki kimidir:

Həmin mikroservisi cluster-ə yerləşdirmək (deploy) və ona sorğu göndərmək üçün müvafiq servisi işə salmaq lazımdır (Kubernetes Deployment və Service-dən istifadə etdim):

Nəhayət, CronJob obyektini təsvir edə bilərik:

Dəyişiklikləri artıq bizə tanış olan kubectl apply komanda vasitəsi ilə tətbiq edə bilərik. Pod-lara baxdıqda isə, iki Pod qalxdığını görürük:

Bir neçə dəqiqə gözləyib sonra Pod-ların log-larına baxaraq, CronJob-un düz işlədiyinə əmin ola bilərik:

Birinci Pod-un log-ları
İkinci Pod-un log-ları

Burada vacib bir məqamı qeyd etmək istəyərdim: gördüyünüz kimi, Kubernetes mikroservisə gələn sorğunu (call) eyni zamanda yalnız bir Pod-a yönəldirilirməsini təmin edir.

Sonda demək lazımdır ki, Kubernetes-də Job-u silsək, avtomatik olaraq onun yaratdığı Pod-lar da silinir; CronJob-u silsək isə — yaratdığı Job-lar və Pod-lar silinir. Bunu aşağıdakı komandalar üzərindən edə bilərik:

$ kubectl delete job <Job-un adı>
$ kubectl delete cronjob <CronJob-un adı>

Diqqətinizə görə təşəkkürlər!

--

--