Kubernetes Jobs 和 CronJobs 入门指南

使用 Jobs 和 CronJobs 来控制和管理 Kubernetes Pod 和容器。
113 位读者喜欢此文章。
Ships at sea on the web

Kubernetes 是容器的默认编排引擎。 它具有以下选项来控制和管理 Pod 和容器:

  1. Deployments(部署)
  2. StatefulSets(有状态集)
  3. ReplicaSets(副本集)

这些特性中的每一个都有其自身的用途,共同的功能是确保 Pod 持续运行。 在故障情况下,这些控制器会重新启动或重新调度 Pod,以确保 Pod 中的服务继续运行。

正如Kubernetes 文档解释的那样,Kubernetes Job 创建一个或多个 Pod,并确保在任务(Job)完成时终止指定数量的 Pod。

就像在典型的操作系统中一样,在 Kubernetes 世界中,无需用户交互即可执行自动化的计划作业的能力非常重要。但是 Kubernetes Jobs 不仅仅是运行自动化作业,并且可以通过以下方式使用它们:

  1. Jobs
  2. CronJobs
  3. 工作队列(这超出了本文的范围)

听起来很简单,对吧? 也许吧。 任何从事容器和微服务应用程序工作的人都知道,有些应用程序需要临时服务,以便它们可以为应用程序或 Kubernetes 集群执行特定任务。

在本文中,我将深入探讨 Kubernetes Jobs 为什么重要,如何创建 Jobs 和 CronJobs,以及何时将它们用于在 Kubernetes 集群上运行的应用程序。

Kubernetes Jobs 和 CronJobs 之间的区别

Kubernetes Jobs 用于创建执行分配给它们的特定任务的临时 Pod。CronJobs 做同样的事情,但是它们根据定义的计划运行任务。

Jobs 在 Kubernetes 中扮演着重要的角色,尤其是在运行批处理进程或重要的临时操作时。 Jobs 与其他 Kubernetes 控制器的不同之处在于,它们运行任务直到完成,而不是管理所需的状态,例如在 Deployments、ReplicaSets 和 StatefulSets 中。

如何创建 Kubernetes Jobs 和 CronJobs

掌握了这些背景知识,您就可以开始创建 Jobs 和 CronJobs 了。

先决条件

要进行此练习,您需要具备以下条件:

  1. 一个可用的 Kubernetes 集群;您可以使用以下方式安装它:
  2. kubectl Kubernetes 命令行工具

这是我用于此演示的 Minikube 部署

$ minikube version
minikube version: v1.8.1

$ kubectl cluster-info
Kubernetes master is running at https://172.17.0.59:8443
KubeDNS is running at https://172.17.0.59:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

$ kubectl get nodes
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   88s   v1.17.3

Kubernetes Jobs

就像 Kubernetes 世界中的任何其他事物一样,您可以使用定义文件创建 Kubernetes Jobs。 使用您喜欢的编辑器创建一个名为 sample-jobs.yaml 的文件。

以下是您可以用来创建示例 Kubernetes Job 的文件片段

apiVersion: batch/v1          ## The version of the Kubernetes API
kind: Job                     ## The type of object for jobs
metadata:
 name: job-test
spec:                         ## What state you desire for the object
 template:
   metadata:
     name: job-test
   spec:
     containers:
     - name: job
       image: busybox                  ##  Image used
       command: ["echo", "job-test"]   ##  Command used to create logs for verification later
     restartPolicy: OnFailure          ##  Restart Policy in case container failed

接下来,将 Jobs 应用到集群中

$ kubectl apply -f sample-jobs.yaml

等待几分钟以创建 Pod。 您可以查看 Pod 创建的状态

$ kubectl get pod –watch

几秒钟后,您应该看到您的 Pod 已成功创建

$ kubectl get pods
  NAME              	READY   STATUS  	RESTARTS  	 AGE
  job-test		        0/1 	Completed    	0  	     11s

创建 Pod 后,验证 Job 的日志

$ kubectl logs job-test job-test

您已经创建了您的第一个 Kubernetes Job,您可以探索有关它的详细信息

$ kubectl describe job job-test

清理 Jobs

$ kubectl delete jobs job-test

Kubernetes CronJobs

您可以将 CronJobs 用于需要在预定义的时间表上执行的集群任务。正如文档解释的那样,它们对于定期和重复性任务很有用,例如运行备份、发送电子邮件或为特定时间安排单个任务,例如当您的集群可能处于空闲状态时。

与 Jobs 一样,您可以通过定义文件创建 CronJobs。 以下是 CronJob 文件 cron-test.yaml 的片段。 使用此文件创建一个示例 CronJob

apiVersion: batch/v1beta1            ## The version of the Kubernetes API
kind: CronJob                        ## The type of object for Cron jobs
metadata:
  name: cron-test
spec:
  schedule: "*/1 * * * *"            ## Defined schedule using the *nix style cron syntax
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cron-test
            image: busybox            ## Image used
            args:
            - /bin/sh
            - -c
            - date; echo Hello this is Cron test
          restartPolicy: OnFailure    ##  Restart Policy in case container failed

将 CronJob 应用到您的集群

$ kubectl apply -f cron-test.yaml
 cronjob.batch/cron-test created

验证是否使用定义文件中的计划创建了 CronJob

$ kubectl get cronjob cron-test
 NAME        SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
 cron-test   */1 * * * *   False     0        <none>          10s

几秒钟后,您可以找到上次计划的作业创建的 Pod,并查看其中一个 Pod 的标准输出

$ kubectl logs cron-test-1604870760
  Sun Nov  8 21:26:09 UTC 2020
  Hello from the Kubernetes cluster

您已经创建了一个 Kubernetes CronJob,该 CronJob 基于 schedule: "*/1 * * * *" 计划每次执行创建一个对象。 有时,由于集群中的环境问题,可能会错过创建。 因此,它们需要是幂等的。

其他需要知道的事情

与 Kubernetes 中的 Deployments 和 Services 不同,您不能更改同一个 Job 配置文件并立即重新应用它。 当您更改 Job 配置文件时,必须先从集群中删除之前的 Job,然后才能应用它。

通常,创建 Job 会创建一个 Pod 并执行给定的任务,如上例所示。 但是通过使用 completions 和 parallelism,您可以一个接一个地启动多个 Pod。

使用您的 Jobs

您可以使用 Kubernetes Jobs 和 CronJobs 来管理您的容器化应用程序。 在 Kubernetes 应用程序部署模式中,Jobs 非常重要,您需要一个通信机制以及 Pod 和平台之间的交互。 这可能包括应用程序需要“控制器”或“观察者”来完成任务或需要计划定期运行的情况。

接下来阅读什么
标签
ID
Mike Calizo 是 Elastic.co 的首席客户成功经理,专注于政府客户,位于澳大利亚堪培拉。 Mike 认为“数据就是力量”,利用这种力量可以改进组织,利用自己的见解进行创新,并通过成本优化策略来提高效率。

评论已关闭。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.