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

Kubernetes中PV无法持久化数据库数据问题求助

问题分析与解决

核心原因

你用的是hostPath类型的PersistentVolume,这种存储是绑定到单个集群节点的本地目录上的。当删除重建Deployment时,新Pod可能被调度到集群里的其他节点,此时挂载的是新节点的/mnt/data/目录,自然看不到旧节点上存储的数据。

验证方法

  • 查看旧Pod所在节点:kubectl describe pod <旧Pod名称> | grep Node:
  • 查看新Pod所在节点:kubectl describe pod <新Pod名称> | grep Node:
  • 如果两个节点不同,就能确认是调度到不同节点导致的数据丢失。

解决方案

1. 强制Pod调度到固定节点(临时方案)

给Pod添加节点亲和性,确保每次重建都调度到原来的节点:
修改Deployment的spec.template.spec部分:

spec:
  containers:
    # 原有容器配置保持不变
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/hostname
            operator: In
            values:
            - <你的节点名称>  # 替换成旧Pod所在的节点名

2. 使用集群级持久化存储(推荐方案)

放弃hostPath,改用集群支持的分布式存储方案,比如:

  • Local Persistent Volume:绑定到特定节点,但需要配合节点亲和性和调度约束,适合有状态应用
  • 云厂商提供的存储:比如AWS EBS、Azure Disk、阿里云云盘等,这类存储可跟随Pod调度(部分需额外配置)
  • 分布式存储系统:比如Ceph、GlusterFS、Longhorn等,支持跨节点的数据共享

3. 检查hostPath目录权限(额外注意点)

即使Pod调度到同一节点,也可能因为节点上/mnt/data/目录的权限问题,导致MySQL无法写入数据,最终看起来像数据丢失。可以登录节点检查:

# 查看目录权限
ls -ld /mnt/data/
# 查看目录内文件(如果有旧数据)
ls -l /mnt/data/

MySQL容器内的运行用户是mysql(UID通常是999),需要确保节点上的/mnt/data/目录对该UID有读写权限:

chown -R 999:999 /mnt/data/

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:35:07