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

在Kubernetes Pod中实现本地持久存储与NFS共享的双向同步

Kubernetes Pod本地存储与NFS双向同步方案(基于Unison)

整体思路

利用Unison实现本地存储卷与NFS共享目录的双向同步:

  • 用Init容器完成Pod启动时的全量同步,确保业务容器启动前本地数据与NFS一致
  • 用Sidecar容器持续监听目录变化,实时执行双向同步
  • 适配单副本场景,避免多副本同步冲突

1. 构建Unison同步镜像

Unison未提供官方镜像,需自定义构建,以下是基于Alpine的Dockerfile:

FROM alpine:3.18

# 安装Unison及依赖工具
RUN apk add --no-cache unison inotify-tools

WORKDIR /sync

CMD ["unison"]

构建镜像命令:

docker build -t unison-sync:v1 .

注:确保镜像推送到集群可访问的镜像仓库


2. 配置NFS存储卷

先定义NFS类型的PersistentVolume(PV)和PersistentVolumeClaim(PVC),供Pod挂载:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: <你的NFS服务器IP>
    path: /nfs/shared/app-data # NFS共享目录路径
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi

3. 部署带同步逻辑的Pod

以下Pod配置包含:

  • 本地持久存储(示例用hostPath,可替换为local PV)
  • Init容器:首次全量同步NFS到本地
  • 业务容器:挂载本地存储运行
  • Sidecar容器:持续双向同步本地与NFS
apiVersion: v1
kind: Pod
metadata:
  name: app-with-unison-sync
spec:
  volumes:
    # 本地持久存储卷
    - name: local-storage
      hostPath:
        path: /var/local/app-data
        type: DirectoryOrCreate
    # NFS存储卷
    - name: nfs-storage
      persistentVolumeClaim:
        claimName: nfs-pvc
  # 初始化同步容器:启动时完成全量同步,同步完成后业务容器才启动
  initContainers:
    - name: unison-init-sync
      image: unison-sync:v1
      command: ["unison"]
      args:
        - "/nfs"
        - "/local"
        - "-auto"
        - "-batch"
        - "-ignore=Name{.git,.ssh,.tmp}" # 可选:忽略无需同步的文件/目录
      volumeMounts:
        - name: local-storage
          mountPath: /local
        - name: nfs-storage
          mountPath: /nfs
      securityContext:
        runAsUser: 1000 # 需与业务容器UID/GID保持一致,避免权限问题
        runAsGroup: 1000
  containers:
    # 业务容器示例,替换为你的实际业务镜像
    - name: app-container
      image: your-business-app:v1
      volumeMounts:
        - name: local-storage
          mountPath: /app/data # 业务容器的数据目录
      securityContext:
        runAsUser: 1000
        runAsGroup: 1000
    # 持续同步Sidecar容器
    - name: unison-sidecar
      image: unison-sync:v1
      command: ["unison"]
      args:
        - "/local"
        - "/nfs"
        - "-repeat"
        - "watch" # 监听目录变化,实时触发同步
        - "-auto"
        - "-batch"
        - "-ignore=Name{.git,.ssh,.tmp}"
      volumeMounts:
        - name: local-storage
          mountPath: /local
        - name: nfs-storage
          mountPath: /nfs
      securityContext:
        runAsUser: 1000
        runAsGroup: 1000

关键注意事项

  • 权限一致性:同步容器与业务容器必须使用相同的UID/GID,否则会出现文件读写权限问题
  • 单副本约束:必须严格保持Pod单副本运行,多副本同时双向同步会导致数据冲突、不一致
  • NFS权限:确保NFS服务器的共享目录权限允许Pod的UID/GID读写(可通过chown 1000:1000 /nfs/shared/app-data或设置NFS导出参数)
  • Unison参数:-auto自动选择同步操作,-batch无交互执行,-repeat watch持续监听目录变化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:07:14