K8S中MySQL配置持久化存储

ops/2025/3/14 8:00:25/

在 Kubernetes 中为有状态应用(如 MySQL)配置持久化存储,需结合 StatefulSetPersistentVolumeClaim (PVC)StorageClass,确保数据在 Pod 重启或迁移时不会丢失。以下是详细步骤和最佳实践:


一、核心组件选择

组件作用
StatefulSet为每个 Pod 提供唯一的网络标识和稳定的持久化存储(按顺序创建/删除)。
PVC声明 Pod 所需的存储容量和访问模式(如 ReadWriteOnce)。
StorageClass定义动态创建 PV 的规则(如云厂商存储类型、回收策略)。

二、配置步骤(以 MySQL 为例)

1. 创建 StorageClass(可选,若需动态供应)

如果是云环境(如 AWS、GCP),通常已有默认 StorageClass。若需自定义(例如本地存储),需手动配置:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: mysql-storage
provisioner: kubernetes.io/aws-ebs  # 根据环境调整(如 rook-ceph、local)
parameters:type: gp3                         # AWS EBS 类型(或 SSD、HDD)
reclaimPolicy: Retain               # 删除 PVC 后保留 PV 和数据
volumeBindingMode: WaitForFirstConsumer  # 延迟绑定到 Pod 调度节点
2. 定义 StatefulSet 和 PVC 模板
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql
spec:serviceName: mysql-headless     # Headless Service 用于 Pod 发现replicas: 1                     # 单节点示例(生产环境建议集群化)selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:8.0env:- name: MYSQL_ROOT_PASSWORDvalue: "your-root-password"ports:- containerPort: 3306volumeMounts:- name: mysql-datamountPath: /var/lib/mysql  # MySQL 数据目录volumeClaimTemplates:           # 自动为每个 Pod 创建 PVC- metadata:name: mysql-dataspec:accessModes: [ "ReadWriteOnce" ]storageClassName: mysql-storage  # 使用自定义 StorageClassresources:requests:storage: 20Gi               # 根据需求调整容量
3. 创建 Headless Service
apiVersion: v1
kind: Service
metadata:name: mysql-headless
spec:clusterIP: None   # Headless Service 无 ClusterIPselector:app: mysqlports:- port: 3306

三、关键配置说明

1. 存储访问模式 (accessModes)
  • ReadWriteOnce (RWO):单节点读写(适合单实例 MySQL)。

  • ReadWriteMany (RWX):多节点读写(适用于分布式数据库如 Cassandra)。

  • ReadOnlyMany (ROX):多节点只读。

2. 持久化路径
  • MySQL 默认数据目录为 /var/lib/mysql,必须挂载到持久化卷。

  • 挂载其他路径(如配置文件)需额外配置。

3. 动态供应 vs 静态供应
  • 动态供应(推荐):通过 StorageClass 自动创建 PV。

  • 静态供应:手动创建 PV 并绑定 PVC(适合本地存储或无云厂商环境)。


四、生产环境优化

1. 高可用配置
  • MySQL 集群:使用 Galera Cluster 或 Group Replication,配合多副本 StatefulSet。

  • 跨可用区存储:配置 StorageClass 支持多 AZ(如 AWS EBS 需结合 topologyKey: topology.kubernetes.io/zone)。

2. 备份与恢复
  • 定期快照:使用云厂商快照工具(如 AWS EBS Snapshot)或 Velero。

  • 逻辑备份:通过 CronJob 执行 mysqldump 并存储到对象存储(如 S3)。

3. 监控与告警
  • 监控 PV/PVC 使用率(Prometheus + kubelet 指标)。

  • 设置 PVC 容量不足的告警规则。


五、验证流程

  1. 部署验证

    kubectl apply -f mysql-statefulset.yaml
    kubectl get statefulset,pvc,pod -l app=mysql
    • 确认 PVC 状态为 Bound,Pod 运行正常。

  2. 数据持久化测试

    • 进入 MySQL Pod 写入测试数据:

      kubectl exec -it mysql-0 -- mysql -u root -p
      CREATE DATABASE test;
    • 删除 Pod 并观察 StatefulSet 自动重建:

      kubectl delete pod mysql-0
      kubectl exec -it mysql-0 -- mysql -u root -p -e "SHOW DATABASES;"  # 确认 test 库存在
  3. 故障恢复测试

    • 模拟节点故障,观察 Pod 重新调度到其他节点后数据是否保留。


六、常见问题

1. PVC 无法绑定
  • 检查 StorageClass 是否存在且配置正确。

  • 确认 PV 的容量和访问模式与 PVC 匹配。

2. 数据写入性能差
  • 使用 SSD 类型 StorageClass(如 AWS gp3io2)。

  • 调整文件系统挂载参数(如 ext4discard 选项)。

3. 存储资源不足
  • 设置 ResourceQuota 限制命名空间存储使用量。

  • 启用 PVC 扩容功能(需存储驱动支持)。


总结

通过 StatefulSet + PVC + StorageClass 的组合,可为 MySQL 等有状态应用提供稳定的持久化存储,同时结合高可用、备份和监控策略,确保生产环境的可靠性和数据安全。实际部署时需根据业务需求调整存储类型、容量和访问模式。


http://www.ppmy.cn/ops/165261.html

相关文章

Linux驱动开发-设备树

Linux驱动开发-设备树 一,设备树简介1. 设备树2. DTS、DTB和DTC 二,DTS语法1.设备节点1.1 字符串型1.2 32位无符号整数1.3 字符串列表 2.设备属性2.1 兼容性 compatible2.2 model2.3 status2.4 reg2.5 #address-cells 和#size-cells 属性 三,…

linux学习(五)(服务器审查,正常运行时间负载,身份验证日志,正在运行的服务,评估可用内存)

服务器审查 在 Linux 中审查服务器的过程包括评估服务器的性能、安全性和配置,以确定需要改进的领域或任何潜在问题。审查的范围可以包括检查安全增强功能、检查日志文件、审查用户帐户、分析服务器的网络配置以及检查其软件版本。 Linux 以其稳定性和安全性而闻名…

Qt状态更新设计

在动平衡仪的使用过程中,配置参数的动态切换(如切换传感器通道、切换单位)需要实时反映在界面显示和计算方法上。为了实现这种动态响应,可以采用 观察者模式(Observer Pattern) 和 事件驱动架构&#xff08…

The Rust Programming Language 学习 (四)

结构体 struct,或者 structure,是一个自定义数据类型,允许你命名和包装多个相关的值,从而形成一个有意义的组合。如果你熟悉一门面向对象语言,struct 就像对象中的数据属性。 定义并实例化结构体 和元组一样&#x…

hive 中各种参数

在 Apache Hive 中,参数(也称为配置属性)用于控制 Hive 的行为和性能。这些参数可以优化查询性能、调整资源使用、解决数据倾斜问题等。Hive 参数通常分为以下几类: 1. 查询执行参数 这些参数用于控制查询的执行方式和性能。 1.…

死锁的产生以及如何避免

死锁的产生与避免 一、死锁的产生原因二、典型死锁场景示例三、死锁的检测与诊断1. 使用工具检测死锁2. 日志分析 四、死锁的避免策略1. 破坏“请求与保持”条件2. 破坏“不可剥夺”条件3. 破坏“循环等待”条件4. 使用超时机制5. 减少锁的粒度 五、最佳实践总结六、总结 一、死…

20250311-vue-Props1

Props 声明 一个组件需要显式声明它所接受的 props,这样 Vue 才能知道外部传入的哪些是 props,哪些是透传 attribute。 props 需要使用 props 选项来定义: export default {props: [foo],created() {// props 会暴露到 this 上console.log…

C++设计模式-观察者模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析

一、基本介绍 1.1 模式定义与核心思想 观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象间一对多的依赖关系。当被观察对象(Subject)状态改变时,所有依赖它的观察者(Observer&…