5

我有一个要求,我需要在 kubernetes 中创建一个 cronjob,但 pod 有多个容器(单个容器工作正常)。

可能吗?

要求是这样的: 1. 第一个容器:运行 shell 脚本来完成一项工作。2、第二个容器:运行fluentbit conf解析日志并发送。

以前我认为有一个部署到位并且工作正常,但由于该部署仅用于 10 分钟的工作,我认为将其作为一项 cron 工作。

非常感谢任何帮助。

另外关于 cronjob,我不确定一个 pod 是否可以支持多个容器来做同样的事情。

谢谢你,阳光

4

3 回答 3

4

是的,您可以使用多个容器创建一个 cronjob。CronJob 是 pod 之上的抽象。因此,在 pod 规范中,您可以拥有多个容器,就像在普通 pod 中一样。举个例子

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
  namespace: default
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          - name: app
            image: alpine
            command:
            - echo
            - Hello World!
          restartPolicy: OnFailure
于 2020-05-04T13:08:24.323 回答
2

我需要同意@Arghya Sadhu 提供的答案。它展示了如何Pod使用CronJob. 在回答之前,我想更多地关注@Chris Stryczynski 提供的评论:

目前尚不清楚容器是并行运行还是顺序运行


您尝试运行的工作负载是否:

要求是这样的:

  1. 第一个容器:运行 shell 脚本来完成一项工作。
  2. 第二个容器:运行fluentbit conf解析日志并发送。

可以用于parallel(同时运行)或需要sequential方法(X成功完成后,运行Y)。

如果工作负载可以并行运行,@Arghya Sadhu 提供的答案是正确的,但是如果一个工作负载依赖于另一个工作负载,我认为您应该使用initContainers而不是 multi container Pods

CronJob实现的示例initContainer可能如下:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: Never
          containers:
            - name: ubuntu
              image: ubuntu
              command: [/bin/bash]
              args: ["-c","cat /data/hello_there.txt"]
              volumeMounts:
              - name: data-dir
                mountPath: /data
          initContainers:
          - name: echo
            image: busybox
            command: ["bin/sh"]
            args: ["-c", "echo 'General Kenobi!' > /data/hello_there.txt"]
            volumeMounts:
            - name: data-dir
              mountPath: "/data"
          volumes:
          - name: data-dir
            emptyDir: {}

CronJob会将特定文本写入带有 的文件,initContainer然后“主”容器将显示其结果。值得一提的是,如果initContainer操作不成功,主容器将不会启动。

  • $ kubectl logs hello-1234567890-abcde
General Kenobi!

其他资源:

于 2021-03-22T11:26:52.333 回答
1

用于记录作为第二个容器的边车容器是什么,它在没有退出代码的情况下继续运行。即使作业可能运行,作业的状态仍然失败。

于 2021-07-11T15:36:20.347 回答