我正在使用Airflow内部的KubernetesPodOperator()中的ffmpeg docker映像从视频中提取帧。
工作正常,但是我无法检索存储的帧:如何将Pod生成的帧直接存储到我的文件系统(主机)中?
更新:
从https://airflow.apache.org/kubernetes.html#看来,我认为我需要处理volume_mount
,volume_config
和volume
参数,但是还是没有运气。
错误消息:
"message":"Not found: \"test-volume\"","field":"spec.containers[0].volumeMounts[0].name"
PV和PVC:
命令kubectl get pv,pvc test-volume
给出:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/test-volume 10Gi RWO Retain Bound default/test-volume manual 3m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/test-volume Bound test-volume 10Gi RWO manual 3m
代码:
volume_mount = VolumeMount('test-volume',
mount_path='/',
sub_path=None,
read_only=False)
volume_config= {
'persistentVolumeClaim':
{
'claimName': 'test-volume' # uses the persistentVolumeClaim given in the Kube yaml
}
}
volume = Volume(name="test-volume", configs=volume_config)
with DAG('test_kubernetes',
default_args=default_args,
schedule_interval=schedule_interval,
) as dag:
extract_frames = KubernetesPodOperator(namespace='default',
image="jrottenberg/ffmpeg:3.4-scratch",
arguments=[
"-i", "http://www.jell.yfish.us/media/jellyfish-20-mbps-hd-hevc-10bit.mkv",
"test_%04d.jpg"
],
name="extract-frames",
task_id="extract_frames",
volume=[volume],
volume_mounts=[volume_mount],
get_logs=True
)
答案 0 :(得分:0)
关于可能的错误,有一些 推测 :
(您的错误很可能来自哪里) KubernetesPodOperator需要参数“ volume s ”,而不是“ volume”
通常,将其挂载到“ /”上是不明智的做法,因为您将删除正在运行的映像上的所有内容。也就是说,您应该将VolumeMount对象中的“ mount_path”更改为“ / stored_frames”之类的其他内容
答案 1 :(得分:0)
在使用KubernetesPodOperator将创建的Pod包装到DAG中之前,您应该创建一个测试Pod以验证k8s对象(卷,pod,configmap,机密等)。根据上面的代码,它看起来可能像这样:
apiVersion: v1
kind: Pod
metadata:
name: "extract-frames-pod"
namespace: "default"
spec:
containers:
- name: "extract-frames"
image: "jrottenberg/ffmpeg:3.4-scratch"
command:
args: ["-i", "http://www.jell.yfish.us/media/jellyfish-20-mbps-hd-hevc-10bit.mkv", "test_%04d.jpg"]
imagePullPolicy: IfNotPresent
volumeMounts:
- name: "test-volume"
# do not use "/" for mountPath.
mountPath: "/images"
restartPolicy: Never
volumes:
- name: "test-volume"
persistentVolumeClaim:
claimName: "test-volume"
serviceAccountName: default
我希望您会遇到与您相同的错误:"message":"Not found: \"test-volume\"","field":"spec.containers[0].volumeMounts[0].name"
我认为您的PersistentVolume
清单文件存在问题。
您是否设置了路径test-volume
?像这样:
path: /test-volume
并且该路径是否存在于目标卷中?如果没有,请创建该目录/文件夹。那可能会解决您的问题。