跳转至

Job

什么是 Job

  • 对于ReplicaSet而言,它希望pod保持预期数目、持久运行下去,除非用户明确删除,否则这些对象一直存在,它们针对的是耐久性任务,如web服务等。

  • 对于非耐久性任务,比如压缩文件,任务完成后,pod需要结束运行,不需要pod继续保持在系统中,这个时候就要用到Job。

  • Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。

使用 job 计算圆周率 2000 位

使用 job 计算圆周率 2000 位

  1. 编写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   # 执行完后不再重启
2. 应用 YAML 文件创建 job

[root@k8smaster001 ~]# kubectl apply -f job.yaml 
job.batch/pi created
3. 验证

[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

  1. 编写YAML文件

job2.yaml
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
2. 应用 YAML 文件创建 job

[root@k8smaster001 ~]# kubectl apply -f job2.yaml 
job.batch/busybox-job created
3. 验证

[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