You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KubeFlow跨步骤共享Volume数据丢失问题求助

问题原因

你当前创建的V1_VOLUME未指定持久化存储后端,默认会使用Kubernetes的emptyDir卷。但emptyDir的生命周期与Pod绑定,流水线的每个步骤都是独立Pod,第一个步骤的Pod销毁后,emptyDir内的数据会被清除,因此第二个步骤启动时无法读取到之前的数据。

解决方案:用PersistentVolumeClaim(PVC)实现跨Pod数据共享

要实现跨步骤的持久化数据共享,需通过PersistentVolumeClaim申请集群中的持久化存储,让多个Pod挂载同一个PVC来共享数据。

步骤1:定义PersistentVolumeClaim配置

先创建PVC配置,指定存储大小、访问模式(根据集群配置调整):

from kubernetes.client import V1PersistentVolumeClaim, V1PersistentVolumeClaimSpec, V1ResourceRequirements

PVC_NAME = "pictures-pvc"
pvc = V1PersistentVolumeClaim(
    metadata={"name": PVC_NAME},
    spec=V1PersistentVolumeClaimSpec(
        access_modes=["ReadWriteOnce"],  # 单节点读写,集群支持的话可改用ReadWriteMany
        resources=V1ResourceRequirements(
            requests={"storage": "10Gi"}  # 按需调整存储大小
        ),
        # 集群有指定存储类的话,取消注释并替换为你的存储类名称
        # storage_class_name="your-storage-class"
    )
)

步骤2:修改Volume配置,关联PVC

将原V1_VOLUME修改为引用上述PVC:

VOLUME_NAME_PATH = 'pictures'
VOLUME_PATH = f'/{VOLUME_NAME_PATH}'

# 创建关联PVC的Volume
V1_VOLUME = k8s_client.V1Volume(
    name=VOLUME_NAME_PATH,
    persistent_volume_claim=k8s_client.V1PersistentVolumeClaimVolumeSource(
        claim_name=PVC_NAME
    )
)
V1_VOLUME_MOUNT = k8s_client.V1VolumeMount(
    mount_path=VOLUME_PATH,
    name=VOLUME_NAME_PATH
)

步骤3:确保PVC在流水线启动前存在

你可以提前通过kubectl创建PVC,或者在流水线中添加创建PVC的步骤。以下是kubectl创建命令:

kubectl apply -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pictures-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  # storageClassName: your-storage-class
EOF

步骤4:验证步骤的文件操作逻辑

确保download_images_op和compress_images_op确实在VOLUME_PATH路径下读写文件;同时检查容器内用户是否有该路径的读写权限,必要时可在步骤中添加chmod/chown命令调整权限。

修改后的完整流水线代码

from kubernetes import client as k8s_client
from kubernetes.client import V1PersistentVolumeClaim, V1PersistentVolumeClaimSpec, V1ResourceRequirements

# 定义PVC配置
PVC_NAME = "pictures-pvc"
pvc = V1PersistentVolumeClaim(
    metadata={"name": PVC_NAME},
    spec=V1PersistentVolumeClaimSpec(
        access_modes=["ReadWriteOnce"],
        resources=V1ResourceRequirements(requests={"storage": "10Gi"})
    )
)

VOLUME_NAME_PATH = 'pictures'
VOLUME_PATH = f'/{VOLUME_NAME_PATH}'

# 创建关联PVC的Volume
V1_VOLUME = k8s_client.V1Volume(
    name=VOLUME_NAME_PATH,
    persistent_volume_claim=k8s_client.V1PersistentVolumeClaimVolumeSource(
        claim_name=PVC_NAME
    )
)
V1_VOLUME_MOUNT = k8s_client.V1VolumeMount(
    mount_path=VOLUME_PATH,
    name=VOLUME_NAME_PATH
)

def pictures_pipeline():
    download_images_op_step = download_images_op(volume_path=VOLUME_PATH) \
        .add_volume(V1_VOLUME) \
        .add_volume_mount(V1_VOLUME_MOUNT)
    compress_images_op_step = compress_images_op(volume_path=VOLUME_PATH) \
        .add_volume(V1_VOLUME) \
        .add_volume_mount(V1_VOLUME_MOUNT)

    compress_images_op_step.after(download_images_op_step)
额外注意事项
  • 访问模式:若流水线步骤运行在不同节点上,需使用ReadWriteMany模式,但这要求集群支持对应的存储类(如NFS、Ceph等)。
  • 存储清理:PVC不会自动删除,使用完毕后可手动删除以释放存储资源。
  • 权限问题:若容器内非root用户无法写入挂载路径,可在挂载时添加sub_path、修改容器运行用户,或在步骤中执行权限调整命令。

内容的提问来源于stack exchange,提问作者Tlaloc-ES

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:46:17