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

