Tìm hiểu CronJob trong Kubernetes là gì ?

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

cronjob-kubernetes-la-gi

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:3010: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úc 9: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:299: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/

Previous articleEbook Khát Khao Học Máy – Machine Learning Yearning (Tiếng Việt)
Next articleTìm hiểu về 2FA (Two-Factor Authentication) – Xác thực hai lớp
Bạn đang theo dõi website "https://cuongquach.com/" nơi lưu trữ những kiến thức tổng hợp và chia sẻ cá nhân về Quản Trị Hệ Thống Dịch Vụ & Mạng, được xây dựng lại dưới nền tảng kinh nghiệm của bản thân mình, Quách Chí Cường. Hy vọng bạn sẽ thích nơi này !