当前位置: 欣欣网 > 码农

【运维干货分享】如何创建kubernetes jobs和cronjobs入门指南

2024-09-03码农


此 kubernetes 教程介绍了如何创建 kubernetes 作业和 cronjobs,以及其基础知识、用例以及一些提示和技巧。

以下是你将从本教程中学到的内容。

什么是 Kubernetes 作业?

Kubernetes 作业和 cronjobs 是 Kubernetes 对象,主要用于短期和批处理工作负载。

Kubernetes Job 对象基本上部署了一个 Pod,但它是为完成而运行的,而不是像 deployment、replicasets、replication controllers 和 DaemonSets 这样的对象连续运行。

这意味着,作业会一直运行,直到作业中指定的任务完成,如果 Pod 提供退出代码0,则作业将退出。该任务可以是 shell 脚本执行、API 调用或执行数据转换并将其上传到云存储的 java python 执行。

而在正常的 Kubernetes 部署中,无论退出代码如何,部署对象都会在终止或引发错误时创建新的 Pod,以保持部署的所需状态。

在 Job 运行期间,如果托管 Pod 的节点发生故障,则 Job Pod 将自动重新调度到另一个节点。

Kubernetes Jobs & CronJobs用例

Kubernetes 作业的最佳用例是:

  • 批处理:假设你希望每天运行一次或按特定计划运行批处理任务。它可以是从存储或数据库中读取文件,并将它们提供给服务来处理文件。

  • 操作/临时任务:假设你想运行一个脚本/代码来运行数据库清理活动,甚至备份 kubernetes 集群本身。

  • 在我参与的一个项目中,我们广泛使用 Kubernetes 作业来处理 ETL 工作负载。

  • 如何创建 Kubernetes 作业

    在此示例中,我将使用一个 Ubuntu 容器,该容器运行一个 shell 脚本,该脚本具有一个 for 循环,该循环根据你传递给容器的参数回显消息。参数应该是一个数字,它决定循环运行以回显消息的次数。

    例如,如果你将 100 作为参数传递,shell 脚本将回显消息 100 次,容器将退出。

    你可以从这里查看 Dockerfile 和 shell 脚本

    FROM ubuntu:latest
    COPY script.sh /script.sh 
    RUN chmod +x script.sh
    ENTRYPOINT ["/script.sh"]

    #! /bin/bash

    LOOP_COUNT=$1
    echo"This Job will echo message $1 times"
    for ((i=1;i<=$LOOP_COUNT;i++)); 
    do
    sleep 2
    echo$i] Hey I will run till the job completes.
    done

    让我们通过简单的设置开始 Job。

    步骤1: 使用我们的自定义 Docker 镜像创建一个job.yaml文件,并将 100 作为命令参数。值 100 将作为参数传递给 docker ENTRYPOINT 脚本。

    apiVersion: batch/v1 
    kind: Job 
    metadata:
    name: kubernetes-job-example
    labels:
    jobgroup: jobexample 
    spec:
    template:
    metadata:
    name: kubejob
    labels:
    jobgroup: jobexample
    spec:
    containers:
    - name: c
    image: devopscube/kubernetes-job-demo:latest
    args: ["100"]
    restartPolicy: OnFailure

    步骤2:让我们使用 kubectl 和该文件创建一个作业。作业将部署在命名空间中。job.yamldefault

    kubectl apply -f job.yaml

    步骤3:使用 kubectl 检查作业的状态。

    kubectl get jobs

    步骤4: 现在,使用 kubectl 的 Pod 列表。

    kubectl get po

    步骤5:你可以使用 kubectl 获取作业 Pod 日志。将 Pod 名称替换为你在输出中看到的 Pod 名称。

    kubectl logs kubernetes-job-example-bc7s9 -f

    你应该会看到如下所示的输出。

    Kubernetes 作业和 cronjob 演示

    多个 Job Pod 和并行度

    部署作业后,你可以使其在多个 Pod 上运行,并具有并行性。

    例如,在作业中,如果要运行 6 个 Pod 并并行运行 2 个 Pod,则需要将以下两个参数添加到作业清单中。

    completions: 6
    parallelism: 2

    该作业将并行运行 2 个 Pod 3 次,以实现 6 次完成。

    下面是包含这些参数的清单文件。

    apiVersion: batch/v1
    kind: Job
    metadata:
    name: kubernetes-parallel-job
    labels:
    jobgroup: jobexample
    spec:
    completions: 6
    parallelism: 2
    template:
    metadata:
    name: kubernetes-parallel-job
    labels:
    jobgroup: jobexample
    spec:
    containers:
    - name: c
    image: devopscube/kubernetes-job-demo:latest
    args: ["100"]
    restartPolicy: OnFailure

    并行 Pod 处理的一个用例是对消息队列的批处理操作。假设你有一个消息队列,其中包含数千条消息,需要在一天的特定时间处理。

    你可以将消息处理代码作为具有并行度的作业运行,以加快处理速度。即使所有 Pod 都使用相同的消息处理代码,每个 Pod 也会处理队列中的不同消息。

    为 Kubernetes 作业生成随机名称

    你不能拥有单个任务清单文件并从中创建多个任务。Kubernetes 将引发错误,指出存在同名的作业。

    要避免此问题,可以将 name 参数添加到元数据中。generateName

    例如

    apiVersion: batch/v1
    kind: Job
    metadata:
    generateName: kube-job-
    labels:
    jobgroup: jobexample

    在上面的示例中,每次运行清单时,都会创建一个作业,其前缀后跟一个随机字符串。kube-job-

    如何创建 Kubernetes CronJob

    如果你想按特定计划(例如,每 2 小时)运行批处理作业,该怎么办。你可以使用 cron 表达式创建 Kubernetes cronjob。该作业将按照你在作业中提到的计划自动启动。

    以下是我们指定 cron 计划的方法。你可以使用 crontab 生成器生成自己的计划。

    schedule: "0,15,30,45 * * * *"

    下图显示了 kubernetes cronjob 调度语法。

    如果我们每 15 分钟将上一个作业作为 cronjob 运行一次,则它看起来像下面给出的清单。

    创建一个名为 的文件并复制以下清单。cron-job.yaml

    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
    name: kubernetes-cron-job
    spec:
    schedule: "0,15,30,45 * * * *"
    jobTemplate:
    spec:
    template:
    metadata:
    labels:
    app: cron-batch-job
    spec:
    restartPolicy: OnFailure
    containers:
    - name: kube-cron-job
    image: devopscube/kubernetes-job-demo:latest
    args: ["100"]

    让我们使用 kubectl 部署 cronjob。

    kubectl create -f cron-job.yaml

    列出 cronjob

    kubectl get cronjobs

    要检查 Cronjob 日志,你可以列出 cronjob Pod,并从处于运行状态的 Pod 或已完成的 Pod 中获取日志。

    手动运行 Kubernetes CronJob

    在某些情况下,你可能希望以临时方式执行 cronjob。你可以通过从现有 cronjob 创建 job 来执行此操作。

    例如,如果你想手动触发一个 cronjob,这就是我们应该做的。

    kubectl create job --from=cronjob/kubernetes-cron-job manual-cron-job
    --from=cronjob/kubernetes-cron-job将复制 cronjob 模板并创建一个名为manual-cron-job

    几个关键的 Kubernetes Job 参数

    根据你的需要,你还可以将更多关键参数用于 kubernetes jobs/cronjobs。让我们来看看每一个。

  • failedJobHistoryLimit & successfulJobsHistoryLimit:根据你提供的保留号删除失败和成功的作业历史记录。这对于在尝试列出作业时修剪所有失败的条目非常有用。例如

  • failedJobHistoryLimit: 5 successfulJobsHistoryLimit: 10 backoffLimit:Pod 失败时的重试总数。

  • activeDeadlineSeconds 的 如果要指定 cronjob 运行时间的硬性限制,则可以使用此参数。例如,如果你只想运行 cronjob 一分钟,则可以将其设置为 60。

  • 监控 Kubernetes 作业和 Cronjobs

    Kube 状态指标提供了一些指标来监控 kubernetes 作业和 cronjobs。默认情况下,它不随集群一起提供。你需要单独设置 Kube 状态指标。

    有关支持的指标,请参阅 cronjob metrics 文档。

    你可以通过 Prometheus 监控堆栈利用这些指标,并使用 Grafana 对其进行可视化。

    如果要监控 Jobs 或 Cronjobs 生成的自定义指标,则需要使用 Prometheus 推送网关来获取 Prometheus 上的所有指标。