

Trong quá trình vận hành Kubernetes, nhiều tác vụ không cần chạy liên tục mà chỉ cần thực hiện vào một thời điểm hoặc theo chu kỳ nhất định, chẳng hạn sao lưu dữ liệu mỗi đêm, tạo báo cáo cuối ngày hay dọn dẹp file tạm hàng tuần. Kubernetes cung cấp CronJob để tự động hóa những công việc dạng này. Vậy CronJob là gì trong Kubernetes?
CronJob là một resource trong Kubernetes dùng để tự động tạo và chạy các Job theo một lịch định kỳ được xác định trước. Lịch chạy được khai báo bằng cú pháp cron, tương tự cơ chế crontab trên các hệ thống Unix/Linux.
Ví dụ, bạn có thể sử dụng CronJob để thiết lập một công việc chạy:
CronJob phù hợp với các tác vụ có thời điểm bắt đầu và kết thúc rõ ràng như backup, tạo báo cáo, xử lý batch hoặc maintenance định kỳ. Đây là một resource thuộc API group batch/v1 và đã ở trạng thái stable trong Kubernetes từ phiên bản 1.21.
Điểm cần lưu ý là CronJob không trực tiếp thực thi container. Nhiệm vụ chính của CronJob là tạo ra Job theo lịch. Job sau đó mới chịu trách nhiệm tạo và quản lý Pod để thực thi workload.
Có thể hình dung đơn giản:
CronJob → Job → Pod → Container → Task
Đây là điểm khác biệt quan trọng khi tìm hiểu cách Kubernetes tổ chức các workload chạy theo lịch.

Khi tạo CronJob, người quản trị khai báo hai thành phần quan trọng là lịch chạy và Job template.
CronJob Controller trong Kubernetes theo dõi các CronJob đã được khai báo. Khi đến thời điểm phù hợp với schedule, controller tạo một Job mới dựa trên cấu hình trong jobTemplate.
Job vừa được tạo tiếp tục tạo Pod để chạy container chứa chương trình hoặc script cần thực hiện. Khi container hoàn thành công việc thành công, Pod kết thúc và Job được đánh dấu hoàn tất.
Quy trình có thể mô tả như sau:
1. Khai báo CronJob: Người quản trị tạo manifest YAML chứa schedule và nội dung công việc.
2. CronJob Controller kiểm tra lịch: Kubernetes theo dõi lịch đã khai báo trong trường .spec.schedule.
3. Đến lịch, CronJob tạo Job: Mỗi lần lịch được kích hoạt, một Job mới có thể được tạo.
4. Job tạo Pod: Job quản lý một hoặc nhiều Pod thực hiện workload.
5. Container thực thi tác vụ: Container bên trong Pod chạy script, command hoặc ứng dụng theo cấu hình.
6. Job hoàn tất: Khi workload chạy xong, Job chuyển sang trạng thái thành công hoặc thất bại.
Cơ chế này giúp các tác vụ định kỳ được quản lý như một workload Kubernetes thay vì phải cấu hình cron riêng trên từng máy chủ.
Một CronJob đơn giản có thể được khai báo như sau:
apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-task
spec:
schedule: "0 2 * * *"
timeZone: "Asia/Ho_Chi_Minh"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
spec:
containers:
- name: daily-task
image: busybox
command:
- /bin/sh
- -c
- date; echo "Running scheduled task"
restartPolicy: OnFailureTrong ví dụ trên, CronJob được thiết lập để chạy vào 02:00 mỗi ngày theo múi giờ được cấu hình.
Phần:
jobTemplate: chứa template của Job sẽ được tạo mỗi khi schedule được kích hoạt. Kubernetes quy định jobTemplate là thành phần bắt buộc của CronJob và cấu trúc của nó về cơ bản tương ứng với Job spec được lồng bên trong CronJob.
Ngoài schedule và jobTemplate, CronJob còn có một số tùy chọn quan trọng để kiểm soát cách workload hoạt động.
schedule xác định thời điểm CronJob cần tạo Job.
Ví dụ:
schedule: "0 1 * * *"có nghĩa Job được lập lịch vào 01:00 mỗi ngày.
timeZone cho phép xác định múi giờ dùng để diễn giải schedule.
Ví dụ:
timeZone: "Asia/Ho_Chi_Minh"Khả năng cấu hình .spec.timeZone đã ở trạng thái stable từ Kubernetes 1.27. Nếu không thiết lập, lịch được diễn giải dựa trên múi giờ cục bộ của kube-controller-manager. Kubernetes khuyến nghị khai báo timezone thông qua trường timeZone thay vì chèn TZ hoặc CRON_TZ trực tiếp vào biểu thức schedule.
Đây là cấu hình đáng chú ý với các hệ thống chạy trên hạ tầng phân tán hoặc có nhiều khu vực địa lý.
Một vấn đề thường gặp là Job cũ chưa chạy xong nhưng lịch tiếp theo đã đến. concurrencyPolicy quyết định Kubernetes xử lý tình huống này như thế nào.
Có ba giá trị:
Giá trị | Cách hoạt động |
| Allow | Cho phép nhiều Job của CronJob cùng chạy |
| Forbid | Không chạy Job mới nếu Job trước vẫn đang chạy |
| Replace | Thay Job đang chạy bằng Job mới |
Allow là giá trị mặc định.
Ví dụ, nếu một tác vụ backup mất 90 phút nhưng CronJob được lập lịch mỗi 60 phút, Forbid có thể được sử dụng để tránh hai tiến trình backup chạy chồng lên nhau.
startingDeadlineSeconds quy định khoảng thời gian tối đa Job còn được phép bắt đầu nếu đã bỏ lỡ lịch chạy.
Ví dụ:
startingDeadlineSeconds: 300Nếu Job không thể được tạo đúng lịch nhưng vẫn còn trong khoảng 300 giây, Kubernetes có thể tiếp tục tạo Job. Khi vượt quá thời hạn này, lần chạy đó sẽ bị bỏ qua.
Cấu hình này hữu ích khi tác vụ phụ thuộc nhiều vào thời điểm thực thi.
Có thể tạm dừng CronJob mà không cần xóa resource bằng:
suspend: trueKhi suspend được bật, những lần chạy tiếp theo không được khởi động. Tuy nhiên, các Job đã bắt đầu trước đó không bị ảnh hưởng.
Sau thời gian dài hoạt động, một CronJob có thể tạo ra rất nhiều Job đã hoàn thành. Kubernetes cho phép giới hạn số Job được giữ lại.
Ví dụ:
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1Theo cấu hình mặc định, Kubernetes giữ lại 3 Job thành công và 1 Job thất bại. Có thể đặt giá trị bằng 0 nếu không muốn giữ lịch sử tương ứng.
CronJob phù hợp với các workload cần thực thi định kỳ thay vì hoạt động liên tục.
Một trong những use case phổ biến nhất là chạy backup database hoặc dữ liệu vào khung giờ cố định.
Doanh nghiệp có thể chạy các tác vụ tổng hợp dữ liệu và tạo báo cáo hàng ngày, hàng tuần hoặc hàng tháng.
CronJob có thể dùng để xóa file tạm, dữ liệu hết hạn hoặc các tài nguyên không còn cần thiết vào những thời điểm ít ảnh hưởng đến hệ thống.
Các workload ETL, tổng hợp dữ liệu hoặc xử lý theo lô có thể được kích hoạt định kỳ thông qua CronJob.
Một ứng dụng có thể cần đồng bộ dữ liệu giữa nhiều hệ thống sau mỗi vài phút hoặc vài giờ. CronJob giúp tự động kích hoạt quá trình này theo lịch đã định.

Job và CronJob đều thuộc nhóm batch workload nhưng giải quyết hai nhu cầu khác nhau.
Tiêu chí | Job | CronJob |
| Mục đích | Thực hiện tác vụ đến khi hoàn thành | Lập lịch tạo Job định kỳ |
| Lịch chạy | Không | Có |
| Tần suất | Thường chạy một lần | Chạy lặp theo schedule |
| Quản lý Pod | Trực tiếp | Thông qua Job |
| Ví dụ | Migration dữ liệu một lần | Backup hàng đêm |
Kubernetes định nghĩa Job là workload thực hiện một tác vụ và chạy đến khi hoàn thành, trong khi CronJob chịu trách nhiệm khởi tạo các Job theo lịch lặp lại.
Do đó, nếu tác vụ chỉ cần chạy một lần, Job thường phù hợp hơn. Nếu cùng một Job cần được thực hiện định kỳ, CronJob là lựa chọn thích hợp.
Khi CronJob không hoạt động đúng lịch, không nên chỉ kiểm tra cron expression mà cần xem cả Job và Pod phía sau.
Một số nguyên nhân thường gặp gồm:
Có thể bắt đầu bằng kubectl describe cronjob, sau đó kiểm tra Job, Pod và log của container để xác định chính xác lỗi nằm ở tầng nào.
CronJob giúp tự động hóa workload nhưng không nên mặc định rằng mỗi mốc schedule luôn tương ứng chính xác với duy nhất một lần thực thi.
Tài liệu Kubernetes lưu ý trong một số tình huống có thể xảy ra trường hợp hai Job được tạo hoặc không có Job nào được tạo cho một lần schedule. Vì vậy, workload chạy bằng CronJob nên được thiết kế theo hướng idempotent.
Idempotent có thể hiểu đơn giản là tác vụ có khả năng chạy lại mà không làm sai trạng thái dữ liệu.
Ví dụ, nếu một CronJob gửi hóa đơn cho khách hàng, việc chạy lại không được khiến cùng một hóa đơn bị gửi hoặc ghi nhận hai lần.
Ngoài ra, khi triển khai CronJob nên:
Với các tác vụ quan trọng như backup, đồng bộ hay xử lý dữ liệu, cần giám sát kết quả thực thi thay vì chỉ kiểm tra xem CronJob đã được tạo hay chưa.

Không theo mô hình quản lý workload thông thường. CronJob tạo Job theo schedule, sau đó Job chịu trách nhiệm quản lý các Pod thực hiện tác vụ.
Cron trên Linux thường chạy command hoặc script trực tiếp trên một hệ thống. Trong Kubernetes, CronJob là một resource của cluster và sử dụng Job, Pod và container để thực thi workload theo lịch.
Có. Biểu thức:
* * * * *lập lịch CronJob mỗi phút.
Tuy nhiên, cần đảm bảo thời gian thực thi của Job và concurrencyPolicy phù hợp để tránh tạo quá nhiều Job chạy đồng thời.
Có. Đặt:
spec:
suspend: trueđể tạm dừng các lần chạy tiếp theo mà không cần xóa CronJob.
CronJob trong Kubernetes là resource dùng để lập lịch và tự động tạo Job theo chu kỳ, phù hợp với các tác vụ như backup, xử lý batch, tạo báo cáo, dọn dẹp hay đồng bộ dữ liệu. Cơ chế của CronJob có thể tóm gọn thành CronJob → Job → Pod → Container, trong đó CronJob chịu trách nhiệm về lịch còn Job quản lý quá trình thực thi workload.
Khi triển khai thực tế, bên cạnh việc viết đúng cron expression, doanh nghiệp cần quan tâm đến timezone, concurrency, missed schedule, lịch sử Job và khả năng xử lý khi tác vụ được chạy lại. Đây là những yếu tố quan trọng để các workload định kỳ hoạt động ổn định khi hệ thống Kubernetes ngày càng mở rộng.
Nếu doanh nghiệp đang xây dựng hoặc mở rộng hệ thống ứng dụng trên Kubernetes, hạ tầng cloud phù hợp sẽ giúp đơn giản hóa việc triển khai tài nguyên, mở rộng workload và vận hành hệ thống linh hoạt hơn. Có thể tham khảo thêm các giải pháp hạ tầng điện toán đám mây tại VNPT Cloud để lựa chọn mô hình phù hợp với nhu cầu thực tế.
