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

Kubernetes中的Cron作业-连接到现有的Pod,执行脚本

端木兴国
2023-03-14
    null

有没有一种方法可以通过ScheduledJobs/CronJobs来实现这一点?

http://kubernetes.io/docs/user-guide/cron-jobs/

共有1个答案

赵越
2023-03-14

据我所知,没有“官方”的方式来做到这一点,你想要的方式,这是我相信设计。豆荚应该是短暂的和水平可伸缩的,作业被设计为退出。将cron作业“附加”到现有的pod并不适合该模块。调度程序不知道作业是否完成。

相反,作业可以调出专门用于运行作业的应用程序实例,然后在作业完成后将其取下。为此,您可以对作业使用与部署相同的映像,但通过设置命令:使用不同的“入口点”。

如果它们的作业需要访问由应用程序创建的数据,那么该数据将需要在应用程序/POD之外持久化,您可以使用几种方法,但最明显的方法是数据库或持久化卷。例如,使用数据库如下所示:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: APP
spec:
  template:
    metadata:
      labels:
        name: THIS
        app: THAT
    spec:
      containers:
        - image: APP:IMAGE
          name: APP
          command:
          - app-start
          env:
            - name: DB_HOST
              value: "127.0.0.1"
            - name: DB_DATABASE
              value: "app_db"

和连接到相同数据库但具有不同“入口点”的作业:

apiVersion: batch/v1
kind: Job
metadata:
  name: APP-JOB
spec:
  template:
    metadata:
      name: APP-JOB
      labels:
        app: THAT
    spec:
      containers:
      - image: APP:IMAGE
        name: APP-JOB
        command:
        - app-job
        env:
          - name: DB_HOST
            value: "127.0.0.1"
          - name: DB_DATABASE
            value: "app_db"

或者持久卷方法如下所示:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: APP
spec:
  template:
    metadata:
      labels:
        name: THIS
        app: THAT
    spec:
      containers:
        - image: APP:IMAGE
          name: APP
          command:
          - app-start
          volumeMounts:
          - mountPath: "/var/www/html"
            name: APP-VOLUME
      volumes:
        - name:  APP-VOLUME
          persistentVolumeClaim:
            claimName: APP-CLAIM

---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: APP-VOLUME
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /app

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: APP-CLAIM
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      service: app

对于这样的作业,附加到相同的卷:

apiVersion: batch/v1
kind: Job
metadata:
  name: APP-JOB
spec:
  template:
    metadata:
      name: APP-JOB
      labels:
        app: THAT
    spec:
      containers:
      - image: APP:IMAGE
        name: APP-JOB
        command:
        - app-job
        volumeMounts:
        - mountPath: "/var/www/html"
          name: APP-VOLUME
    volumes:
      - name:  APP-VOLUME
        persistentVolumeClaim:
          claimName: APP-CLAIM
 类似资料:
  • 问题内容: 在我们的centos6服务器中。我想以apache用户的身份在cron作业中执行php脚本,但不幸的是它不起作用。 这是crontab的版本(crontab -uapache -e) 这是“ test.php”文件的源代码,可以与“ apache”用户作为所有者正常工作。 我尝试将php替换为php的完整路径(/ usr / local / php / bin / php),但它也不起

  • 问题内容: 我想每天午夜运行一个PHP脚本。在研究如何执行此操作之后,似乎达到此目的的最佳方法是使用CRON作业。 如果我的php脚本位于http://example.com/scripts/scriptExample.php,是否有人可以显示此CRON命令的外观的最简单示例? 我浏览了许多帖子,但找不到足够简单的示例供我学习和借鉴。 问题答案: Crontab需要服务器上的完整路径。 这将每天在

  • 问题内容: 很简单,我有要每月执行一次的节点脚本。 但这是行不通的,大概是因为该命令正在运行的路径或外壳。我尝试了以下通过cron执行节点的方法(已通过-v测试): 我没办法尝试了,有什么建议吗? 问题答案: 只需提供cron作业中node的完整路径即可,例如:

  • 编辑:问题解决了,这是我的错误,我只是使用了错误的cron设置。我假设“*2***”在2点时每天只运行一次,但实际上它在2点后每分钟运行一次。所以Kubernetes的行为是正确的。 我一直在一个 cron 执行点运行多个作业。但似乎只有当这些作业的运行时间非常短时。知道为什么会发生这种情况以及如何防止它吗?我使用策略:禁止,和。 一个cron作业的示例,该作业应该每天运行一次,但在其预定运行时间

  • 我在kubernetes中运行cron作业,作业成功完成,我将输出记录到日志文件中(路径:存储/日志),但由于容器已完成,我无法访问该文件。 是否有无论如何我可以让我的日志文件内容显示在kubectl日志命令或其他替代?

  • 我想使用SQL脚本文件在Kubernetes pod中创建一个SQL Server数据库。我有创建数据库和插入主数据的SQL脚本。由于我是Kubernetes的新手,我很难在pod中运行SQL脚本。我知道SQL脚本可以在单独的kubectl exec命令中手动执行,但是我希望它在pod deploy yml文件本身中自动执行。 有没有办法将脚本文件挂载到pod的卷中,并在启动容器后运行它?