美文网首页
k8s job&cronjob&daemonset

k8s job&cronjob&daemonset

作者: Wu杰语 | 来源:发表于2021-10-03 21:59 被阅读0次

    k8s中设计了job、cronjob和daemonset这样的几个workload resource,应用于一些特殊的任务场景。

    job

    job顾名思义就是任务,其定义为
    A Job creates one or more Pods and will continue to retry execution of the Pods until a specified number of them successfully terminate.
    如这个例子

    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
    

    这个job是计算pi,执行完成后用kubectl get pods查看pod的id,然后使用kubectl logs jobid,可以看到pi的计算结果。

    3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901
    

    job有几个场景化的关键参数

    • restartPolicy:Never,表示永不重试
    • restartPolicy:Never, backoffLimit: 4,表示如果失败,最大重试次数是4
    • activeDeadlineSeconds:100, 表示pod最多可运行100秒
    • completions:8,parallelism:2,表示完成8次,同时只能有2个job并行运行
    cronjob

    看到cronjob,马上就可以对应到到jaba的cron组件,定时任务。
    如下例子

    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: hello
    spec:
      schedule: "*/1 * * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: hello
                image: busybox
                imagePullPolicy: IfNotPresent
                command:
                - /bin/sh
                - -c
                - date; echo Hello from the Kubernetes cluster
              restartPolicy: OnFailure
    

    这个yaml描述了一个定时任务,定时任务每分钟产生一个pod执行任务,使用kubectl log可以看到打印的日志

    Hello from the Kubernetes cluster
    
    

    这里主要要看到时间怎么定义的

    #      ┌────────────────── timezone (optional)
    #      |      ┌───────────── minute (0 - 59)
    #      |      │ ┌───────────── hour (0 - 23)
    #      |      │ │ ┌───────────── day of the month (1 - 31)
    #      |      │ │ │ ┌───────────── month (1 - 12)
    #      |      │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
    #      |      │ │ │ │ │                                   7 is also Sunday on some systems)
    #      |      │ │ │ │ │
    #      |      │ │ │ │ │
    # CRON_TZ=UTC * * * * *
    
    daemonset

    daemon负责守护,和linux中的daemon进程是一样的,为每个node启动一个守护pods,如下例子

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: fluentd-elasticsearch
      namespace: kube-system
      labels:
        k8s-app: fluentd-logging
    spec:
      selector:
        matchLabels:
          name: fluentd-elasticsearch
      template:
        metadata:
          labels:
            name: fluentd-elasticsearch
        spec:
          tolerations:
          # this toleration is to have the daemonset runnable on master nodes
          # remove it if your masters can't run pods
          - key: node-role.kubernetes.io/master
            operator: Exists
            effect: NoSchedule
          containers:
          - name: fluentd-elasticsearch
            image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
            resources:
              limits:
                memory: 200Mi
              requests:
                cpu: 100m
                memory: 200Mi
            volumeMounts:
            - name: varlog
              mountPath: /var/log
            - name: varlibdockercontainers
              mountPath: /var/lib/docker/containers
              readOnly: true
          terminationGracePeriodSeconds: 30
          volumes:
          - name: varlog
            hostPath:
              path: /var/log
          - name: varlibdockercontainers
            hostPath:
              path: /var/lib/docker/containers
    

    运行这个yaml,会在node上启动日志收集功能的守护pod

    小结

    job是任务、cronjob是定时任务、daemonset是为每个node启动守护pod,各有各的使用场景,例如说cronjob在ci中可以执行定义任务,是非常有用的。

    相关文章

      网友评论

          本文标题:k8s job&cronjob&daemonset

          本文链接:https://www.haomeiwen.com/subject/cuybnltx.html