使用 Jobs 和 CronJobs 运行 Pods

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在 Kubernetes 中,Jobs 和 CronJobs 用于运行不属于长期运行的应用程序或服务的任务。Jobs 用于一次性任务,而 CronJobs 用于需要定期运行的任务。

在本实验中,我们将学习如何在 Kubernetes 中使用 Jobs 和 CronJobs 运行 Pods。我们将从一个简单的示例开始,逐步构建更复杂的示例。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicsGroup(["`Basics`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicCommandsGroup(["`Basic Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/AdvancedCommandsGroup(["`Advanced Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["`Troubleshooting and Debugging Commands`"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("`Initialization`") kubernetes/BasicCommandsGroup -.-> kubernetes/get("`Get`") kubernetes/BasicCommandsGroup -.-> kubernetes/create("`Create`") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("`Apply`") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/logs("`Logs`") subgraph Lab Skills kubernetes/initialization -.-> lab-11300{{"`使用 Jobs 和 CronJobs 运行 Pods`"}} kubernetes/get -.-> lab-11300{{"`使用 Jobs 和 CronJobs 运行 Pods`"}} kubernetes/create -.-> lab-11300{{"`使用 Jobs 和 CronJobs 运行 Pods`"}} kubernetes/apply -.-> lab-11300{{"`使用 Jobs 和 CronJobs 运行 Pods`"}} kubernetes/logs -.-> lab-11300{{"`使用 Jobs 和 CronJobs 运行 Pods`"}} end

启动 Minikube 集群

在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个轻量级的 Kubernetes 环境,可以在你的本地机器上运行。

  1. 导航到工作目录

    打开终端并导航到默认的项目文件夹:

    cd /home/labex/project
  2. 启动 Minikube

    启动 Minikube 以初始化一个 Kubernetes 集群:

    minikube start
    • 此命令将在你的本地机器上设置一个单节点的 Kubernetes 集群。
    • 根据系统性能,Minikube 可能需要几分钟才能启动。
  3. 验证 Minikube 是否正在运行

    检查 Minikube 集群的状态:

    minikube status
    • 查找 kubeletapiserver 等组件是否显示为 Running
    • 如果集群未运行,请重新运行 minikube start

如果启动 Minikube 时遇到问题,可以使用 minikube delete 来重置环境(如有需要)。

使用 Job 运行 Pod

第一步是创建一个运行 Job 的 Pod。在本示例中,我们将创建一个 Pod,运行一个命令以在控制台打印 "Hello, World!"。

/home/labex/project/ 目录下创建一个名为 job.yaml 的文件,内容如下:

apiVersion: batch/v1
kind: Job
metadata:
  name: hello-job
spec:
  template:
    spec:
      containers:
        - name: hello
          image: busybox
          command: ["sh", "-c", 'echo "Hello, World!"']
      restartPolicy: Never
  backoffLimit: 4

在此文件中,我们定义了一个名为 hello-job 的 Job,它运行一个名为 hello 的容器。该容器使用 busybox 镜像,并执行一个命令以在控制台打印 "Hello, World!"。

要创建 Job,请运行以下命令:

kubectl apply -f job.yaml

你可以通过运行以下命令检查 Job 的状态:

kubectl get jobs

Job 完成后,你可以通过运行以下命令查看 Pod 的日志:

kubectl logs <POD_NAME>

<POD_NAME> 替换为运行 Job 的 Pod 的名称,你可以通过 kubectl get pods |grep hello-job 命令获取 <POD_NAME>

恭喜,你已成功在 Kubernetes 中使用 Job 运行了一个 Pod!

运行多 Pod 的 Job

在某些情况下,你可能需要运行一个包含多个 Pod 的 Job 以提高性能。在本示例中,我们将创建一个 Job,运行多个 Pod 以从远程服务器下载文件。

/home/labex/project/ 目录下创建一个名为 multi-pod-job.yaml 的文件,内容如下:

apiVersion: batch/v1
kind: Job
metadata:
  name: download-job
spec:
  completions: 3
  parallelism: 2
  template:
    spec:
      containers:
        - name: downloader
          image: curlimages/curl
          command: ["curl", "-o", "/data/file", "http://example.com/file"]
          volumeMounts:
            - name: data-volume
              mountPath: /data
      restartPolicy: Never
      volumes:
        - name: data-volume
          emptyDir: {}
  backoffLimit: 4

在此文件中,我们定义了一个名为 download-job 的 Job,它使用 curlimages/curl 镜像运行多个 Pod。每个 Pod 从 http://example.com/file 下载文件并将其保存到名为 data-volume 的共享卷中。

要创建 Job,请运行以下命令:

kubectl apply -f multi-pod-job.yaml

你可以通过运行以下命令检查 Job 的状态:

kubectl get jobs

Job 完成后,你可以通过运行以下命令查看 Pod 的日志:

kubectl logs <POD_NAME>

<POD_NAME> 替换为运行 Job 的任意 Pod 的名称。你可以查看文件的下载日志,并通过 kubectl get pod |grep download-job 命令获取 <POD_NAME>

恭喜,你已成功在 Kubernetes 中运行了一个包含多个 Pod 的 Job!

运行 CronJob

除了一次性任务(Job),Kubernetes 还支持 CronJob 以定期运行任务。在本示例中,我们将创建一个每分钟运行一次命令的 CronJob。

/home/labex/project/ 目录下创建一个名为 cronjob.yaml 的文件,内容如下:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello-cronjob
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: hello
              image: busybox
              command: ["sh", "-c", 'echo "Hello, World!"']
          restartPolicy: Never
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 3

在此文件中,我们定义了一个名为 hello-cronjob 的 CronJob,它每分钟运行一次命令。该命令与我们在第一个示例中使用的命令相同,用于在控制台打印 "Hello, World!"。

要创建 CronJob,请运行以下命令:

kubectl apply -f cronjob.yaml

你可以通过运行以下命令检查 CronJob 的状态:

kubectl get cronjobs

CronJob 运行后,你可以通过运行以下命令查看 Pod 的日志:

kubectl logs -f <POD_NAME>

<POD_NAME> 替换为由 CronJob 创建的任意 Pod 的名称,你可以通过 kubectl get pod |grep hello-cronjob 命令获取 <POD_NAME>

恭喜,你已成功在 Kubernetes 中运行了一个 CronJob!

总结

在本实验中,我们学习了如何在 Kubernetes 中使用 Jobs 和 CronJobs 运行 Pods。我们从运行 Job 的简单示例开始,逐步构建了包含多个 Pod 的 Job 以及定期运行的 CronJob 等更复杂的示例。通过这些知识,你可以在 Kubernetes 中运行不属于长期运行的应用程序或服务的各种任务。

您可能感兴趣的其他 Kubernetes 教程