首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在kubeflow管道中定义管道级别的卷,以便跨组件共享?

如何在kubeflow管道中定义管道级别的卷,以便跨组件共享?
EN

Stack Overflow用户
提问于 2020-07-28 20:43:15
回答 1查看 3.4K关注 0票数 3

kubernetes 集装箱间通信教程定义了以下管道:

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: two-containers
spec:

  restartPolicy: Never

  volumes:                      <--- This is what I need
  - name: shared-data
    emptyDir: {}

  containers:

  - name: nginx-container
    image: nginx
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html

  - name: debian-container
    image: debian
    volumeMounts:
    - name: shared-data
      mountPath: /pod-data
    command: ["/bin/sh"]
    args: ["-c", "echo Hello from the debian container > /pod-data/index.html"]

请注意,volumes键是在spec下定义的,因此卷对所有定义的容器都可用。我希望使用kfp实现同样的行为,这是用于kubeflow管道的API。

但是,我只能将卷添加到单个容器,而不能使用指向先前创建的卷( kfp.dsl.ContainerOp.container.add_volume_mount )的整个工作流规范(kfp.dsl.PipelineVolume)添加卷,因为卷似乎只在容器中定义。

下面是我尝试过的内容,但是卷总是在第一个容器中定义的,而不是“全局”级别。我如何获得它,以便op2能够访问卷?我本来希望它在kfp.dsl.PipelineConf中,但是卷不能添加到它中。难道它没有实现吗?

代码语言:javascript
复制
import kubernetes as k8s
from kfp import compiler, dsl
from kubernetes.client import V1VolumeMount
import pprint

@dsl.pipeline(name="debug", description="Debug only pipeline")
def pipeline_func():
    op = dsl.ContainerOp(
            name='echo',
            image='library/bash:4.4.23',
            command=['sh', '-c'],
            arguments=['echo "[1,2,3]"> /tmp/output1.txt'],
            file_outputs={'output': '/tmp/output1.txt'})
    op2 = dsl.ContainerOp(
            name='echo2',
            image='library/bash:4.4.23',
            command=['sh', '-c'],
            arguments=['echo "[4,5,6]">> /tmp/output1.txt'],
            file_outputs={'output': '/tmp/output1.txt'})

    mount_folder = "/tmp"
    volume = dsl.PipelineVolume(volume=k8s.client.V1Volume(
            name=f"test-storage",
            empty_dir=k8s.client.V1EmptyDirVolumeSource()))
    op.add_pvolumes({mount_folder: volume})
    op2.container.add_volume_mount(volume_mount=V1VolumeMount(mount_path=mount_folder,
                                                              name=volume.name))
    op2.after(op)


workflow = compiler.Compiler().create_workflow(pipeline_func=pipeline_func)
pprint.pprint(workflow["spec"])
EN

回答 1

Stack Overflow用户

发布于 2020-09-09 06:58:43

您可能需要检查Kubernetes吊舱和容器之间的差异。您发布的Kubernetes示例显示了一个两个容器的吊舱。您可以在KFP中通过向实例化的ContainerOp添加一个sidecar容器来重新创建相同的示例。您的第二个例子是创建两个设计上看不到对方的单容器吊舱。

要在荚之间交换数据,您需要一些实际的卷,而不是只对容器起作用的emptyDir是一个单荚。

dsl.PipelineVolume(volume=k8s.client.V1Volume( name=f“测试-存储”,empty_dir=k8s.client.V1EmptyDirVolumeSource())) op.add_pvolumes({mount_folder:卷})

请不要使用dsl.PipelineVolume或op.add_pvolume,除非您知道它是什么以及想要它的原因。只需使用普通的op.add_volumeop.container.add_volume_mount

然而,您需要使用卷有什么特殊的原因吗?体积使管道和组件不可携带.没有第一组组件使用卷。

KFP团队鼓励用户使用正常的数据传递方法:非蟒蛇python

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63142464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档