k8s的 Job/CronJob資源對象及添加api版本

Job資源對象

服務類的Pod容器:RC、RS、DS、Deploymentnode

工做類的Pod容器:Job--->執行一次,或者批量執行處理程序,完成以後退出容器。mysql

注意: 若是容器內執行任務有誤,會根據容器的重啓策略操做容器,不過這裏
的容器重啓策略只能是: Never和 OnFailure。sql

概念

在有些場景下,是想要運行一些容器執行某種特定的任務,任務一旦執行完成,容器也就沒有存在的必要了。在這種場景下,建立pod就顯得不那麼合適。因而就是了Job,Job指的就是那些一次性任務。經過Job運行一個容器,當其任務執行完之後,就自動退出,集羣也再也不從新將其喚醒。vim

從程序的運行形態上來區分,能夠將Pod分爲兩類:長時運行服務(jboss、mysql等)和一次性任務(數據計算、測試)。RC建立的Pod都是長時運行的服務,Job多用於執行一次性任務、批處理工做等,執行完成後便會中止(status.phase變爲Succeeded)。api

環境介紹

主機 IP地址 服務
master 192.168.1.21 k8s
node01 192.168.1.22 k8s
node02 192.168.1.23 k8s

基於[ http://www.javashuo.com/article/p-wzdhboob-dy.html]() 的實驗繼續進行併發

1、kubernetes支持如下幾種job

  • 非並行job:一般建立一個pod直至其成功結束。
  • 固定結束次數的job:設置spec.completions,建立多個pod,直到.spec.completions個pod成功結束。
  • 帶有工做隊列的並行job:設置.spec.Parallelism但不設置.spec.completions,當全部pod結束而且至少一個成功時,job就認爲是成功。

Job Controller

Job Controller負責根據Job Spec建立pod,並持續監控pod的狀態,直至其成功結束,若是失敗,則根據restartPolicy(只支持OnFailure和Never,不支持Always)決定是否建立新的pod再次重試任務。app

例子

(1)編寫一個job的yaml文件

[root@master yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo","hello k8s job!"]
      restartPolicy: Never

(2)執行一下

[root@master yaml]# kubectl apply -f jop.yaml

(3)查看一下

[root@master yaml]# kubectl get pod

k8s的  Job/CronJob資源對象及添加api版本

查看日誌

[root@master yaml]# kubectl logs test-job-gs45w

k8s的  Job/CronJob資源對象及添加api版本

咱們能夠看到job與其餘資源對象不一樣,僅執行一次性任務,默認pod借宿運行後job即結束,狀態爲Completed。ide

(4)修改一下jop的yaml文件,把echo命令換成亂碼

[root@master yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["asdasxsddwefew","hello k8s job!"] #修改
      restartPolicy: Never

(5)先刪除以前的pod

[root@master yaml]# kubectl delete jobs.batch test-job

(6)執行一下

[root@master yaml]# kubectl apply -f jop.yaml

(7)查看一下

[root@master yaml]# kubectl get pod -w

k8s的  Job/CronJob資源對象及添加api版本

它會一直建立pod直到完成命令。測試

(8)修改一下jop的yaml文件,修改重啓策略

[root@master yaml]# vim jop.yaml 
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["asdasxsddwefew","hello k8s job!"]
      restartPolicy: OnFailure

(9)先刪除以前的pod

[root@master yaml]# kubectl delete jobs.batch test-job

(10)執行一下

[root@master yaml]# kubectl apply -f jop.yaml

(11)查看一下

[root@master yaml]# kubectl get pod -w

k8s的  Job/CronJob資源對象及添加api版本

它會一直重啓pod完成命令,直到重啓到必定次數就會刪除job。3d

2、提升Job的執行效率

1. 咱們能夠在Job.spec字段下加上[parallelism]()選項。表示同時運行多少個Pod執行任務。


(1)編寫一個job的yaml文件

[root@master yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  parallelism: 2    #同時啓用幾個pod
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo","hello k8s job!"]
      restartPolicy: OnFailure

(3)執行一下

[root@master yaml]# kubectl apply -f jop.yaml

(4)查看一下

[root@master yaml]# kubectl get pod

k8s的  Job/CronJob資源對象及添加api版本

查看日誌

k8s的  Job/CronJob資源對象及添加api版本

2. 咱們能夠在Job.spec字段下加上complations選項。表示總共須要完成Pod的數量

(1)編寫一個job的yaml文件

[root@master yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  complations: 8            #運行pod的總數量8個
  parallelism: 2            #同時運行2個pod
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo","hello k8s job!"]
      restartPolicy: OnFailure

job 字段解釋:

completions:標誌Job結束須要成功運行的Pod個數,默認爲1
parallelism:標誌並行運行的Pod的個數,默認爲1
activeDeadlineSeconds:標誌失敗Pod的重試最大時間,超過這個時間不會繼續重試.

(2)先刪除以前的pod

[root@master yaml]# kubectl delete jobs.batch test-job

(3)執行一下

[root@master yaml]# kubectl apply -f jop.yaml

(4)查看一下

[root@master yaml]# kubectl get pod

k8s的  Job/CronJob資源對象及添加api版本
能夠看到pod是兩個兩個的啓動的。

3. 如何定時執行Job

(1)編寫一個cronjob的yaml文件

[root@master yaml]# vim cronjop.yaml
kind: CronJob
apiVersion: batch/v1beta1
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *" #限定時間
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            command: ["echo","hello","cronjob"]
          restartPolicy: OnFailure

(2)先刪除以前的pod

[root@master yaml]# kubectl delete jobs.batch test-job

(3)執行一下

[root@master yaml]# kubectl apply -f jop.yaml

(4)查看一下

[root@master yaml]# kubectl get pod

k8s的  Job/CronJob資源對象及添加api版本

[root@master yaml]# kubectl get cronjobs.batch

k8s的  Job/CronJob資源對象及添加api版本

此時查看Pod的狀態,會發現,每分鐘都會運行一個新的Pod來執行命令規定的任
務。

練習:規定2020.1.15.10.5分運行上面的crontab任務。

(1)編寫一個cronjob的yaml文件

[root@master yaml]# vim cronjop.yaml
kind: CronJob
apiVersion: batch/v1beta1
metadata:
  name: hello
spec:
  schedule: "5 10 15 1 *" #限定時間
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            command: ["echo","hello","cronjob"]
          restartPolicy: OnFailure

(2)先刪除以前的pod

[root@master yaml]# kubectl delete cronjobs.batch hello

(3)執行一下

[root@master yaml]# kubectl apply -f jop.yaml

(4)查看一下

[root@master yaml]# kubectl get pod

k8s的  Job/CronJob資源對象及添加api版本

這時會發現,若是規定具體時間,可能並不會執行任務。

(5)添加apiVersion庫

[root@master yaml]# vim /etc/kubernetes/manifests/kube-apiserver.yaml 
spec:
  containers:
  - command:
    - kube-apiserver
    - --runtime-config=batch/v2alpha1=true    #添加

k8s的  Job/CronJob資源對象及添加api版本

(6)重啓kubelet

[root@master yaml]# systemctl restart kubelet.service

(7)查看api版本

[root@master yaml]# kubectl api-versions

k8s的  Job/CronJob資源對象及添加api版本

(8)編寫一個cronjob的yaml文件

[root@master yaml]# vim cronjop.yaml
kind: CronJob
apiVersion: batch/v1beta1
metadata:
  name: hello
spec:
  schedule: "47 10 15 1 *" #限定時間
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            command: ["echo","hello","cronjob"]
          restartPolicy: OnFailure

(9)執行一下

[root@master yaml]# kubectl apply -f jop.yaml

(4)查看一下

[root@master yaml]# kubectl get pod -w

k8s的  Job/CronJob資源對象及添加api版本

注意:此時仍然不能正常運行指定時間的Job,這是由於K8s官方在cronjob這個資源對象的支持中尚未完善此功能,還待開發。

跟Job資源同樣在cronjob.spec.jobTemplate.spec 下一樣支持併發Job參數:
parallelism,也支持完成Pod的總數參數: completionsr

總結

Job 做爲 Kubernetes 中用於處理任務的資源,與其餘的資源沒有太多的區別,它也使用 Kubernetes 中常見的控制器模式,監聽 Informer 中的事件並運行 syncHandler 同步任務

而 CronJob 因爲其功能的特殊性,每隔 10s 會從 apiserver 中取出資源並進行檢查是否應該觸發調度建立新的資源,須要注意的是 CronJob 並不能保證在準確的目標時間執行,執行會有必定程度的滯後。

兩個控制器的實現都比較清晰,只是邊界條件比較多,分析其實現原理時必定要多注意。

相關文章
相關標籤/搜索