Tìm hiểu CronJob trong Kubernetes là gì ? – Cuongquach.com | Bạn muốn chạy một số tác vụ tự động trong hệ thống Kubernetes Cluster, giống như cách sử dụng crontab trên Linux/UNIX. Vậy thì Kubernetes có hỗ trợ bạn đấy : CronJob. Cùng tìm hiểu cách sử dụng CronJob trong Kubernetes nhé.
Contents
CronJob trong Kubernetes là gì ?
Cũng giống như Cronjob trong Linux, CronJob trong Kubernetes dùng để chạy các tác vụ tại một thời điểm cụ thể hoặc tại các khoảng thời gian được quy định. Là một lựa chọn khá tốt cho các tác vụ tự động như :
- Backup dữ liệu
- Tổng hợp báo cáo
- Gửi email
- Các tác vụ dọn dẹp
CronJob sẽ sử dụng Job object để cấu hình do vậy việc khởi tạo, quản lý, mở rộng và xoá bỏ CronJob cũng giống như Job trong Kubernetes. CronJob sẽ được quản lý bởi CronJob Controller.
Quản lý CronJob trong Kubernetes
Tạo CronJob Kubernetes
Mình tạo một CronJob với nội dung là : cứ 1 phút in một câu lệnh date
và output message. Còn trong thực tế, thì thường người ta sẽ build một Docker Image riêng cho các hoạt động tự động hoá tác vụ mà bạn mong muốn. Sau đó chỉ cần chỉ định CMD hoặc ENTRYPOINT để chạy cú pháp lệnh script trong Docker Image đó.
# vi cron-cuongquach-notify.yaml apiVersion: batch/v1beta1 kind: CronJob metadata: name: cuongquach-cronjob-notify spec: schedule: "*/1 * * * *" successfulJobsHistoryLimit: 5 failedJobsHistoryLimit: 2 jobTemplate: spec: template: spec: containers: - name: cuongquach-cronjob-notify image: busybox args: - /bin/sh - -c - date; echo Hello from the CuongQuach Kubernetes cluster restartPolicy: OnFailure # kubectl create -f cron-cuongquach-notify.yaml cronjob.batch/cuongquach-cronjob-notify created
Chú ý:
+ Schedule
Cấu hình spec.schedule
dùng để quy định khung thời gian mà CronJob sẽ chạy, cú pháp thì giống hệt Unix crontab. Thời gian cho CronJob mặc định đều là UTC. Có tổng cộng 5 cột, cách nhau bởi khoảng trắng, mỗi cột đại diện giá trị thông tin như sau :
- Phút (từ 0 đến 59)
- Giờ (từ 0 đến 23)
- Ngày của tháng (từ 1 đến 31)
- Tháng (từ 1 đến 12)
- Ngày trong tuần (từ 0 đến 6)
+ Job Template
Cấu hình .spec.jobTemplate
quy định các cấu hình để chạy một Job. Có cấu trúc y hệt như lúc cấu hình Job Kubernetes, từ đây giúp bạn chỉ định : container được chạy; các lệnh như CMD, ENTRYPOINT, ARGS, .. được sử dụng để chạy tác vụ.
+ Starting Deadline
CronJob controller sẽ kiểm tra mỗi 10 giây danh sách các CronJob được tạo bởi Kubernetes Client. Deadline sẽ quy định thời gian mà CronJob Controller sẽ kiểm tra trong vòng [n] thời gian đã qua, có bao nhiêu Scheduled Job bị failed thì sẽ khởi động lại các Scheduled Job đó.
apiVersion: batch/v1beta1 kind: CronJob metadata: name: cuongquach-cronjob-notify spec: schedule: "*/1 * * * *" startingDeadlineSeconds: 300 jobTemplate: spec: ...
Ví dụ:
- Bạn set Cronjob thực thi lúc
9:30
và10:30
(1 tiếng 1 lần). startingDeadlineSeconds là 300 giây. - Lúc
9:29
, Cronjob Controller hoặc hệ thống bị lỗi , downtime. Vì vậy Scheduled Job lúc9:30
không thực thi được. Hệ thống ghi nhận miss scheduled job (failed). - Lúc
9:34
, hệ thống khôi phục lại, kiểm tra trong vòng 300s trước đó từ9:29
–9:34
, có một miss scheduled job. - Thì lập tức start lại miss scheduled job đó.
Lưu ý:
– Nếu nhiều hơn 100 scheduled job bị failed cho một CronJob thì Cronjob Controller sẽ thông báo lỗi như sau :
"FailedNeedsStart", "Cannot determine if job needs to be started. Too many missed start time (> 100). Set or decrease .spec.startingDeadlineSeconds or check clock skew."
+ Chính sách chạy đồng thời
Khi bạn sử dụng cấu hình .spec.concurrencyPolicy
sẽ giúp bạn quy định chính sách cho trường hợp các Job chạy đồng thời được tạo bởi CronJob Controller. Mặc định thì nhiều Job được tạo bởi một CronJob sẽ được phép chạy đồng thời. Lưu ý là, các Job trong cùng 1 CronJob nhé. Còn các CronJob khác nhau sẽ vẫn tạo các Job khác nhau chạy bình thường đồng thời.
Trường hợp này xảy ra khi nào : ví dụ bạn chạy mỗi phút 1 cronjob, mà một job lại tốn đến 2 phút hoàn thành thì tất nhiên phút kế tiếp sẽ start một Job pod mới chạy tiếp trong khi Job pod cũ chưa chạy xong.
Một số cấu hình hỗ trợ như sau :
- Allow: cho phép các Job trong 1 CronJob chạy đồng thời.
- Forbid: không cho phép các Job trong 1 CronJob chạy đồng thời.
- Replace: nếu Job cũ chưa chạy xong, thì sẽ thay thế job cũ chạy mới.
+ CronJob History
CronJob sẽ khởi tạo một Pod mỗi lần job tác vụ chạy. Để thuận tiện cho việc coi lại thông tin trạng thái của các CronJob đã được thực thi, cũng như log của các Pod thực thi đó, sẽ được quy định trong phần “CronJob History” (lịch sử chạy CronJob).
Bạn có thể cấu hình tối đa số lượng CronJob đã thực thi thành công và thất bại được lưu trữ lại bởi 2 giá trị . Giả sử mình cho lưu trữ các CronJob thực thi thành công là 5 và thất bại là 2 , thì khi bạn liệt kê các Pod liên quan đến CronJob sẽ thấy 5 Pod được giữ lại :
spec.successfulJobsHistoryLimit
: 5 (mặc định là 3)spec.failedJobsHistoryLimit
: 2 (mặc định là 1)
Xem thông tin CronJob Kubernetes
Bạn có thể liệt kê toàn bộ cronjob trong Kubernetes:
# kubectl get cronjob -A NAMESPACE NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE default cuongquach-cronjob-notify */1 * * * * False 2 31s 105s
Hoặc liệt kê cụ thể cronjob có tên .
# kubectl get cronjob -n default cuongquach-cronjob-notify NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE cuongquach-cronjob-notify */1 * * * * False 3 36s 2m50s
Kế đến bạn có thể xem thông tin cụ thể cấu hình của CronJob đó.
# kubectl describe cronjob -n default cuongquach-cronjob-notify Name: cuongquach-cronjob-notify Namespace: default Labels: <none> Annotations: <none> Schedule: */1 * * * * Concurrency Policy: Allow Suspend: False Successful Job History Limit: 3 Failed Job History Limit: 1 Starting Deadline Seconds: <unset> Selector: <unset> Parallelism: <unset> Completions: <unset> Pod Template: Labels: <none> Containers: cuongquach-cronjob-notify: Image: busybox Port: <none> Host Port: <none> Args: /bin/sh -c date; echo Hello from the CuongQuach Kubernetes cluster Environment: <none> Mounts: <none> Volumes: <none> Last Schedule Time: Sun, 26 Apr 2020 09:52:00 +0700 Active Jobs: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 2m37s cronjob-controller Created job cuongquach-cronjob-notify-1587869400 Normal SawCompletedJob 2m27s cronjob-controller Saw completed job: cuongquach-cronjob-notify-1587869400, status: Complete Normal SuccessfulCreate 97s cronjob-controller Created job cuongquach-cronjob-notify-1587869460 Normal SawCompletedJob 87s cronjob-controller Saw completed job: cuongquach-cronjob-notify-1587869460, status: Complete Normal SuccessfulCreate 36s cronjob-controller Created job cuongquach-cronjob-notify-1587869520 Normal SawCompletedJob 26s cronjob-controller Saw completed job: cuongquach-cronjob-notify-1587869520, status: Complete
Bạn có thể ngồi coi thông tin Job được khởi tạo bởi CronJob cuongquach-cronjob-notify
.
# kubectl get jobs --watch NAME COMPLETIONS DURATION AGE cuongquach-cronjob-notify-1587869400 1/1 7s 3m6s cuongquach-cronjob-notify-1587869460 1/1 7s 2m6s cuongquach-cronjob-notify-1587869520 1/1 7s 65s cuongquach-cronjob-notify-1587869580 0/1 5s 5s
Giờ mình có nhu cầu coi output của CronJob đã được tạo và chạy. Thì mình cần tìm các Pod được khởi tạo bởi Scheduled Job trước đó, rồi coi log của Pod đó.
# kubectl get pods -A | grep -i "cuongquach-cronjob-notify" default cuongquach-cronjob-notify-1587869520-2b99m 0/1 Completed 0 2m30s default cuongquach-cronjob-notify-1587869580-z6bdx 0/1 Completed 0 90s default cuongquach-cronjob-notify-1587869640-fnxwb 0/1 Completed 0 29s # kubectl logs -n default cuongquach-cronjob-notify-1587869520-2b99m Sun Apr 26 02:52:11 UTC 2020 Hello from the CuongQuach Kubernetes cluster
Xoá CronJob Kubernetes
Xoá một CronJob trong Kubernetes cũng dễ dàng :
# kubectl delete cronjob cuongquach-cronjob-notify cronjob.batch "cuongquach-cronjob-notify" deleted
Khá là dễ hiểu phải không nào? Chúc các bạn hiểu rõ cách sử dụng CronJob trong Kubernetes nhé.
Nguồn: https://cuongquach.com/