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

如何在Kubernetes中部署NFS服务器Pod,实现Minio S3数据集的共享复用以支持多次训练任务?

如何在Kubernetes中部署NFS服务器Pod,实现Minio S3数据集的共享复用以支持多次训练任务?

嘿,我完全懂你的处境——要复用1.3T的大数据集,又不想每次训练都从Minio重新下载,PVC空间还不够,自己又是Linux和K8s新手,遇到systemctl的问题卡壳,确实挺闹心的。我给你一套一步步的解决方案,都是针对新手设计的,不用复杂的系统命令:

第一步:选对NFS容器镜像,避开systemctl问题

你之前遇到的systemctl问题很正常,容器通常是单进程运行的,没有完整的系统服务管理器。推荐用itsthenetwork/nfs-server-alpine这个轻量镜像,它已经把NFS服务封装成了容器的主进程,启动就自动运行,完全不用手动调用systemctl。

第二步:部署NFS服务器Pod和Service

先创建一个Deployment来运行NFS服务器,同时创建Service让其他Pod能稳定访问它。这里要注意给NFS Pod挂载足够大的存储空间(至少1.3T),如果集群里没有足够的PVC,你可以暂时用节点的本地存储(hostPath),但要确保选的节点有足够空闲空间。

部署NFS Deployment的YAML示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-server
  template:
    metadata:
      labels:
        app: nfs-server
    spec:
      nodeSelector:
        # 可选:指定有足够存储空间的节点标签,比如storage=large
        storage: large
      containers:
      - name: nfs-server
        image: itsthenetwork/nfs-server-alpine:latest
        ports:
        - name: nfs
          containerPort: 2049
        securityContext:
          privileged: true  # NFS需要特权模式运行
        volumeMounts:
        - name: nfs-storage
          mountPath: /nfs  # 镜像默认的共享目录
      volumes:
      - name: nfs-storage
        hostPath:
          path: /mnt/large-storage  # 节点上的大存储路径
          type: DirectoryOrCreate

部署NFS Service的YAML示例:

apiVersion: v1
kind: Service
metadata:
  name: nfs-service
spec:
  selector:
    app: nfs-server
  ports:
  - name: nfs
    port: 2049
    targetPort: 2049
  clusterIP: None  # 用Headless Service,保证NFS服务器的稳定网络标识

把这两个YAML保存成文件,用kubectl apply -f <文件名>部署即可。

第三步:在NFS Pod中下载Minio数据集

部署好后,先进入NFS Pod:

kubectl exec -it $(kubectl get pods -l app=nfs-server -o jsonpath='{.items[0].metadata.name}') -- sh

推荐用Minio官方的mc工具来下载数据,比Python脚本更高效稳定。在容器里安装mc:

wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
mv mc /usr/local/bin/

配置Minio服务器的别名(替换成你的Minio地址、密钥):

mc alias set my-minio http://your-minio-endpoint:9000 YOUR_ACCESS_KEY YOUR_SECRET_KEY

然后同步整个数据集到NFS共享目录:

mc cp --recursive my-minio/your-bucket-name/path/to/dataset /nfs/

这个命令会后台同步,你可以加--watch查看进度,或者用nohup mc cp ... &让它在后台持续运行,避免终端断开中断任务。

第四步:让训练Pod挂载NFS共享卷

现在需要创建PersistentVolume(PV)和PersistentVolumeClaim(PVC),指向我们的NFS服务器:

PV的YAML示例:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 2Ti  # 设为比数据集大的容量
  accessModes:
    - ReadWriteMany  # 支持多个Pod同时读写
  nfs:
    server: nfs-service.default.svc.cluster.local  # NFS Service的DNS名称(格式:服务名.命名空间.svc.cluster.local)
    path: "/nfs"

PVC的YAML示例:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Ti

部署这两个YAML后,你的训练Pod就可以挂载这个PVC了,示例训练Pod的YAML片段:

containers:
- name: training-pod
  image: your-training-image:latest
  volumeMounts:
  - name: dataset-volume
    mountPath: /path/to/dataset/in/pod
volumes:
- name: dataset-volume
  persistentVolumeClaim:
    claimName: nfs-pvc

新手友好的注意事项

  • 如果用hostPath,一定要确保你指定的节点有至少1.3T的空闲空间,不然下载会失败。可以用kubectl describe node <节点名>查看节点的存储情况。
  • 如果你不需要修改数据集,可以把PV的accessModes改成ReadOnlyMany,这样多个训练Pod挂载时更安全,也能减少资源占用。
  • 下载数据时,如果数据集很大,建议新开一个终端窗口,或者用后台运行命令,避免断开连接导致任务中断。
  • 等集群重建完成后,直接用Minio的CSI驱动挂载数据会更方便,但目前这个方案完全能作为临时 workaround。

备注:内容来源于stack exchange,提问作者Roland Deschain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 12:35:32