Thứ Ba, 04/08/2026, 17:00 (GMT+0)

CronJob Kubernetes là gì? Cách hoạt động và cấu hình CronJob trong K8s

Quay lại Trang chủ Blog
Trên trang này

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à 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:

  • Vào 2 giờ sáng mỗi ngày.
  • Mỗi 30 phút.
  • Mỗi tối Chủ nhật.
  • Ngày đầu tiên của mỗi tháng.

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.

cronjob-k8s.jpg

CronJob Kubernetes hoạt động như thế nào?

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ủ.

Ví dụ cấu hình CronJob Kubernetes bằng YAML

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: OnFailure

Trong 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.

Những trường cấu hình quan trọng của 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

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

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ý.

concurrencyPolicy

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

AllowCho phép nhiều Job của CronJob cùng chạy
ForbidKhông chạy Job mới nếu Job trước vẫn đang chạy
ReplaceThay 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

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: 300

Nế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.

suspend

Có thể tạm dừng CronJob mà không cần xóa resource bằng:

suspend: true

Khi 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.

successfulJobsHistoryLimit và failedJobsHistoryLimit

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: 1

Theo 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 thường được sử dụng để làm gì?

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.

Sao lưu dữ liệu

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.

Tạo báo cáo định kỳ

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.

Dọn dẹp dữ liệu

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.

Xử lý batch

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.

Đồng bộ dữ liệu

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.

cronjob.jpg

Job và CronJob khác nhau như thế nào?

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 đíchThực hiện tác vụ đến khi hoàn thànhLập lịch tạo Job định kỳ
Lịch chạyKhông
Tần suấtThường chạy một lầnChạy lặp theo schedule
Quản lý PodTrực tiếpThông qua Job
Ví dụMigration dữ liệu một lầnBackup 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.

Một số nguyên nhân khiến Kubernetes CronJob không chạy

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:

  • Cron expression cấu hình sai.
  • CronJob đang ở trạng thái suspend.
  • Múi giờ không đúng với thời gian mong muốn.
  • concurrencyPolicy: Forbid khiến lần chạy mới bị bỏ qua vì Job cũ chưa hoàn thành.
  • Job tạo thành công nhưng Pod gặp lỗi.
  • Container không thể pull image.
  • Script bên trong container thực thi thất bại.
  • Lịch bị bỏ lỡ và vượt quá startingDeadlineSeconds.

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.

Lưu ý khi sử dụng CronJob trong môi trường thực tế

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:

  • Đặt timezone rõ ràng nếu thời gian chạy có ý nghĩa nghiệp vụ.
  • Chọn concurrencyPolicy phù hợp với từng workload.
  • Giới hạn lịch sử Job để tránh giữ quá nhiều resource không cần thiết.
  • Theo dõi trạng thái Job và cảnh báo khi tác vụ thất bại.
  • Thiết lập CPU và memory request/limit phù hợp cho Pod.
  • Quản lý Secret an toàn nếu Job cần thông tin đăng nhập database hoặc hệ thống bên ngoài.

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.

cronjob.jpg

Câu hỏi thường gặp về CronJob Kubernetes

CronJob có trực tiếp tạo Pod không?

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ụ.

CronJob khác cron trên Linux như thế nào?

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.

CronJob có thể chạy mỗi phút không?

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ó thể tạm dừng CronJob không?

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.

Kết luận

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ế.

#Kubernetes
#Kubernetes
Sovereign Cloud không chỉ là đặt máy chủ trong nước. Với bối cảnh pháp lý dữ liệu mới tại Việt Nam, đây đang trở thành bài toán hạ tầng quan trọng cho doanh nghiệp Việt và doanh nghiệp nước ngoài hoạt động tại Việt Nam
Sovereign Cloud - Đám mây chủ quyền là gì? Và vì sao doanh nghiệp hoạt động tại Việt Nam nên quan tâm từ bây giờ?
Tiếp tục đọc