在KubernetesPodOperator中共享卷吗?

时间:2019-02-22 13:40:36

标签: kubernetes airflow minikube kubernetes-pod

我正在使用Airflow内部的KubernetesPodOperator()中的ffmpeg docker映像从视频中提取帧。

工作正常,但是我无法检索存储的帧:如何将Pod生成的帧直接存储到我的文件系统(主机)中?

更新

https://airflow.apache.org/kubernetes.html#看来,我认为我需要处理volume_mountvolume_configvolume参数,但是还是没有运气。

错误消息:

"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
                                  )

2 个答案:

答案 0 :(得分:0)

关于可能的错误,有一些 推测

  1. (您的错误很可能来自哪里) KubernetesPodOperator需要参数“ volume s ”,而不是“ volume”

  2. 通常,将其挂载到“ /”上是不明智的做法,因为您将删除正在运行的映像上的所有内容。也就是说,您应该将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

并且该路径是否存在于目标卷中?如果没有,请创建该目录/文件夹。那可能会解决您的问题。