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

Kubernetes不同Deployment间共享存储方案选型与实现咨询

推荐方案:Local Persistent Volume(本地持久卷)

选型理由

  • 属于Kubernetes原生存储方案,比HostPath更规范、可管理,既支持数据持久化,也可按需配置回收策略;
  • 由于你的两个应用能严格保证写完成后再读,不存在并发读写冲突,本地存储的读写性能远优于远程对象存储;
  • 支持单节点或多节点集群(需将两个应用调度到同一节点),适配大部分场景需求。

实现步骤

1. 节点侧准备共享目录

在Kubernetes集群的目标节点上创建用于共享的本地目录,并调整权限适配应用:

mkdir -p /mnt/k8s-shared-storage
chmod 777 /mnt/k8s-shared-storage

2. 创建Local Persistent Volume(PV)

编写local-pv.yaml配置文件:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: shared-local-pv
spec:
  capacity:
    storage: 10Gi  # 根据实际业务需求调整容量
  accessModes:
    - ReadWriteOnce  # 单节点读写模式,匹配同节点共享场景
  persistentVolumeReclaimPolicy: Retain  # 可选:Delete(删除PV时自动清理数据)或Retain
  storageClassName: local-storage
  local:
    path: /mnt/k8s-shared-storage
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - target-node-name  # 替换为目标节点的主机名

执行命令创建PV:

kubectl apply -f local-pv.yaml

3. 创建PersistentVolumeClaim(PVC)

编写shared-pvc.yaml配置文件:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: shared-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: local-storage

执行命令创建PVC:

kubectl apply -f shared-pvc.yaml

4. 挂载PVC到应用Pod

修改Application 1和Application 2的Deployment配置,添加卷挂载逻辑:

Application 1的Deployment片段

spec:
  containers:
  - name: app1
    image: your-app1-image
    volumeMounts:
    - name: shared-storage
      mountPath: /app/storage  # 替换为Application 1的文件写入路径
  volumes:
  - name: shared-storage
    persistentVolumeClaim:
      claimName: shared-pvc
  # 强制调度到PV所在节点
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/hostname
            operator: In
            values:
            - target-node-name

Application 2的Deployment片段

spec:
  containers:
  - name: app2
    image: your-app2-image
    volumeMounts:
    - name: shared-storage
      mountPath: /app/input  # 替换为Application 2的文件读取路径
  volumes:
  - name: shared-storage
    persistentVolumeClaim:
      claimName: shared-pvc
  # 强制调度到同一节点
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/hostname
            operator: In
            values:
            - target-node-name

5. 调整应用业务逻辑

  • Application 1不再上传文件到GCS,直接将文件写入挂载的本地目录,然后将本地文件路径(如/app/storage/test.file)传入共享队列;
  • Application 2从队列获取本地路径后,直接读取挂载目录下的文件处理,无需再执行下载操作。

备选轻量方案:EmptyDir(同Pod部署场景)

如果你的两个应用可以部署在同一个Pod的不同容器中,EmptyDir是更轻量的选择,无需PV/PVC配置:

spec:
  containers:
  - name: app1
    image: your-app1-image
    volumeMounts:
    - name: shared-storage
      mountPath: /app/storage
  - name: app2
    image: your-app2-image
    volumeMounts:
    - name: shared-storage
      mountPath: /app/input
  volumes:
  - name: shared-storage
    emptyDir: {}  # Pod销毁时数据自动清理

内容的提问来源于stack exchange,提问作者No1Lives4Ever

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:46:18