Job ¶
什么是 Job
-
对于ReplicaSet而言,它希望pod保持预期数目、持久运行下去,除非用户明确删除,否则这些对象一直存在,它们针对的是耐久性任务,如web服务等。
-
对于非耐久性任务,比如压缩文件,任务完成后,pod需要结束运行,不需要pod继续保持在系统中,这个时候就要用到Job。
-
Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。
使用 job 计算圆周率 2000 位 ¶
使用 job 计算圆周率 2000 位
- 编写YAML文件
apiVersion: batch/v1
kind: Job
metadata:
name: pi # job名
spec:
template:
metadata:
name: pi # pod名
spec:
containers:
- name: pi # 容器名
image: perl
imagePullPolicy: IfNotPresent
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never # 执行完后不再重启
[root@k8smaster001 ~]# kubectl apply -f job.yaml
job.batch/pi created
[root@k8smaster001 ~]# kubectl get job
NAME COMPLETIONS DURATION AGE
pi 1/1 2m34s 3m16s
pod 执行成功一次就结束,为 Completed 状态,也不再是 ready 状态
[root@k8smaster001 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pi-b9hmz 0/1 Completed 0 4m24s
[root@k8smaster001 ~]# kubectl logs pi-b9hmz
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901
创建固定次数 job ¶
创建固定次数 job
- 编写YAML文件
job2.yaml
2. 应用 YAML 文件创建 job
apiVersion: batch/v1
kind: Job
metadata:
name: busybox-job
spec:
completions: 10 # 执行job的次数
parallelism: 1 # 执行job的并发数
template:
metadata:
name: busybox-job-pod
spec:
containers:
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command: ["echo", "hello"]
restartPolicy: Never
[root@k8smaster001 ~]# kubectl apply -f job2.yaml
job.batch/busybox-job created
[root@k8smaster001 ~]# kubectl get job
NAME COMPLETIONS DURATION AGE
busybox-job 10/10 64s 3m3s
[root@k8smaster001 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox-job-2dpwl 0/1 Completed 0 104s
busybox-job-btw8r 0/1 Completed 0 94s
busybox-job-f9tcf 0/1 Completed 0 97s
busybox-job-gnpzd 0/1 Completed 0 84s
busybox-job-gpp8k 0/1 Completed 0 107s
busybox-job-hrsl6 0/1 Completed 0 91s
busybox-job-hzs2s 0/1 Completed 0 101s
busybox-job-lzjqv 0/1 Completed 0 81s
busybox-job-qzw7l 0/1 Completed 0 2m21s
busybox-job-x86pq 0/1 Completed 0 87s
一次性备份 MySQL 数据库 ¶
通过Job控制器创建应用备份MySQL数据库
1. MySQL数据库准备
1. 编写数据库文件 00_mysql.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-test
namespace: default
spec:
ports:
- port: 3306
name: mysql
clusterIP: None
selector:
app: mysql-dump
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: db
namespace: default
spec:
selector:
matchLabels:
app: mysql-dump
serviceName: "mysql-test"
template:
metadata:
labels:
app: mysql-dump
spec:
nodeName: k8sworker001
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "111111"
ports:
- containerPort: 3306
volumeMounts:
- mountPath: "/var/lib/mysql"
name: mysql-data
volumes:
- name: mysql-data
hostPath:
path: /opt/mysqldata
2. 查看调用过程
[root@k8smaster001 1]# kubectl describe pod
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Pulling 2m38s kubelet Pulling image "mysql:5.7"
Normal Pulled 74s kubelet Successfully pulled image "mysql:5.7" in 1m24.279s (1m24.279s including waiting)
Normal Created 74s kubelet Created container mysql
Normal Started 74s kubelet Started container mysql
3. 查看结果
[root@k8smaster001 1]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE
db-0 1/1 Running 0 7s 10.244.87.227 k8sworker001
2. 创建用于实现任务的资源清单文件
1. 编写 Job 文件 02_job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: mysql-dump
spec:
template:
metadata:
name: mysql-dump
spec:
nodeName: k8sworker001
containers:
- name: mysql-dump
image: mysql:5.7
command: ["/bin/sh","-c","mysqldump --host=mysql-test -uroot -p111111 --databases mysql > /root/mysql2024.sql"]
volumeMounts:
- mountPath: "/root"
name: mysql-data
restartPolicy: Never
volumes:
- name: mysql-data
hostPath:
path: /opt/mysqldump
2. 查看已经执行结束
[root@k8smaster001 1]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP
mysql-dump-zb7sf 0/1 Completed 0 4m29s 10.244.87.232
3. 查看 job 生成的 备份文件
[root@k8sworker001 mysqldump]# pwd
/opt/mysqldump
[root@k8sworker001 mysqldump]# ls
mysql2024.sql