DaemonSet与Job(10)

介绍了DaemonSet与Job,这是和Deployment有所区别的Pod控制器,本章节我们将掌握这几种对象的特性和使用方式。
 描述DaemonSet特性和使用方式
 区分Job和CronJob
 使用Job和CronJob

  1. DaemonSet
  2. Job
  3. CronJob

1. DaemonSet

1.1 Kube-proxy的特殊性

  • 在Kubernetes组件章节中,我们介绍了kube-proxy组件,它被封装在pod中,并且时刻运行在每个Node节点中。
  • Replicaset侧重保证pod数量的恒定,那该如何实现kube-proxy类应用的调度?
    通过DaemonSet实现在每一个节点的部署
NAME                                 READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
kube-proxy-bcc2z                     1/1     Running   28         27d   192.168.227.10   k8s-master   <none>           <none>
kube-proxy-c7kf4                     1/1     Running   15         27d   192.168.227.11   k8s-node1    <none>           <none>
kube-proxy-qpttz                     1/1     Running   17         27d   192.168.227.12   k8s-node2    <none>           <none>

1.2 DaemonSet的特性

  • DaemonSet 部署的副本Pod会分布在各个Node上。当有 Node 加入集群时,也会为他们新增一个 Pod。当有 Node 从集群移除时,这些 Pod 也会被回收。删除DaemonSet 将会删除它创建的所有 Pod。
  • DaemonSet典型场景:
     在集群的每个节点上运行存储Daemon,如glusterd,ceph。
     在每个节点上运行日志收集Daemon,如flunentd或logstash。
     在每个节点上运行监控Daemon,如Prometheus Node Exporter。

1.3 创建DaemonSet

  • 创 建 DaemonSet 的 yaml 文 件 和 创 建deployment使用的类似。
  • 类型(kind)选择DaemonSet。
  • DaemonSet的yaml文件不需要副本数量项。
  • 默认情况下 , DaemonSet 会 在 所 有Node上创建Pod。
[root@k8s-master tmp]# cat /tmp/daemoset.yaml 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-daemonset
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

[root@k8s-master tmp]# k apply -f /tmp/daemoset.yaml 
daemonset.apps/nginx-daemonset created
[root@k8s-master tmp]# k get pod -o wide
NAME                     READY   STATUS             RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
nginx-daemonset-966k2    1/1     Running            0          59s   10.244.1.42   k8s-node1   <none>           <none>
nginx-daemonset-q6vh2    1/1     Running            0          59s   10.244.2.54   k8s-node2   <none>           <none>
业务容器不会运行在master节点

系统pod中有kube-Proxy 和 kube-flannel采用的daemonset模式进行部署

[root@k8s-master tmp]# k get daemonsets. -n kube-system 
NAME                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                     AGE
kube-flannel-ds-amd64     3         3         3       3            3           beta.kubernetes.io/arch=amd64     27d
kube-flannel-ds-arm       0         0         0       0            0           beta.kubernetes.io/arch=arm       27d
kube-flannel-ds-arm64     0         0         0       0            0           beta.kubernetes.io/arch=arm64     27d
kube-flannel-ds-ppc64le   0         0         0       0            0           beta.kubernetes.io/arch=ppc64le   27d
kube-flannel-ds-s390x     0         0         0       0            0           beta.kubernetes.io/arch=s390x     27d
kube-proxy                3         3         3       3            3           <none>                            27d
注意 daemonset的操作与deployment的操作一致,可以进行版本升级和回滚
1.4 DaemonSet查看
  • 创建完成后,可以在Node1和Node2上分别看到一个pod。
  • 如将其中一个pod强制删除,daemonset会自动启动一个新的pod
  • 当kubernetes集群出现节点故障时,daemonset中的pod数量会减少,不会像deployment一样将受到影响的pod在其他节点启动

2. job

2.1 一次性任务场景

  • 通过Deployment我们可以部署常驻型应用,它可以保证pod数量保证应用的实时可用,也可以通过灵活的扩缩容让业务处于最佳状态。
  • 通过DaemonSet我们可以部署守护进程,它使得每个node上运行着一个固定pod。
  • 应该使用哪种方式解决如下问题?
    pod上的任务只执行一次,执行结束后回收pod资源


    image.png

2.2 运行一个Job

  • 相对于Deployment和DaemonSet通常提供持续的服务,Job执行一次性任务
  • 类型(kind)选择Job
  • restartPolicy只能选择Never或OnFailure
  • backoffLimit:参数指定job失败后进行重试的次数
    restartPolicy 还有always选项,表名运行完该pod一直处于运行状态,不会回收。如果只运行一次,只能选择never或者onfailure
[root@k8s-master tmp]# cat /tmp/jobs.yaml 
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]  
      restartPolicy: Never
  backoffLimit: 4

2.3 查看Job

  • 运行job后,查看状态
[root@k8s-master tmp]# k get jobs.batch 
NAME       COMPLETIONS   DURATION   AGE
lablepod   1/1           17h        12d
pi         0/1           9s         9s
[root@k8s-master tmp]# k get pod -w
NAME                     READY   STATUS              RESTARTS   AGE
lablepod-fln79           0/1     Completed           2          12d
myapp-pod                1/1     Running             53         24d
mydep-65bbdb4c9f-bvwmp   1/1     Running             14         25d
mydep-65bbdb4c9f-sswdr   1/1     Running             15         25d
mydep-65bbdb4c9f-swgvz   1/1     Running             14         26d
mypod                    0/1     ImagePullBackOff    0          25d
nginx-daemonset-966k2    1/1     Running             0          25m
nginx-daemonset-q6vh2    1/1     Running             0          25m
pi-8ggjj                 0/1     ContainerCreating   0          19s
  • 过一段时间后继续查看状态,completions状态从“0/1”变为“1/1”,表示任务
    已经完成
[root@k8s-master tmp]# k get jobs.batch 
NAME       COMPLETIONS   DURATION   AGE
lablepod   1/1           17h        13d
pi         1/1           84s        3h13m
  • 查看job使用的pod状态,发现pod已经运行完成并且关闭
[root@k8s-master tmp]# k get pod
NAME                     READY   STATUS             RESTARTS   AGE
lablepod-fln79           0/1     Completed          2          13d
myapp-pod                1/1     Running            57         25d
mydep-65bbdb4c9f-bvwmp   1/1     Running            14         26d
mydep-65bbdb4c9f-sswdr   1/1     Running            15         26d
mydep-65bbdb4c9f-swgvz   1/1     Running            14         26d
mypod                    0/1     ImagePullBackOff   0          25d
nginx-daemonset-966k2    1/1     Running            0          3h39m
nginx-daemonset-q6vh2    1/1     Running            0          3h39m
pi-8ggjj                 0/1     Completed          0          3h14m
  • 使用kubectl logs命令可以查看该Job运行结果
[root@k8s-master tmp]# k logs pi-8ggjj
3.14159265358979323846264338

3 CronJob

3.1 运行cronjob

  • 在日常应用中,有一种常见场景是需要Job在指定时间或周期运行,这种类
    型我们称其为Cron Job,主要管理基于时间的Job。
     在给定时间点只运行一次
     在给定时间点周期性地运行
  • 使用配置文件创建Cron Job。

3.2 Schedule参数配置

  • Schedule的格式和linux中crontab命令类似


    image.png
  • 如果需要在每个小时的第15分钟执行任务
15 * * * *
  • 如果需要每15分钟执行一次任务
*/15 * * * *

3.3 示例

[root@k8s-master ~]# cat /tmp/cronjob.yaml 
apiVersion: batch/v1beta1
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

每过1分钟会新建立一个pod

[root@k8s-master ~]# k get pod -w
NAME                     READY   STATUS             RESTARTS   AGE
lablepod-fln79           0/1     Completed          2          13d
myapp-pod                1/1     Running            60         25d
mydep-65bbdb4c9f-bvwmp   1/1     Running            16         26d
mydep-65bbdb4c9f-sswdr   1/1     Running            17         26d
mydep-65bbdb4c9f-swgvz   1/1     Running            16         26d
mypod                    0/1     ImagePullBackOff   0          25d
nginx-daemonset-966k2    1/1     Running            2          20h
nginx-daemonset-q6vh2    1/1     Running            2          20h
pi-8ggjj                 0/1     Completed          0          20h
NAME                     AGE
mypod                    25d
mypod                    25d
hello-1645667400-mpdz6   0s
hello-1645667400-mpdz6   0s
hello-1645667400-mpdz6   0s
hello-1645667400-mpdz6   2s
hello-1645667460-qxtrm   0s
[root@k8s-master ~]# k logs hello-1645667400-mpdz6
Thu Feb 24 01:50:05 UTC 2022
Hello from the Kubernetes cluster
[root@k8s-master ~]# k logs hello-1645667460-qxtrm
Thu Feb 24 01:51:20 UTC 2022
Hello from the Kubernetes cluster
[root@k8s-master ~]#

时间是以格林尼治时间为准,crontab 时间也是以格林尼治时间为准

[root@k8s-master ~]# timedatectl 
      Local time: 四 2022-02-24 09:58:21 CST
  Universal time: 四 2022-02-24 01:58:21 UTC
        RTC time: 四 2022-02-24 01:58:23
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: n/a
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
[root@k8s-master ~]# timedatectl 
      Local time: 四 2022-02-24 09:58:22 CST
  Universal time: 四 2022-02-24 01:58:22 UTC
        RTC time: 四 2022-02-24 01:58:23
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: n/a
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • DaemonSet控制器:概念、原理 1.1DaemonSet 概述 DaemonSet 控制器能够确保k8s集群...
    菜头_355f阅读 4,392评论 0 0
  • 容器技术概念入门篇 从进程说开去 容器本身没有价值,有价值的是“容器编排”。 容器其实是一种沙盒技术。顾名思义,沙...
    白板时钟阅读 7,477评论 0 2
  • 文章是基于“Kubernetes权威指南”和博客[https://kuboard.cn/learning/]的学习...
    彦帧阅读 4,788评论 0 1
  • K8S一、二进制搭建1.安装要求(1)CentOS 7(2)禁止swap(3)集群间互通 2.操作系统初始化(1)...
    Saka_2859阅读 3,301评论 0 0
  • Kubernetes 前言   Kubernetes,又称为 k8s(首字母为 k、首字母与尾字母之间有 8 个字...
    于露612阅读 4,400评论 0 0