kubernetes 集装箱间通信教程定义了以下管道:
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中,但是卷不能添加到它中。难道它没有实现吗?
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"])发布于 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_volume和op.container.add_volume_mount。
然而,您需要使用卷有什么特殊的原因吗?体积使管道和组件不可携带.没有第一组组件使用卷。
https://stackoverflow.com/questions/63142464
复制相似问题