我想仅在已挂载为 PVC (PersistentVolumeClaim) 的 NAS 上创建特定文件后启动 pod/cronjob。
有没有办法“监视”文件夹并仅在确定文件存在后才触发 Pod 创建?
我们希望尽可能在最晚的时刻创建 Pod,以免在“等待”某些事情发生的 Pod 上保留集群的计算能力。
此外,由于公司政策,我们无法使用 Openshift pipeline(又名 Tekton)或其他需要集群范围权限的操作符。
要在挂载为 PersistentVolumeClaim (PVC) 的 NAS 上创建特定文件时在 OpenShift 中触发 pod 或 cronjob,而不依赖于 OpenShift 管道或需要集群范围权限的其他操作员,您可以考虑自定义利用小型轻量级watcher容器的解决方案。
该容器将监视指定目录中的文件创建事件,并随后触发所需的作业。
+------------------+ +-----------------+ +-------------------+
| | | | | |
| Watcher Pod |----->| NAS (PVC) | | Triggered Pod |
| (Custom Image) | | (File Check) | | (Task Execution) |
| | | | | |
+------------------+ +-----------------+ +-------------------+
创建一个 Docker 镜像,其中包含一个脚本来监视 NAS 上的指定目录(作为 PVC 挂载)。该脚本
watcher.sh
可以使用 inotifywait
(适用于 Linux 环境)等工具来监视文件创建事件。
#!/bin/bash
WATCHED_DIR="/path/to/watched/directory"
FILE_NAME="trigger_file.txt"
echo "Watching for $FILE_NAME in $WATCHED_DIR"
while true; do
inotifywait -e create "$WATCHED_DIR"
if [ -f "$WATCHED_DIR/$FILE_NAME" ]; then
echo "$FILE_NAME found, triggering the job..."
# Trigger pod creation or cronjob here
break
fi
done
为观察者添加 Dockerfile:
FROM alpine
RUN apk add --no-cache inotify-tools bash
ADD watcher.sh /watcher.sh
RUN chmod +x /watcher.sh
ENTRYPOINT ["/watcher.sh"]
然后将此映像部署为 OpenShift 中的 Pod,确保 NAS 作为 PVC 挂载到脚本中指定的相同路径。
在脚本中注明
# Trigger pod creation or cronjob here
的部分,您可以使用 OpenShift CLI (oc
) 触发 pod 或 cronjob。但是,这需要 oc
在您的映像中可用,并为观察者 Pod 所使用的服务帐户设置适当的权限,以便在 OpenShift 中创建作业。
oc run my-job --image=myjobimage:latest --restart=Never
或者要创建一个 cronjob,您可以有一个预定义的 cronjob 定义并使用以下命令创建它:
oc create -f my-cronjob.yaml
确保您的观察者 Pod 的服务帐户具有创建 Pod 或 cronjobs 所需的权限。