在OpenShift 3 cron作业中使用PV



我已经能够成功地为我的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 Warning: fopen(/data-pv/logs/2022-04-27-app.log): failed to open .log日志示例没有这样的文件或目录/opt/app-root/src/errorHandler.php on line 75 WARNING: [2] mkdir()拒绝许可,文件中的第80行/opt/app-root/src/errorLogger.php
警告:[2]Fopen (/data-pv/logs/2022-04-27-inprogress.log): failed to open stream:没有这样的文件或目录,文件中的第60行/opt/app-root/src/errorLogger.php

查看执行的yml for pod,没有提到data-pv-看起来好像secretvolumount,由OpenShift添加正在删除任何进一步的卷挂载.

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 ?

您的清单不正确。volumes块需要成为spec.jobTemplate.spec.template.spec的一部分,即需要缩进到与spec.jobTemplate.spec.template.spec.containers相同的水平。在目前的位置,它对OpenShift是不可见的。请看下面这个pod的例子。

同样,volumeMountsrestartPolicycontainer块的参数,需要相应地缩进。

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

感谢larsks提供的信息。

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

$ oc create -f InProgress。"正在进行"的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

最新更新