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
相关产品推荐
相关产品推荐

