在 OpenShift 3 cron 作业中使用 PV

问题描述 投票:0回答:2

我已经能够为我的 OpenShift 3 项目成功创建一个 cron 作业。该项目是对现有 Linux Web 服务器的提升和转变。现有应用程序的一部分需要运行多个 cron 任务。我现在正在查看的是对应用程序数据库的每日更新。作为 cron 作业执行的一部分,我想写入一个日志文件。已经为主应用程序定义了一个 PV/PVC,我打算使用它来保存我的 cron 作业的日志,但似乎没有为 cron 作业提供对 PV 的访问权限。

我正在使用以下 inProgress.yml 来定义 cron 作业

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: in-progress
spec:
  schedule: "*/5 * * * *"       
  concurrencyPolicy: "Replace"  
  startingDeadlineSeconds: 200  
  suspend: false                
  successfulJobsHistoryLimit: 3 
  failedJobsHistoryLimit: 1     
  jobTemplate:                  
    spec:
      template:
        metadata:
          labels:               
            parent: "cronjobInProgress"
        spec:
          containers:
          - name: in-progress
            image: <image name>
            command: ["php",  "inProgress.php"]
          restartPolicy: OnFailure 
          volumeMounts:
            - mountPath: /data-pv
              name: log-vol
      volumes:
        - name: log-vol
          persistentVolumeClaim:
            claimName: data-pv

我正在使用以下命令创建 cron 作业

oc create -f inProgress.yml

PHP 警告:fopen(/data-pv/logs/2022-04-27-app.log):无法打开 stream: 中没有这样的文件或目录 /opt/app-root/src/errorHandler.php 第 75 行警告:[2] mkdir(): 权限被拒绝,文件中的第 80 行 /opt/app-root/src/errorLogger.php
警告:[2] fopen(/data-pv/logs/2022-04-27-inprogress.log):无法打开流: 没有那个文件或目录,文件中的第 60 行 /opt/app-root/src/errorLogger.php

查看执行的 pod 的 yml,没有提及 data-pv - 看起来好像由 OpenShift 添加的秘密 volumeMount 正在删除任何进一步的 volumeMounts

 apiVersion: v1 kind: Pod metadata:   annotations:
     openshift.io/scc: restricted   creationTimestamp: '2022-04-27T13:25:04Z'   generateName: in-progress-1651065900- ...
 
       volumeMounts:
         - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
           name: default-token-n9jsw
           readOnly: true ...   volumes:
     - name: default-token-n9jsw
       secret:
         defaultMode: 420
         secretName: default-token-n9jsw

如何从 cron 作业中访问 PV?

cron openshift persistent-volumes
2个回答
1
投票

您的清单不正确。

volumes
块需要是
spec.jobTemplate.spec.template.spec
的一部分,也就是说,它需要与
spec.jobTemplate.spec.template.spec.containers
缩进同一级别。在当前位置,它对 OpenShift 是不可见的。参见例如这个 pod 例子.

同样,

volumeMounts
restartPolicy
container
块的参数,需要相应地缩进。

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: in-progress
spec:
  schedule: '*/5 * * * *'
  concurrencyPolicy: Replace
  startingDeadlineSeconds: 200
  suspend: false
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            parent: cronjobInProgress
        spec:
          containers:
            - name: in-progress
              image: <image name>
              command:
                - php
                - inProgress.php
              restartPolicy: OnFailure
              volumeMounts:
                - mountPath: /data-pv
                  name: log-vol
          volumes:
            - name: log-vol
              persistentVolumeClaim:
                claimName: data-pv

0
投票

感谢 larsks 的信息回复。

OpenShift 在我复制您的清单建议时显示以下内容

$ oc create -f InProgress.yml CronJob“进行中”无效: spec.jobTemplate.spec.template.spec.restartPolicy:不支持的值: “Always”:支持的值:“OnFailure”、“Never”

由于您的回答非常有帮助,我能够通过移动 restartPolicy: OnFailure 来解决此问题,因此最终清单如下。

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: in-progress
spec:
  schedule: "*/5 * * * *"       
  concurrencyPolicy: "Replace"  
  startingDeadlineSeconds: 200  
  suspend: false                
  successfulJobsHistoryLimit: 3 
  failedJobsHistoryLimit: 1     
  jobTemplate:                  
    spec:
      template:
        metadata:
          labels:               
            parent: "cronjobInProgress"
        spec:
          restartPolicy: OnFailure 
          containers:
          - name: in-progress
            image: <image name>
            command: ["php",  "updateToInProgress.php"]
            volumeMounts:
              - mountPath: /data-pv
                name: log-vol
          volumes:
            - name: log-vol
              persistentVolumeClaim:
                claimName: data-pv
      
© www.soinside.com 2019 - 2024. All rights reserved.