1. 程式人生 > 其它 >k8s-Cronjob部署文件

k8s-Cronjob部署文件

1. CronJob

Cron Job 建立是基於時間排程的 Jobs

一個 CronJob 物件就像 crontab (cron table) 檔案中的一行。它用 Cron 格式進行編寫,並週期性地在給定的排程時間執行 Job。

1.1 CronJob 限制

CronJob 建立 Job 物件,每個 Job 的執行次數大約為一次。 之所以說 “大約” ,是因為在某些情況下,可能會建立兩個 Job,或者不會建立任何 Job。雖然試圖使這些情況儘量少發生,但不能完全杜絕。因此,Job 應該是冪等的。

CronJob 僅負責建立與其排程時間相匹配的 Job,而 Job 又負責管理其代表的 Pod。

使用案例:

1、在給定時間點排程Job

2、建立週期性執行的Job。如:資料備份、數倉導數、執行任務、郵件傳送、資料拉取、資料推送

1.2特殊說明

.spec.schedule 必選,任務被建立和執行的排程時間。同Cron格式串,例如 0 * * * *。

  • .spec.jobTemplate 必選,任務模版。它和 Job的語法完全一樣
  • .spec.startingDeadlineSeconds 可選的。預設未設定。它表示任務如果由於某種原因錯過了排程時間,開始該任務的截止時間的秒數。過了截止時間,CronJob 就不會開始任務。不滿足這種最後期限的任務會被統計為失敗任務。如果沒有該宣告,那任務就沒有最後期限。
  • .spec.concurrencyPolicy 可選的。它聲明瞭 CronJob 建立的任務執行時發生重疊如何處理。spec 僅能宣告下列規則中的一種:

Allow (預設):CronJob 允許併發任務執行。

Forbid:CronJob 不允許併發任務執行;如果新任務的執行時間到了而老任務沒有執行完,CronJob 會忽略新任務的執行。

Replace:如果新任務的執行時間到了而老任務沒有執行完,CronJob 會用新任務替換當前正在執行的任務。

請注意,併發性規則僅適用於相同 CronJob 建立的任務。如果有多個 CronJob,它們相應的任務總是允許併發執行的。

  • .spec.suspend 可選的。如果設定為 true ,後續發生的執行都會掛起。這個設定對已經開始執行的Job不起作用。預設是關閉的false。
    備註:在排程時間內掛起的執行都會被統計為錯過的任務。當 .spec.suspend 從 true 改為 false 時,且沒有開始的最後期限,錯過的任務會被立即排程。
  • .spec.successfulJobsHistoryLimit 和 .spec.failedJobsHistoryLimit 可選的。 這兩個聲明瞭有多少執行完成和失敗的任務會被保留。預設設定為3和1。限制設定為0代表相應型別的任務完成後不會保留。

說明:如果 startingDeadlineSeconds 設定為很大的數值或未設定(預設),並且 concurrencyPolicy 設定為 Allow,則作業將始終至少執行一次。

2. 建立映象

• Springboot專案登出以前的定時任務,在啟動類裡建立一個bean例項

public class DataCollectionApplication {



    public static void main(String[] args) {

        SpringApplication.run(DataCollectionApplication.class, args);

    }

    @Bean

    public StartupRunner startupRunner(){

        return new StartupRunner();

    }

  



實現在專案啟動後執行的功能,SpringBoot提供的一種簡單的實現方案就是新增一個model並實現CommandLineRunner介面,實現功能的程式碼放在實現的run方法中,任務執行完成以後呼叫System.exit方法退出。

@Slf4j

public class StartupRunner implements CommandLineRunner {



    @Autowired

    HttpUtil httpUtil;



    @Override

    public void run(String... args) throws Exception {

        log.info("startup runner");

        log.info("args:{}",args);

        httpUtil.getData();

        log.info("task finished");

        // 程式執行完springboot自動退出

        System.exit(0);

    }

  

專案打成jar包,放在docker容器下用dockerfile建立映象上傳私庫裡。

3. CronJob示例

建立yaml檔案

apiVersion: batch/v1beta1  # 當前 CronJob 的 apiVersion

kind: CronJob # 指明當前資源的型別為 CronJob。

metadata:

  name: earlydata-cronjob

  namespace: job

spec:

  schedule: '*/3 * * * *'   # schedule 指定什麼時候執行 Job

  successfulJobsHistoryLimit: 1

  terminationGracePeriodSeconds: 3  #新pod產生後老pod存活時間預設30秒

  jobTemplate:   # jobTemplate 定義 Job 的模板,格式與上文的 Job 一致 

    spec:

      template:

        spec:

          containers:

            - name: earlydata-cronjob

              image: 10.0.0.0:5000/form/earlydata

          restartPolicy: OnFailure    #Pod的重啟策略

  

啟動cronjob並檢視狀態

 Kubectl  apply  -f  cronjob.yaml

  

幾分鐘之後的狀態資訊



[root@k8s-master controller]# kubectl get cronjob -n  fzjz
NAME                       SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
earlywarningdata-cronjob   */5 * * * *   False     1        19s             6d