K8s部署MySQL8.0数据库

Kubernetes 部署 MySQL 8.0 专业指南

🧩 完整部署方案

1. 创建专用命名空间

复制代码
kubectl create namespace database

2. 配置持久化存储

复制代码
# mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  namespace: database
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: standard # 根据集群存储类调整
  resources:
    requests:
      storage: 10Gi

3. 安全凭证配置(Secret)

复制代码
kubectl create secret generic mysql-secrets -n database \
  --from-literal=mysql-root-password='YourStrongRootPass!123' \
  --from-literal=mysql-password='YourUserPass!456'

4. 部署 MySQL StatefulSet

复制代码
# mysql-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: database
spec:
  serviceName: mysql
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secrets
              key: mysql-root-password
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secrets
              key: mysql-password
        - name: MYSQL_USER
          value: "appuser"
        - name: MYSQL_DATABASE
          value: "appdb"
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
        resources:
          requests:
            memory: "512Mi"
            cpu: "0.5"
          limits:
            memory: "1Gi"
            cpu: "1"
        livenessProbe:
          exec:
            command: ["mysqladmin", "ping", "-h", "localhost"]
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          exec:
            command: ["mysql", "-uappuser", "-p${MYSQL_PASSWORD}", "-e", "SELECT 1"]
          initialDelaySeconds: 5
          periodSeconds: 5
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pvc

5. 创建 MySQL 服务

复制代码
# mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: database
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: mysql
  clusterIP: None # Headless Service

🔒 高级安全配置

1. 加密通信(TLS)

复制代码
# 生成证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout mysql.key -out mysql.crt -subj "/CN=mysql.database.svc.cluster.local"

# 创建 Kubernetes Secret
kubectl create secret tls mysql-tls -n database \
  --cert=mysql.crt \
  --key=mysql.key

2. 在 StatefulSet 中添加 TLS 配置

复制代码
# 在容器配置中添加
volumeMounts:
- name: tls-certs
  mountPath: "/etc/mysql/certs"
  readOnly: true

# 在volumes部分添加
volumes:
- name: tls-certs
  secret:
    secretName: mysql-tls
    defaultMode: 0400

# 在env中添加
- name: MYSQL_SSL_CERT
  value: "/etc/mysql/certs/tls.crt"
- name: MYSQL_SSL_KEY
  value: "/etc/mysql/certs/tls.key"

⚙️ 配置优化

1. 自定义 MySQL 配置

复制代码
# 创建 ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
  namespace: database
data:
  my.cnf: |
    [mysqld]
    innodb_buffer_pool_size = 512M
    max_connections = 200
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    default_authentication_plugin = mysql_native_password
    skip-name-resolve
    log-bin = mysql-bin
    server-id = 1
    binlog_format = ROW
    transaction_isolation = READ-COMMITTED

2. 在 StatefulSet 中挂载配置

复制代码
volumeMounts:
- name: mysql-config
  mountPath: /etc/mysql/conf.d/my.cnf
  subPath: my.cnf

volumes:
- name: mysql-config
  configMap:
    name: mysql-config

🔄 高可用方案(主从复制)

1. 主库配置(StatefulSet 0)

复制代码
env:
- name: MYSQL_REPLICATION_MODE
  value: "master"
- name: MYSQL_REPLICATION_USER
  value: "repl"
- name: MYSQL_REPLICATION_PASSWORD
  valueFrom:
    secretKeyRef:
      name: mysql-secrets
      key: mysql-repl-password

2. 从库配置(StatefulSet 1+)

复制代码
env:
- name: MYSQL_REPLICATION_MODE
  value: "slave"
- name: MYSQL_MASTER_HOST
  value: "mysql-0.mysql.database.svc.cluster.local"
- name: MYSQL_MASTER_PORT
  value: "3306"
- name: MYSQL_REPLICATION_USER
  value: "repl"
- name: MYSQL_REPLICATION_PASSWORD
  valueFrom:
    secretKeyRef:
      name: mysql-secrets
      key: mysql-repl-password

📊 监控配置(Prometheus)

1. 启用 MySQL Exporter

复制代码
# 在 StatefulSet 中添加 sidecar 容器
- name: mysql-exporter
  image: prom/mysqld-exporter:v0.14.0
  env:
    - name: DATA_SOURCE_NAME
      value: "exporter:ExporterPass123@(localhost:3306)/"
  ports:
    - containerPort: 9104
      name: metrics

2. ServiceMonitor 配置

复制代码
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: mysql-monitor
  namespace: database
spec:
  selector:
    matchLabels:
      app: mysql
  endpoints:
  - port: metrics
    interval: 30s
  namespaceSelector:
    matchNames:
    - database

🚀 部署命令

复制代码
# 应用所有配置
kubectl apply -f mysql-pvc.yaml
kubectl apply -f mysql-secrets.yaml
kubectl apply -f mysql-config.yaml
kubectl apply -f mysql-statefulset.yaml
kubectl apply -f mysql-service.yaml
kubectl apply -f mysql-tls.yaml
kubectl apply -f mysql-monitor.yaml

# 验证部署
kubectl -n database get pods -l app=mysql
kubectl -n database logs mysql-0 -c mysql

🔧 维护操作

1. 数据库备份

复制代码
# 创建备份任务
kubectl -n database exec mysql-0 -- \
  mysqldump -u root -p$MYSQL_ROOT_PASSWORD --all-databases | gzip > mysql-backup-$(date +%F).sql.gz

2. 数据库恢复

复制代码
gunzip < mysql-backup-2023-08-15.sql.gz | kubectl -n database exec -i mysql-0 -- \
  mysql -u root -p$MYSQL_ROOT_PASSWORD

3. 版本升级

复制代码
# 滚动更新策略
kubectl -n database patch statefulset mysql \
  -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}'
  
# 更新镜像版本
kubectl -n database set image statefulset/mysql mysql=mysql:8.0.33

💡 最佳实践建议

  1. 资源隔离
    • 使用专用节点池(taints/tolerations)
    • 配置 PodDisruptionBudget
  2. 安全加固
    • 启用网络策略限制访问
    • 定期轮换数据库凭证
  3. 性能优化
    • 使用本地 SSD 存储
    • 调整 InnoDB 缓冲池大小
  4. 灾难恢复
    • 配置定期快照备份
    • 部署跨可用区副本

📊 监控指标关键项

指标 正常范围 告警阈值
连接数 < 最大连接数80% > 90%
QPS 根据业务负载 突增300%
缓冲池命中率 > 95% < 90%
复制延迟 < 1s > 5s
磁盘空间 < 80% > 90%

通过此方案,您将在 Kubernetes 上获得一个生产级、高可用的 MySQL 8.0 部署,具备完善的安全防护、监控告警和灾备能力。

相关推荐
张洛闻Eren9 小时前
MySQL 维护稳定系统【MySQL第二课】
linux·数据库·mysql·云原生
布莱克60510 小时前
理解索引:从概念到实践
数据库·mysql
虎头金猫10 小时前
如何在群晖NAS上通过Docker部署CloudSaver?群晖部署CloudSaver教程|聚合资源搜索并实现远程访问
运维·服务器·网络·python·docker·容器·pandas
我不是疯子是傻子13 小时前
Qt CAN通信周期发送抖动?实测定时器精度校准与时间戳补偿方案
开发语言·数据库·qt
mounter62513 小时前
MACsec 全景解析:从技术演进、核心架构到 DPU 硬件卸载与 K8s 大规模调度实战
linux·kubernetes·linux kernel·kernel·macsec
这个DBA有点耶13 小时前
数据库迁移怎么做到“零翻车“:金仓 KDMS/KDTS/KFS 工具链实测
数据库·架构·dba
2501_9378609414 小时前
MySQL联合查询(多表查询)
数据库·mysql
名字还没想好☜14 小时前
Next.js 用 Server Components 直连数据库:去掉 API 层的边界,和三条别踩的安全红线
前端·javascript·数据库·安全·react·next.js
迷迭香yy15 小时前
行业板块轮动因子实战从板块资金到因子建模的本地化Python全流程
数据库·人工智能·python
SelectDB15 小时前
抖音集团 实时数据仓库:Apache Doris / SelectDB 的技术能力与实践
数据库