k8s学习笔记-P28-控制器实践:DaemonSet/Job/CronJob

341 阅读4分钟

教程:尚硅谷Kubernetes教程(K8s入门到精通)_哔哩哔哩_bilibili

笔记摘自视频章节:第四章-p28


主题

控制器实践

  • DaemonSet: 保全部(或者一) Node上运行一个Pod的副本
  • Job: 任务
  • CronJob: 定时任务

操作

DaemonSet

  • 文件:
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: deamonset-example
  labels:
    app: daemonset
spec:
  selector:
    matchLabels:
      name: deamonset-example
  template:
    metadata:
      labels:
        name: deamonset-example
    spec:
      containers:
        - name: daemonset-example
          image: wangyanglinux/myapp:v1
          imagePullPolicy: IfNotPresent
  • 创建daemonset: kubectl create -f p28_daemonset_demo.yaml

我的集群里只有1个Node。为了所以中间又增加了一个 node2,过程省略

  • 查看pod,发现node1和node2上各出现一个daemonset pod。 符合DaemonSet的功能,即保证每个Node上都有一个pod
root@jjh-k8s-demo-master:~/k8s_yaml/bzhan_shangguigu# kubectl get pods -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP           NODE                 NOMINATED NODE   READINESS GATES
deamonset-example-fqkpc             1/1     Running   1          91m   10.244.1.6   jjh-k8s-demo-node1   <none>           <none>
deamonset-example-zcm5x             1/1     Running   0          14m   10.244.0.2   jjh-k8s-node-2       <none>           <none>

Job

  • 文件
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    metadata:
      name: pi
    spec:
      containers:
      - name: pi
        image: perl
        imagePullPolicy: IfNotPresent
        command: [ "perl", "-Mbignum=bpi", "-wle", "print bpi(2000)" ]
      restartPolicy: Never
  • 这个perl镜像比较大。传输镜像过去
# 找一个快一点的主机
docker save  perl -o /tmp/perl.tar

# 在目标node上
scp -i /root/jjh-demo.pem root@172.16.13.128:/tmp/perl.tar perl.tar
docker load -i perl.tar
  • 创建job,监控pod状态,pod状态从running-> complete
root@jjh-k8s-demo-master:~/k8s_yaml/bzhan_shangguigu# kubectl create -f p28_job_demo.yaml
job.batch/pi created

# 
root@jjh-k8s-demo-master:~/k8s_yaml/bzhan_shangguigu# kubectl get pods -o wide -w
NAME       READY   STATUS    RESTARTS   AGE   IP           NODE             NOMINATED NODE   READINESS GATES
pi-dzdp9   1/1     Running   0          3s    10.244.3.3   jjh-k8s-node-2   <none>           <none>
pi-dzdp9   0/1     Completed   0          6s    10.244.3.3   jjh-k8s-node-2   <none>           <none>
pi-dzdp9   0/1     Completed   0          6s    10.244.3.3   jjh-k8s-node-2   <none>           <none>
  • 查看job进度,显示完成
root@jjh-k8s-demo-master:~/k8s_yaml/bzhan_shangguigu# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
pi     1/1           6s         69s
  • 查看执行结果
root@jjh-k8s-demo-master:~/k8s_yaml/bzhan_shangguigu# kubectl logs pi-dzdp9
3.141592653589793238462 后面省略

CronJob

spec说明:

- spec.template格式同Pod
- RestartPolicy支持Never或OnFailure
- 单个Pod时,默认Pod成功运行后Job即结束
- spec.completions标志ob结束需要成功运行的Pod个数,默认为1
- spec.parallelism 标志并行运行的Pod的个数,默认为1
- spec.activeDeadlineSeconds标志失败Pod的重试最大时间,超过这个时间不会继续重试
- spec.schedule:调度,必需宇段,指定任务运行周期,格式同Cron
- spec.jobTemplate: Job模板,必需宇段,指定需要运行的任务,格式同Job
- spec.startingDeadlineSeconds :启动Job的期限(秒级别) ,该宇段是可选的。如果因为任何原因而错过了被调度的时间,那么错过执行时间的Job将被认为是失败的。如果没有指定,则没有期限
- spec.concurrencyPolicy:并发策略,该字段也是可选的。它指定了如何处理被Cron Job 创建的Job的并发执行。只允许指定下面策略中的一种:
    - Allow (默认) :允许并发运行Job
    - Forbid :禁止并发运行,如果前一个还没有完成,则直接跳过下一个
    - Replace:取消当前正在运行的Job,用一个新的来替换**
注意,当前策略只能应用于同一个 Cron Job 创建的Job。如果存在多个Cron Job,它们创建的Job之间总是允许并发运行。
- spec.suspend:挂起,该字段也是可选的。如果设置为true,后续所有执行都会被挂起。它对已经开始执行的Job不起作用。默认值为false.
- spec.successfulJobsHistoryLimit和.spec.failedJobsHistoryLimit :历史限制,是可选的宇段。它们指定了可以保留多少完成和失败的Job。默认情况下,它们分别设置为3和1。设置限制的值为e,相关类型的Job完成后将不会被保留。
  • 文件
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: hello
              image: busybox
              args:
                - bin/sh
                - -c
                - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
  • 创建cronjob,查看cronjob和job,已经出现。等待10分钟,可以看到,只存了3个执行完成的任务。
root@jjh-k8s-demo-master:~/k8s_yaml/bzhan_shangguigu# kubectl create -f p28_cronjob_demo.yaml
The CronJob "hello" is invalid: spec.jobTemplate.spec.template.spec.restartPolicy: Required value: valid values: "OnFailure", "Never"
root@jjh-k8s-demo-master:~/k8s_yaml/bzhan_shangguigu# kubectl get cronjob
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        19s             44s

# 等待若干分钟
root@jjh-k8s-demo-master:~/k8s_yaml/bzhan_shangguigu# kubectl get job
NAME             COMPLETIONS   DURATION   AGE
hello-27464211   1/1           6s         2m47s
hello-27464212   1/1           7s         107s
hello-27464213   1/1           4s         47s
  • 监控pod,也只保留3个
root@jjh-k8s-demo-master:/tmp# kubectl get job
NAME             COMPLETIONS   DURATION   AGE
hello-27464191   1/1           10s        3m2s
hello-27464192   1/1           7s         2m2s
hello-27464193   1/1           7s         62s
hello-27464194   0/1           2s         2s
root@jjh-k8s-demo-master:/tmp# kubectl get job
NAME             COMPLETIONS   DURATION   AGE
hello-27464192   1/1           7s         2m9s
hello-27464193   1/1           7s         69s
hello-27464194   1/1           5s         9s
  • 查看执行结果: 执行成功
root@jjh-k8s-demo-master:/tmp# kubectl logs hello-27464194-pksxt
Mon Mar 21 08:34:03 UTC 2022
Hello from the Kubernetes cluster