我想创建一个 cronjob,它可以获取 PVC 内的脚本文件并使用它运行。
这里我在 AKS 中创建了一个 PVC,如下所示:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
volume.beta.kubernetes.io/mount-options: dir_mode=0777,file_mode=0777,uid=999,gid=999
volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/azure-file
name: cronjob-scripts
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: aks-azure-files
之后,我将它与吊舱连接起来
general-utils
,kubectl -n <NAMESPACE> cp cronjob_script.py general-utils:/var/scripts
一旦确认 PVC 中存在脚本文件,我将创建一个 cronjob,如下所示:
apiVersion: batch/v1
kind: CronJob
metadata:
name: testing-cronjob
spec:
schedule: "00 0 * * *"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 1
failedJobsHistoryLimit: 1
startingDeadlineSeconds: 300
jobTemplate:
spec:
template:
spec:
imagePullSecrets:
- name: <SECRET_NAME>
restartPolicy: OnFailure
volumes:
- name: cronjob-scripts
persistentVolumeClaim:
claimName: cronjob-scripts
containers:
- name: testing-cronjob
image: <PYTHON_INSTALLED_ALPINE_IMAGE>
command: ["py /var/scripts/cronjob_script.py"]
volumeMounts:
- name: cronjob-scripts
mountPath: "/var/scripts"
imagePullPolicy: Always
创建后,我通过运行手动触发 cronjob:
kubectl -n <NAMESPACE> create job --from=cronjob/testing-cronjob job-of-testing-cronjob
但是,作业创建的 pod 在描述事件中抛出以下错误:
Warning Failed 13s (x2 over 13s) kubelet
Error: failed to create containerd task: failed to create shim task:
OCI runtime create failed: runc create failed:
unable to start container process: exec: "py /var/scripts/cronjob_script.py":
stat py /var/scripts/cronjob_script.py: no such file or directory: unknown
不确定Pod创建后是否会连接PVC,所以就变成了死循环。
如果我想让cronjob获取脚本文件来运行,我应该如何实现?
经过长时间排查,发现错误是由于脚本文件路径造成的。
我们需要在配置中放置
args
而不是one line
命令的路径,即
来自
- name: testing-cronjob
image: <PYTHON_INSTALLED_ALPINE_IMAGE>
command: ["py /var/scripts/cronjob_script.py"]
到
- name: testing-cronjob
image: <PYTHON_INSTALLED_ALPINE_IMAGE>
command: ["py"]
args: ["/var/scripts/cronjob_script.py"]