当前位置: 首页 > 知识库问答 >
问题:

从 OpenShift 运行 Kubernetes Cron 作业以定期调用 REST endpoint

申屠乐池
2023-03-14

我正在研究如何在RedHat OpenShift上运行Spring Batch作业作为Kubernetes计划作业。步骤已经完成,

1) 创建了一个示例 Spring Batch 应用程序,该应用程序读取一个执行简单处理的 .csv 文件并将一些数据放入内存中的 h2 数据库中。作业启动器作为 REST 终结点 (/load) 调用。源代码可以在这里找到。有关endpoint信息,请参阅自述文件。

2)创建Docker映像并推送到DockerHub

3)使用该映像作为应用程序部署到我的OpenShift在线集群

我想做的是,

从 OpenShift 运行 Kubernetes Cron 作业以调用 /load REST endpoint,该endpoint会定期启动 SpringBatch 作业

有人可以在这里指导我如何实现这一目标吗?

谢谢你

萨米

共有1个答案

姚嘉容
2023-03-14

最简单的方法是卷曲/loadRESTendpoint。有一种方法可以做到这一点:

我用来替换您的应用程序的Pod定义(用于测试目的):

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: mendhak/http-https-echo

我使用这个图像是因为它将各种HTTP请求属性发送回客户端。

为pod创建服务:

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp the selector
  ports:
    - protocol: TCP
      port: 80 #Port that service is available on
      targetPort: 80 #Port that app listens on

创建一个 CronJob:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: curljob
spec:
  jobTemplate:
    metadata:
      name: curljob
    spec:
      template:
        metadata:
        spec:
          containers:
          - command:
            - curl
            - http://myapp-service:80/load
            image: curlimages/curl
            imagePullPolicy: Always
            name: curljobt
          restartPolicy: OnFailure
  schedule: '*/1 * * * *'

或者,您可以使用命令启动它:

kubectl create cronjob --image curlimages/curl curljob -oyaml --schedule "*/1 * * * *" -- curl  http://myapp-service:80/load 

“*/1***”将指定此CronJob的运行频率时。我把它设置为每一分钟跑一次。您可以在此处和此处查看有关如何设置cron作业的更多信息

以下是来自一个作业pod的kubectl日志的结果:

{
  "path": "/load",
  "headers": {
    "host": "myapp-service",
    "user-agent": "curl/7.68.0-DEV",
    "accept": "*/*"
  },
  "method": "GET",
  "body": "",
  "fresh": false,
  "hostname": "myapp-service",
  "ip": "::ffff:192.168.197.19",
  "ips": [],
  "protocol": "http",
  "query": {},
  "subdomains": [],
  "xhr": false,
  "os": {
    "hostname": "myapp-pod"

如您所见,应用程序收到GET请求,路径为:/load

让我知道这是否有帮助。

 类似资料:
  • 我需要在linux中使用cron作业从特定的jar文件运行java类。我已经尝试了java和包含shell文件中所有jar文件的文件夹的绝对路径,它可以手动运行。 当我尝试从cron作业运行这个shell文件时,它失败了 文件夹库包含多个jar依赖项。我怀疑MyClass也应该是绝对路径。

  • 我有一个webapp在Kubernetes集群的Docker-container中运行。该应用程序有一个endpoint,我想定期调用。应用程序在多个节点/吊舱上运行,重要的是只有一个节点执行endpoint发起的任务。我查看了Kubernetes Cron作业,但没有找到任何关于从Kubernetes Cron作业调用endpoint的文档。有人对解决这个问题有什么建议吗?在只有一个节点执行任务

  • 问题内容: 我正在寻找一种使用PHP的方法,以检测脚本是从外壳上的手动调用运行的(我登录并运行该脚本),还是从crontab条目运行。 我有各种用php编写的维护类型脚本,这些脚本已设置为在crontab中运行。有时,我需要提前手动运行它们,或者如果发生故障/损坏,则需要运行几次。 这样做的问题是,每次手动运行脚本时,我也不想发生某些任务(发布到Twitter,发送电子邮件等)时需要设置的外部通知

  • 问题内容: 我在Linux中安装了Jenkins,我想在用户下运行构建。 不只是一个简单的用户,而是属于访问linux计算机的用户列表的一个用户,它属于某个组,因为它具有在特定文件夹下修改/创建文件的特权。 我读过某处可以设置变量$ JENKINS_USER,但是我不知道在哪里以及如何进行设置。感谢您的时间 PS我做了一些研究,所有发布的问题都与此相似,但不相同 如果我不清楚,请阅读以下内容:通常

  • 问题内容: 我使用指南安装了jenkins,该指南在服务器中创建了一个“ jenkins”用户,并且显然在其下运行jenkins服务器。 我在服务器上的所有设置(虚拟环境,python软件包安装)均针对其他用户(“ ci-user”)。我有什么办法可以以“ ci_user”而不是“ jenkins”的身份运行我的工作?我想避免为“詹金斯”用户再次进行所有设置。 问题答案: 文件中有变量。您可以将其

  • 我不知道如何使用调用Spring批处理中定义的作业,文档细节对我来说是不够的。 我遵循了Spring Batch官方指南,使用Java注释(例如)在Spring Batch中编写作业,因为我希望避免使用XML配置文件来描述作业、步骤等。 到目前为止我已经: 配置类(见下文),我使用AnnotaIon将定义、、、和(带有的所有内容放入其中。 具有方法的类,该方法具有并具有注释,以导入处理作业中的数据