详细介绍:Kubernetes实战:MariaDB误删恢复与数据持久化

news/2025/10/4 16:36:50/文章来源:https://www.cnblogs.com/wzzkaifa/p/19125712

MariaDB Deployment 误删恢复与数据持久化实战指南

在 Kubernetes 集群中,数据库类应用的数据持久性是核心诉求 —— 一旦 Deployment 被误删,若未做好数据持久化,将直接导致业务数据丢失。本文以 “MariaDB Deployment 误删后恢复” 为场景,详细讲解如何通过 PersistentVolumeClaim(PVC)绑定现有 PersistentVolume(PV),实现 Deployment 恢复与数据持久化,同时拆解每一步背后的关键知识点。

一、场景背景与核心目标

1. 问题场景

  • 集群中mariadb命名空间下的 MariaDB Deployment 被误删除,需重新恢复部署。
  • 集群已存在一个可用的 PersistentVolume(PV),需利用该 PV 确保 MariaDB 数据不丢失(避免 Pod 重建后数据归零)。

2. 核心目标

  • 创建符合规格的 PVC,绑定现有 PV;
  • 修复 Deployment 配置,挂载 PVC 实现数据持久化;
  • 验证 Deployment 正常运行且数据持久化生效。

二、前置知识与环境准备

在开始操作前,需明确以下基础概念与环境前提,这是理解后续步骤的关键。

1. 核心知识点铺垫

概念

作用与核心逻辑

PV(PersistentVolume)

集群级别的 “持久化存储资源”,由管理员提前创建,对应物理存储(如本地磁盘、云存储),生命周期独立于 Pod。

PVC(PersistentVolumeClaim)

Pod 对 PV 的 “存储请求”,由开发 / 运维人员创建,声明所需的存储大小、访问模式,K8s 会自动匹配符合条件的 PV 并绑定。

数据持久化

数据库数据默认存储在 Pod 的 “临时存储” 中(Pod 删除后数据丢失),通过将 PVC 挂载到 Pod 的 “数据目录”,可将数据写入 PV,实现 Pod 重建后数据仍保留。

访问模式(Access Mode)

定义 PVC 如何使用 PV,本次需用ReadWriteOnce(仅允许单个节点上的单个 Pod 读写,适合数据库单实例场景)。

2. 环境前提

  • 已存在mariadb命名空间(可通过kubectl get ns mariadb验证,不存在则执行kubectl create ns mariadb创建);
  • 集群中存在可用 PV(可通过kubectl get pv查看,状态为Available表示可绑定);
  • 本地已存在待修复的~/mariadb-deployment.yaml文件;
  • 已安装kubectl工具并配置集群访问权限。

三、实战步骤:从 PVC 创建到 Deployment 恢复

步骤 1:创建符合规格的 PVC(绑定现有 PV)

首先需创建 PVC,声明 MariaDB 所需的存储资源,让 K8s 自动绑定现有 PV。

1.1 编写 PVC 配置文件

创建mariadb-pvc.yaml文件,内容如下(需严格匹配规格要求):

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mariadb-pvc # PVC名称,后续Deployment需引用该名称
namespace: mariadb # 限定在mariadb命名空间
spec:
accessModes:
- ReadWriteOnce # 访问模式:单节点读写
resources:
requests:
storage: 250Mi # 存储大小:250兆
# 若PV有指定storageClassName,需在此添加(如storageClassName: "standard")
# 无则省略,K8s会匹配同命名空间下无storageClassName的PV
1.2 执行 PVC 创建命令
kubectl apply -f mariadb-pvc.yaml
1.3 验证 PVC 绑定状态
kubectl get pvc -n mariadb
  • 若输出状态为Bound,表示 PVC 已成功绑定现有 PV(VOLUME列会显示绑定的 PV 名称);
  • 若状态为Pending,需检查 PV 是否满足条件(如 PV 的存储大小≥250Mi、访问模式包含ReadWriteOnce、无命名空间限制等)。

关键原理:PVC 是 “存储请求的抽象”,它不直接关联物理存储,而是通过 K8s 的 “PV-PVC 绑定机制”,匹配符合需求的 PV—— 这一步是数据持久化的基础,没有 PVC,Pod 无法使用 PV 的持久化存储。

步骤 2:编辑 Deployment 文件,挂载 PVC

误删的 Deployment 文件(~/mariadb-deployment.yaml)可能未配置持久化存储,需修改文件,将步骤 1 创建的 PVC 挂载到 MariaDB 的数据目录。

2.1 理解 Deployment 挂载逻辑

MariaDB 的数据默认存储在容器内的/var/lib/mysql目录(不同版本可能略有差异,需确认),我们需要:

  • 在 Deployment 的spec.template.spec中添加volumes,引用 PVC;
  • 在containers中添加volumeMounts,将 PVC 挂载到/var/lib/mysql目录。
2.2 编辑 Deployment 文件(核心修改部分)

打开~/mariadb-deployment.yaml,找到spec.template.spec节点,添加如下配置:

apiVersion: apps/v1
kind: Deployment
metadata:
name: mariadb # Deployment名称,与原误删名称一致
namespace: mariadb
spec:
replicas: 1 # 单实例(数据库通常先部署单实例)
selector:
matchLabels:
app: mariadb
template:
metadata:
labels:
app: mariadb
spec:
containers:
- name: mariadb
image: mariadb:latest # 镜像版本根据实际需求指定
ports:
- containerPort: 3306
# 关键1:将PVC挂载到容器的数据目录
volumeMounts:
- name: mariadb-storage # 与下方volumes.name保持一致
mountPath: /var/lib/mysql # MariaDB数据存储路径
subPath: mysql # 可选,在PV中创建子目录,避免存储冲突
env: # 数据库必要环境变量(如root密码,根据实际需求添加)
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret # 需提前创建secret存储密码
key: root-password
# 关键2:定义volume,引用PVC
volumes:
- name: mariadb-storage
persistentVolumeClaim:
claimName: mariadb-pvc # 引用步骤1创建的PVC名称
2.3 配置说明
  • volumeMounts.mountPath:必须指向 MariaDB 的实际数据目录(可通过docker inspect mariadb查看镜像默认数据路径);
  • volumes.persistentVolumeClaim.claimName:必须与步骤 1 创建的 PVC 名称完全一致,否则无法挂载;
  • env部分:数据库运行需配置 root 密码等环境变量,建议用 Secret 存储敏感信息(避免明文写在 Deployment 中)。

步骤 3:应用更新后的 Deployment 文件

将修改后的 Deployment 配置应用到集群,恢复 MariaDB 部署。

3.1 执行应用命令
kubectl apply -f ~/mariadb-deployment.yaml
3.2 查看 Deployment 创建进度
kubectl get deployment -n mariadb
  • 若READY列显示1/1,表示 Deployment 已成功创建 1 个 Pod 实例;
  • 若STATUS为Progressing,可通过kubectl describe deployment mariadb -n mariadb查看创建日志(如镜像拉取失败、PVC 挂载错误等)。

步骤 4:验证 Deployment 运行状态与数据持久化

Deployment 创建成功后,需从 “运行状态” 和 “数据持久化” 两方面验证,确保业务可用。

4.1 验证 Pod 运行状态
kubectl get pods -n mariadb
  • 若 Pod 状态为Running,表示容器正常启动;
  • 若状态为CrashLoopBackOff,需检查:
    1. PVC 是否成功挂载(kubectl describe pod <pod-name> -n mariadb查看Volumes部分);
    1. 环境变量是否配置正确(如 Secret 是否存在、密码是否正确);
    1. 数据目录权限(可在容器中执行ls -ld /var/lib/mysql查看权限)。
4.2 验证数据持久化(关键步骤)

数据持久化的核心是 “Pod 删除后数据不丢失”,验证方法如下:

  1. 进入 Pod,创建测试数据
# 进入MariaDB容器
kubectl exec -it  -n mariadb -- bash
# 登录MariaDB,创建测试数据库
mysql -u root -p
# 输入密码后执行
CREATE DATABASE test_db;
exit # 退出MariaDB
exit # 退出容器
  1. 删除当前 Pod(模拟 Pod 重建场景)
kubectl delete pod  -n mariadb -n mariadb
  • Deployment 会自动重建新 Pod(因为replicas: 1),等待新 Pod 状态变为Running。
  1. 检查测试数据是否保留
# 进入新Pod
kubectl exec -it  -n mariadb -- bash
# 登录MariaDB,查看测试数据库
mysql -u root -p
SHOW DATABASES LIKE 'test_db';
  • 若输出包含test_db,表示数据已通过 PV 持久化,Pod 重建后数据未丢失;
  • 若数据丢失,需检查 PVC 挂载路径是否正确、PV 是否正常(kubectl describe pv <pv-name>查看状态)。

四、关键知识点总结

本次实战涉及 K8s 存储与部署的核心知识点,理解这些能帮助你应对更多类似场景:

1. PV 与 PVC 的关系

  • PV 是 “资源”,PVC 是 “请求”,二者通过 K8s 自动匹配绑定,绑定后 PVC 独占 PV(除非 PV 设置reclaimPolicy: Recycle,但已 deprecated);
  • 绑定条件:访问模式兼容、存储大小满足、storageClassName 一致(若指定)、命名空间匹配(仅针对Namespaced的 PV)。

2. 访问模式的选择

访问模式

含义

适用场景

ReadWriteOnce(RWO)

仅允许单个节点上的单个 Pod 读写

数据库单实例(如 MariaDB、MySQL)

ReadOnlyMany(ROX)

允许多个 Pod 只读访问

静态资源共享(如配置文件、日志)

ReadWriteMany(RWX)

允许多个节点的多个 Pod 读写

分布式存储(如 NFS、GlusterFS)

  • 数据库场景优先选ReadWriteOnce,避免多 Pod 同时写导致数据冲突。

3. Deployment 与数据持久化的结合

  • Deployment 管理 Pod 的生命周期,但 Pod 默认使用 “临时存储”;
  • 只有通过volumes引用 PVC,将持久化存储挂载到 Pod 的数据目录,才能实现 “Pod 重建数据不丢”;
  • 若需升级数据库版本,Deployment 的滚动更新会创建新 Pod,只要 PVC 挂载正确,数据会自动继承。

五、常见问题排查

  1. PVC 一直 Pending
    • 检查 PV 是否存在且状态为Available;
    • 检查 PV 的capacity.storage是否≥PVC 的requests.storage;
    • 检查 PV 的accessModes是否包含 PVC 的访问模式。
  1. Pod 启动失败,提示 “permission denied”
    • 容器内数据目录权限不足,可在 Deployment 中添加securityContext:
securityContext:
fsGroup: 999 # MariaDB默认用户组ID,根据镜像调整
  1. 数据持久化失效
    • 检查volumeMounts.mountPath是否为数据库实际数据目录;
    • 检查 PVC 是否与 Pod 在同一命名空间;
    • 检查 PV 的reclaimPolicy是否为Retain(若为Delete,PV 删除后数据丢失)。

六、结语

MariaDB Deployment 误删恢复的核心,不仅是重新创建 Deployment,更关键是通过 PV/PVC 确保数据持久化 —— 这是数据库类应用在 K8s 中部署的 “生命线”。本文通过 “PVC 创建→Deployment 配置→验证” 的流程,既覆盖了实战操作,也拆解了存储与部署的核心原理,希望能帮助大家在实际工作中应对类似问题,保障业务数据安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/927344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的世界封面制作网站企业网站软件

一&#xff1a;prototype大概概念和用途“prototype”字面翻译是“原型”&#xff0c;是javascript实现继承的主要手段。粗略来说就是&#xff1a;prototype是javascript中的函数(function)的一个保留属性&#xff0c;并且它的值是一个对象&#xff08;我们可以称这个对象为&qu…

泊头做网站的大宗商品交易平台上市公司

Puppeteer 是 Chrome 开发团队在 2017 年发布的一个 Node.js 包&#xff0c;用来模拟 Chrome 浏览器的运行。demo只支持将简单不需要翻页&#xff0c;不需要登陆的页面转换为图片需要node环境&#xff0c;以及npm或cnpm包管理工具(自行百度)开始进入一个新的项目目录&#xff0…

微服务项目->在线oj系统(Java-Spring)--竞赛管理 - 教程

微服务项目->在线oj系统(Java-Spring)--竞赛管理 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

2025整体橱柜厂家TOP企业品牌推荐排行榜,云南昆明整体橱柜全瓷砖,开放式厨房,经济型,一站式无烟柴火灶,嵌入式,智能,多功能,全屋无烟柴火灶整体橱柜公司推荐

在当前整体橱柜市场中,消费者面临着诸多选择难题。部分产品存在耐用性不足的问题,使用一段时间后柜体易出现受潮、霉变现象,尤其是在潮湿的厨房环境中,这一问题更为突出;有些产品虽然外观设计美观,但环保性能不达…

AutoOps:简化自管理 Elasticsearch 的旅程 - 指南

AutoOps:简化自管理 Elasticsearch 的旅程 - 指南2025-10-04 16:27 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…

巩义网站建设费用龙华品牌网站建设

文章目录 同版本多实例配置部署、启动、连接 不同版本多实例配置初始化initialize-insecure 含义 启动 同版本多实例 配置 mkdir -p /data/330{7..9}/data chown -R mysql.mysql /data/* cat > /data/3307/my.cnf <<EOF [mysqld] usermysql basedir/usr/local/mysql …

vite-vue3脚手架(参考帝莎编程-后台管理系统开发)

一 创建项目vite-vue3-app 项目原型: http://shopadmin.dishawang.com/#/ vite: https://vitejs.cn/vite3-cn/ # npm 7+, extra double-dash is needed: npm create vite@latest vite-vue3-app -- --template vuecd …

上传文件的后端程序handleFileUpload()、getOriginalFilename()、UUID及Yaml配置

handleFileUpload()是Element UI中用于自定义文件上传行为的函数,通过http-request属性绑定实现。该函数会在文件选择后触发,负责处理文件上传逻辑,包括文件格式验证、上传进度控制及服务器交互等。 核心功能‌文件…

【视觉SLAM十四讲】视觉里程计 1 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

从模拟入侵到渗透测试:我摸清了黑客的套路,也懂了企业的软肋 - 详解

从模拟入侵到渗透测试:我摸清了黑客的套路,也懂了企业的软肋 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &q…

网站内容通过服务器会不会被更改没有做icp备案的网站

源码下载&#xff1a;B2弹幕插件.zip 这是b2独有的站点信息弹幕插件&#xff0c;专门用来在首页显示站点动态的一款个性化 WordPress插件。喜欢的可以下载回去进行二次开发&#xff0c;还是蛮不错的 基于wordpress 7B2主题开发的一款弹幕插件/气泡插件 功能一览 插件安装&a…

同样的Python代码,在Windows上运行没有错误,在Linux Centos上运行出行错误。

原因: 两个地方里面的包的版本不一致。 需要一个一个检查版本:比如python的版本,torch的版本。out = F.conv2d(input=x, weight=weights, bias=b, stride=1, padding=1) # out: (1, unit_channel, l, d)RuntimeErro…

网站建设电话营销郑州市建设局官网

本章学习了图的结构及应用&#xff0c; 首先是图的分类&#xff0c;图分为无向图、有向图、完全图、连通图、强连通图、带权图、稀疏图、稠密图等等。 图的存储方式有两大类&#xff0c;以边集合方式的表示法和以链接方式的表示法。其中&#xff0c;以边集合方式表示的为邻接矩…

FreeBSD 14发布后的技术问题解析

本文详细分析了FreeBSD 14发布后遇到的几个关键技术问题,包括freebsd-update升级异常、EC2 AMI二进制数据处理错误等系统级问题,为系统管理员提供了重要的升级注意事项和解决方案。FreeBSD 14发布后的技术问题 升级前…

handleFileUpload()

handleFileUpload()是Element UI中用于自定义文件上传行为的函数,通过http-request属性绑定实现。该函数会在文件选择后触发,负责处理文件上传逻辑,包括文件格式验证、上传进度控制及服务器交互等。 核心功能‌文件…

包装纸箱公司怎么做网站网站建设襄阳

最近开始接触阿里云服务器&#xff0c;一步步开始自己配置&#xff0c;记录下自己的一步一坑&#xff1a; nginx安装很简单&#xff0c;apt-get install nginx 成功后就可以打开默认站点 nginx配置文件在/etc/nginx目录下的nginx.conf 查看里面的文件内容可以知道&#xff0…

实用指南:Typescript高级类型详解

实用指南:Typescript高级类型详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…

集合幂级数,FMT 与 FWT 学习笔记

应该是我最后也是唯一的学习笔记了。参考资料 https://www.cnblogs.com/alex-wei/p/set_power_series.html https://www.cnblogs.com/Troverld/p/14601821.html https://www.luogu.com.cn/article/y0unggsj警告! 本文…

2025多校CSP模拟赛1

2025多校CSP模拟赛1 开 T1 水,开 T2 发现能乱搞,搞完发现是正确的。 开 T3 发现是熟悉的 dp,马上开写一个插板。 写了 2h 后发现占地面积不好算,放弃了。 T1 交友 发现只要特判类似 CG GC即可。 T2 炼金 因为环一定…