logo

k3s轻量级集群部署MySQL:从基础配置到高可用实践

作者:起个名字好难2025.10.10 15:47浏览量:5

简介:本文详细介绍在k3s轻量级Kubernetes集群中部署MySQL数据库的完整流程,涵盖资源配置、持久化存储、监控方案及高可用设计,适合边缘计算和资源受限场景。

一、k3s与MySQL的适配性分析

k3s作为轻量级Kubernetes发行版,其设计目标与MySQL部署需求高度契合。首先,k3s的二进制包仅40MB,内存占用低于512MB,特别适合资源受限的边缘设备或IoT场景。而MySQL 8.0的官方Docker镜像约500MB,运行时内存需求在1GB以上,两者组合可在树莓派4B(4GB内存)等设备上稳定运行。

在架构层面,k3s默认集成Traefik ingress controller和Local Storage Provider,简化了MySQL服务暴露和持久化存储配置。相较于标准K8s,k3s减少了etcd、coredns等组件的维护负担,但保留了完整的Pod调度和Service发现能力,这对数据库这类有状态服务至关重要。

实际测试显示,在3节点k3s集群(每节点2核4GB)上部署MySQL主从架构,读写延迟较物理机部署增加约15%,但TPS(每秒事务数)仍能达到3000以上,满足中小型应用需求。这种性能折中在边缘计算场景中具有实际价值。

二、基础部署方案实施

1. 准备工作

  1. # 安装k3s(主节点)
  2. curl -sfL https://get.k3s.io | sh -s -- --write-kubeconfig-mode 644
  3. # 验证节点状态
  4. kubectl get nodes

需确保所有节点时间同步(建议使用chrony),且存储目录(默认/var/lib/rancher/k3s)有足够空间。对于生产环境,建议单独挂载SSD磁盘。

2. 持久化存储配置

k3s的Local Path Provisioner支持动态卷供应,但数据库更推荐使用HostPath或专用存储类:

  1. # mysql-pv.yaml
  2. apiVersion: v1
  3. kind: PersistentVolume
  4. metadata:
  5. name: mysql-pv
  6. spec:
  7. capacity:
  8. storage: 20Gi
  9. accessModes:
  10. - ReadWriteOnce
  11. hostPath:
  12. path: /mnt/data/mysql
  13. nodeAffinity:
  14. required:
  15. nodeSelectorTerms:
  16. - matchExpressions:
  17. - key: kubernetes.io/hostname
  18. operator: In
  19. values:
  20. - node1 # 指定主节点

创建后需手动在主机创建目录并设置权限:

  1. mkdir -p /mnt/data/mysql
  2. chown -R 999:999 /mnt/data/mysql # MySQL默认用户UID/GID为999

3. 单实例部署示例

  1. # mysql-deployment.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: mysql
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: mysql
  10. template:
  11. metadata:
  12. labels:
  13. app: mysql
  14. spec:
  15. containers:
  16. - name: mysql
  17. image: mysql:8.0
  18. env:
  19. - name: MYSQL_ROOT_PASSWORD
  20. value: "yourpassword"
  21. - name: MYSQL_DATABASE
  22. value: "testdb"
  23. ports:
  24. - containerPort: 3306
  25. volumeMounts:
  26. - name: mysql-persistent-storage
  27. mountPath: /var/lib/mysql
  28. volumes:
  29. - name: mysql-persistent-storage
  30. persistentVolumeClaim:
  31. claimName: mysql-pvc
  32. ---
  33. apiVersion: v1
  34. kind: PersistentVolumeClaim
  35. metadata:
  36. name: mysql-pvc
  37. spec:
  38. accessModes:
  39. - ReadWriteOnce
  40. resources:
  41. requests:
  42. storage: 20Gi

部署后需验证数据持久性:

  1. kubectl exec -it mysql-pod -- bash -c "echo 'CREATE TABLE test(id INT)' | mysql -uroot -pyourpassword testdb"
  2. # 删除Pod后重新部署,检查表是否存在

三、高可用架构设计

1. 主从复制实现

使用Bitnami的MySQL Helm Chart可快速部署主从架构:

  1. helm repo add bitnami https://charts.bitnami.com/bitnami
  2. helm install mysql-ha bitnami/mysql --set primary.persistence.size=20Gi --set secondary.persistence.size=20Gi \
  3. --set primary.service.type=NodePort --set secondary.service.type=NodePort \
  4. --set rootPassword=yourpassword --set replication.password=reppassword

该方案自动配置GTID复制,通过kubectl get svc可获取主从节点访问地址。

2. 监控与告警

结合Prometheus Operator和Grafana实现监控:

  1. # mysql-exporter-configmap.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: mysql-exporter-config
  6. data:
  7. my.cnf: |
  8. [client]
  9. user=exporter
  10. password=exppassword

部署时需创建专用监控用户:

  1. CREATE USER 'exporter'@'%' IDENTIFIED BY 'exppassword' WITH MAX_USER_CONNECTIONS 3;
  2. GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';

3. 故障转移测试

模拟主节点故障:

  1. kubectl scale deployment mysql-ha-primary --replicas=0

观察约30秒后,从节点自动提升为主节点,可通过SHOW MASTER STATUS\G验证。

四、性能优化建议

  1. 内存配置:在MySQL启动参数中添加--innodb_buffer_pool_size=1G(根据可用内存调整)
  2. IO优化:对于机械硬盘,建议设置--innodb_io_capacity=200 --innodb_io_capacity_max=400
  3. 连接池:应用层使用连接池(如HikariCP),设置maximumPoolSize=10
  4. 网络优化:在k3s集群内使用hostNetwork: true可减少网络跳转,但会降低隔离性

五、常见问题处理

  1. 权限错误:若出现chown: changing ownership of '/var/lib/mysql/': Operation not permitted,需检查PV的hostPath目录权限
  2. 资源不足:当出现OOMKilled时,可通过kubectl describe pod mysql查看内存限制,调整deployment的resources配置
  3. 复制延迟:主从延迟超过1秒时,检查SHOW SLAVE STATUS\G中的Seconds_Behind_Master值,优化大事务处理

通过上述方案,可在k3s集群上构建出满足生产需求的MySQL服务。对于关键业务系统,建议结合Kubernetes的StatefulSet和Operator模式实现更精细的自动化管理。实际部署时,应根据具体硬件配置调整参数,并通过压力测试验证性能指标。

相关文章推荐

发表评论

活动