Kubernetes K8S之資源控制器Job和CronJob詳解
Kubernetes的資源控制器Job和CronJob詳解與示例
主機配置規劃
伺服器名稱(hostname) | 系統版本 | 配置 | 內網IP | 外網IP(模擬) |
---|---|---|---|---|
k8s-master | CentOS7.7 | 2C/4G/20G | 172.16.1.110 | 10.0.0.110 |
k8s-node01 | CentOS7.7 | 2C/4G/20G | 172.16.1.111 | 10.0.0.111 |
k8s-node02 | CentOS7.7 | 2C/4G/20G | 172.16.1.112 | 10.0.0.112 |
什麼是控制器
kubernetes中內建了很多controller(控制器),這些相當於一個狀態機,用來控制pod的具體狀態和行為。
- ReplicationController 和 ReplicaSet
- Deployment
- DaemonSet
- StatefulSet
- Job/CronJob
- HorizontalPodAutoscaler
Job
負責批處理任務
Job建立一個或多個Pod,並確保指定數量的Pod成功終止。Pod成功完成後,Job將跟蹤成功完成的情況。當達到指定的成功完成次數時,任務(即Job)就完成了。刪除Job將清除其建立的Pod。
一個簡單的情況是建立一個Job物件,以便可靠地執行一個Pod來完成。如果第一個Pod發生故障或被刪除(例如,由於節點硬體故障或節點重啟),則Job物件將啟動一個新的Pod。
當然還可以使用Job並行執行多個Pod。
Job終止和清理
Job完成後,不會再建立其他Pod,但是Pod也不會被刪除。這樣使我們仍然可以檢視已完成容器的日誌,以檢查是否有錯誤、警告或其他診斷輸出。Job物件在完成後也將保留下來,以便您檢視其狀態。
當我們刪除Job物件時,對應的pod也會被刪除。
特殊說明
- 單個Pod時,預設Pod成功執行後Job即結束
- restartPolicy 僅支援Never和OnFailure
- .spec.completions 標識Job結束所需要成功執行的Pod個數,預設為1
- .spec.parallelism 標識並行執行的Pod個數,預設為1
- .spec.activeDeadlineSeconds 為Job的持續時間,不管有多少Pod建立。一旦工作到指定時間,所有的執行pod都會終止且工作狀態將成為type: Failed與reason: DeadlineExceeded。
CronJob
Cron Job 建立是基於時間排程的 Jobs
一個 CronJob 物件就像 crontab (cron table) 檔案中的一行。它用 Cron 格式進行編寫,並週期性地在給定的排程時間執行 Job。
CronJob 限制
CronJob 建立 Job 物件,每個 Job 的執行次數大約為一次。 之所以說 “大約” ,是因為在某些情況下,可能會建立兩個 Job,或者不會建立任何 Job。雖然試圖使這些情況儘量少發生,但不能完全杜絕。因此,Job 應該是冪等的。
CronJob 僅負責建立與其排程時間相匹配的 Job,而 Job 又負責管理其代表的 Pod。
使用案例:
1、在給定時間點排程Job
2、建立週期性執行的Job。如:資料備份、數倉導數、執行任務、郵件傳送、資料拉取、資料推送
特殊說明
.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,則作業將始終至少執行一次。
Job示例
yaml檔案
1 [root@k8s-master controller]# pwd 2 /root/k8s_practice/controller 3 [root@k8s-master controller]# cat job.yaml 4 apiVersion: batch/v1 5 kind: Job 6 metadata: 7 name: pi 8 spec: 9 #completions: 3 # 標識Job結束所需要成功執行的Pod個數,預設為1 10 template: 11 spec: 12 containers: 13 - name: pi 14 image: registry.cn-beijing.aliyuncs.com/google_registry/perl:5.26 15 command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] 16 restartPolicy: Never 17 backoffLimit: 4
建立job,與狀態檢視
1 [root@k8s-master controller]# kubectl apply -f job.yaml 2 job.batch/pi created 3 [root@k8s-master controller]# kubectl get job -o wide 4 NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR 5 pi 0/1 16s 16s pi registry.cn-beijing.aliyuncs.com/google_registry/perl:5.26 controller-uid=77004357-fd5e-4395-9bbb-cd0698e19cb9 6 [root@k8s-master controller]# kubectl get pod -o wide 7 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 8 pi-6zvm5 0/1 ContainerCreating 0 85s <none> k8s-node01 <none> <none>
之後再次檢視
1 [root@k8s-master controller]# kubectl get job -o wide 2 NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR 3 pi 1/1 14m 44m pi registry.cn-beijing.aliyuncs.com/google_registry/perl:5.26 controller-uid=77004357-fd5e-4395-9bbb-cd0698e19cb9 4 [root@k8s-master controller]# kubectl get pod -o wide 5 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 6 pi-6zvm5 0/1 Completed 0 44m 10.244.4.63 k8s-node01 <none> <none> 7 [root@k8s-master controller]# 8 [root@k8s-master controller]# kubectl describe job pi 9 Name: pi 10 Namespace: default 11 Selector: controller-uid=76680f6f-442c-4a09-91dc-c3d4c18465b0 12 Labels: controller-uid=76680f6f-442c-4a09-91dc-c3d4c18465b0 13 job-name=pi 14 Annotations: kubectl.kubernetes.io/last-applied-configuration: 15 {"apiVersion":"batch/v1","kind":"Job","metadata":{"annotations":{},"name":"pi","namespace":"default"},"spec":{"backoffLimit":4," 16 Parallelism: 1 17 Completions: 1 18 Start Time: Tue, 11 Aug 2020 23:34:44 +0800 19 Completed At: Tue, 11 Aug 2020 23:35:02 +0800 20 Duration: 18s 21 Pods Statuses: 0 Running / 1 Succeeded / 0 Failed 22 Pod Template: 23 Labels: controller-uid=76680f6f-442c-4a09-91dc-c3d4c18465b0 24 job-name=pi 25 Containers: 26 pi: 27 Image: registry.cn-beijing.aliyuncs.com/google_registry/perl:5.26 28 Port: <none> 29 Host Port: <none> 30 Command: 31 perl 32 -Mbignum=bpi 33 -wle 34 print bpi(2000) 35 Environment: <none> 36 Mounts: <none> 37 Volumes: <none> 38 Events: 39 Type Reason Age From Message 40 ---- ------ ---- ---- ------- 41 Normal SuccessfulCreate 2m33s job-controller Created pod: pi-6zvm5
並檢視 Pod 的標準輸出
1 [root@k8s-master controller]# kubectl logs --tail 500 pi-6zvm5 2 3.141592653589793238462643383279502884197169399375105820974944592307816406………………
CronJob示例
yaml檔案
1 [root@k8s-master controller]# pwd 2 /root/k8s_practice/controller 3 [root@k8s-master controller]# cat cronjob.yaml 4 apiVersion: batch/v1beta1 5 kind: CronJob 6 metadata: 7 name: hello 8 spec: 9 schedule: "*/1 * * * *" 10 jobTemplate: 11 spec: 12 template: 13 spec: 14 containers: 15 - name: hello 16 image: registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 17 args: 18 - /bin/sh 19 - -c 20 - date; echo Hello from the Kubernetes cluster 21 restartPolicy: OnFailure
啟動cronjob並檢視狀態
1 [root@k8s-master controller]# kubectl apply -f cronjob.yaml 2 cronjob.batch/hello created 3 [root@k8s-master controller]# kubectl get cronjob -o wide 4 NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE CONTAINERS IMAGES SELECTOR 5 hello */1 * * * * False 1 8s 27s hello registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 <none> 6 [root@k8s-master controller]# 7 [root@k8s-master controller]# kubectl get job -o wide 8 NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR 9 hello-1590721020 1/1 2s 21s hello registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 controller-uid=9e0180e8-8362-4a58-8b93-089b92774b5e 10 [root@k8s-master controller]# 11 [root@k8s-master controller]# kubectl get pod -o wide 12 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 13 hello-1590721020-m4fr8 0/1 Completed 0 36s 10.244.4.66 k8s-node01 <none> <none>
幾分鐘之後的狀態資訊
1 [root@k8s-master controller]# kubectl get cronjob -o wide 2 NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE CONTAINERS IMAGES SELECTOR 3 hello */1 * * * * False 0 55s 7m14s hello registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 <none> 4 [root@k8s-master controller]# 5 [root@k8s-master controller]# 6 [root@k8s-master controller]# kubectl get job -o wide 7 NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR 8 hello-1590721260 1/1 1s 3m1s hello registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 controller-uid=0676bd6d-861b-440b-945b-4b2704872728 9 hello-1590721320 1/1 2s 2m1s hello registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 controller-uid=09c1902e-76ef-4731-b3b4-3188961c13e9 10 hello-1590721380 1/1 2s 61s hello registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 controller-uid=f30dc159-8905-4cfc-b06b-f950c8dcfc28 11 [root@k8s-master controller]# 12 [root@k8s-master controller]# kubectl get pod -o wide 13 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 14 hello-1590721320-m4pxf 0/1 Completed 0 2m6s 10.244.4.70 k8s-node01 <none> <none> 15 hello-1590721380-wk7jh 0/1 Completed 0 66s 10.244.2.77 k8s-node02 <none> <none> 16 hello-1590721440-rcx7v 0/1 Completed 0 6s 10.244.4.72 k8s-node01 <none> <none> 17 [root@k8s-master controller]# 18 [root@k8s-master controller]# kubectl describe cronjob hello 19 Name: hello 20 Namespace: default 21 Labels: <none> 22 Annotations: kubectl.kubernetes.io/last-applied-configuration: 23 {"apiVersion":"batch/v1beta1","kind":"CronJob","metadata":{"annotations":{},"name":"hello","namespace":"default"},"spec":{"jobTemplate":{"... 24 Schedule: */1 * * * * 25 Concurrency Policy: Allow 26 Suspend: False 27 Successful Job History Limit: 3 28 Failed Job History Limit: 1 29 Starting Deadline Seconds: <unset> 30 Selector: <unset> 31 Parallelism: <unset> 32 Completions: <unset> 33 Pod Template: 34 Labels: <none> 35 Containers: 36 hello: 37 Image: registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24 38 Port: <none> 39 Host Port: <none> 40 Args: 41 /bin/sh 42 -c 43 date; echo Hello from the Kubernetes cluster 44 Environment: <none> 45 Mounts: <none> 46 Volumes: <none> 47 Last Schedule Time: Wed, 12 Aug 2020 00:01:00 +0800 48 Active Jobs: <none> 49 Events: 50 Type Reason Age From Message 51 ---- ------ ---- ---- ------- 52 Normal SuccessfulCreate 19m cronjob-controller Created job hello-1597160520 53 Normal SawCompletedJob 19m cronjob-controller Saw completed job: hello-1597160520, status: Complete 54 Normal SuccessfulCreate 18m cronjob-controller Created job hello-1597160580 55 Normal SawCompletedJob 18m cronjob-controller Saw completed job: hello-1597160580, status: Complete 56 Normal SuccessfulCreate 17m cronjob-controller Created job hello-1597160640 57 Normal SawCompletedJob 17m cronjob-controller Saw completed job: hello-1597160640, status: Complete 58 Normal SuccessfulCreate 16m cronjob-controller Created job hello-1597160700 59 Normal SuccessfulDelete 16m cronjob-controller Deleted job hello-1597160520 60 Normal SawCompletedJob 16m cronjob-controller Saw completed job: hello-1597160700, status: Complete 61 Normal SuccessfulCreate 15m cronjob-controller Created job hello-1597160760 62 Normal SawCompletedJob 15m cronjob-controller Saw completed job: hello-1597160760, status: Complete 63 Normal SuccessfulDelete 15m cronjob-controller Deleted job hello-1597160580 64 Normal SuccessfulCreate 14m cronjob-controller Created job hello-1597160820 65 Normal SuccessfulDelete 14m cronjob-controller Deleted job hello-1597160640 66 Normal SawCompletedJob 14m cronjob-controller Saw completed job: hello-1597160820, status: Complete 67 Normal SuccessfulCreate 13m cronjob-controller Created job hello-1597160880 68 Normal SawCompletedJob 13m cronjob-controller Saw completed job: hello-1597160880, status: Complete 69 ……………… 70 Normal SawCompletedJob 11m cronjob-controller Saw completed job: hello-1597161000, status: Complete 71 Normal SuccessfulDelete 11m cronjob-controller Deleted job hello-1597160820 72 Normal SawCompletedJob 10m cronjob-controller (combined from similar events): Saw completed job: hello-1597161060, status: Complete 73 Normal SuccessfulCreate 4m13s (x7 over 10m) cronjob-controller (combined from similar events): Created job hello-1597161420
找到最後一次排程任務建立的 Pod, 並檢視 Pod 的標準輸出。請注意任務名稱和 Pod 名稱是不同的。
1 [root@k8s-master controller]# kubectl logs pod/hello-1590721740-rcx7v # 或者 kubectl logs hello-1590721740-rcx7v 2 Fri May 29 03:09:04 UTC 2020 3 Hello from the Kubernetes cluster
刪除 CronJob
1 [root@k8s-master controller]# kubectl get cronjob 2 NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE 3 hello */1 * * * * False 0 32s 19m 4 [root@k8s-master controller]# 5 [root@k8s-master controller]# kubectl delete cronjob hello # 或者 kubectl delete -f cronjob.yaml 6 cronjob.batch "hello" deleted 7 [root@k8s-master controller]# kubectl get cronjob # 可見已刪除 8 No resources found in default namespace.
相關閱讀
1、Kubernetes K8S之資源控制器RC、RS、Deployment詳解
2、Kubernetes K8S之資源控制器StatefulSets詳解
3、Kubernetes K8S之資源控制器Daemonset詳解
4、官網:Jobs
5、官網:CronJob
完畢!
———END———
如果覺得不錯就關注下唄 (-^O^-) !
&n