【问题标题】:Kubernetes: Is it possible to mount volumes to a container running as a CronJob?Kubernetes:是否可以将卷挂载到作为 CronJob 运行的容器上?
【发布时间】:2018-03-16 15:24:56
【问题描述】:

我正在尝试创建一个 Kubernetes CronJob 来每分钟运行一个应用程序。

先决条件是我需要将我的应用程序代码放到 CronJob 中运行的容器中。我认为最好的方法是使用持久卷,pvclaim,然后定义卷并将其安装到容器中。我已经通过在 Pod 中运行的容器成功地做到了这一点,但在 CronJob 中似乎是不可能的?这是我尝试的配置:

apiVersion: batch/v2alpha1
kind: CronJob
metadata:
  name: update_db
spec:
  volumes:
  - name: application-code
    persistentVolumeClaim:
      claimName: application-code-pv-claim
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: update-fingerprints
            image: python:3.6.2-slim
            command: ["/bin/bash"]
            args: ["-c", "python /client/test.py"]
          restartPolicy: OnFailure

对应的错误:

错误:验证错误“cron-applications.yaml”:验证错误 数据:发现 v2alpha1.CronJobSpec 的无效字段卷;如果你 选择忽略这些错误,关闭验证 --validate=false

我找不到任何资源表明这是可能的。那么,如果不可能,如何解决将应用程序代码放入正在运行的 CronJob 的问题?

【问题讨论】:

    标签: kubernetes persistent-volumes persistent-volume-claims


    【解决方案1】:

    CronJob 使用 PodTemplate 作为基于 Pod 的所有其他东西,并且可以使用卷。您将 Volume 规范直接放在 CronJobSpec 而不是 PodSpec 中,像这样使用它:

    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: update-db
    spec:
      schedule: "*/1 * * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: update-fingerprints
                image: python:3.6.2-slim
                command: ["/bin/bash"]
                args: ["-c", "python /client/test.py"]
                volumeMounts:
                - name: application-code
                  mountPath: /where/ever
              restartPolicy: OnFailure
              volumes:
              - name: application-code
                persistentVolumeClaim:
                  claimName: application-code-pv-claim
    

    【讨论】:

    • 我不能编辑它但是yaml是无效的:-在containers:下:image:和下面的key必须和name:同级,除了mountPath)-在volumes: 下:persistentVolumeClaimclaimName 必须与name: 处于同一级别
    • 我认为你是对的,@NicolasPepinster,谢谢。
    • 您好,如果claimName 的缩进级别与persistenceVolumeClaim 相同,则会出现以下错误:“io.k8s.api.core.v1.PersistentVolumeClaimVolumeSource 的类型无效:得到了”字符串", 预期 "地图""。所以我认为claimName应该向右缩进。
    • @l.cotonea 显然 :-) 有趣的是,这花了两年时间。
    • 我将示例更新到 Kubernetes 1.20 并修复了所有两个/四个空格缩进错误。
    【解决方案2】:

    对于其中的另一个问题:“如何解决将应用程序代码放入正在运行的 CronJob 的问题?”

    您构建自己的包含代码的图像。这是通常的做法。

    FROM python:3.6.2-slim
    ADD test.py /client/test.py
    
    CMD ['python','-c','/client/test.py']
    

    构建并推送到 docker 注册表。

    docker build -t myorg/updatefingerprints
    docker push myorg/updatefingerprints
    

    在描述符中使用此图像。

    apiVersion: batch/v2alpha1
    kind: CronJob
    metadata:
      name: update_db
    spec:
      volumes:
      - name: application-code
        persistentVolumeClaim:
          claimName: application-code-pv-claim
      schedule: "*/1 * * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: update-fingerprints
                image: myorg/update-fingerprints
                imagePullPolicy: Always
              restartPolicy: OnFailure
    

    这需要对配置管理和版本控制进行完全不同的思考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-21
      • 2021-10-26
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 2021-07-02
      • 2021-09-17
      • 2019-07-29
      相关资源
      最近更新 更多