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 部署,具备完善的安全防护、监控告警和灾备能力。

相关推荐
SelectDB28 分钟前
2-5 倍性能提升,30% 成本降低,阿里云 SelectDB 存算分离架构助力波司登集团实现降本增效
大数据·数据库·数据分析
SelectDB34 分钟前
湖仓一体:小米集团基于 Apache Doris + Apache Paimon 实现 6 倍性能飞跃
数据库·开源·github
hello_ world.1 小时前
k8s笔记04-常用部署命令
笔记·容器·kubernetes
Hello.Reader1 小时前
Kafka 在 6 大典型用例的落地实践架构、参数与避坑清单
数据库·架构·kafka
数巨小码人2 小时前
AI+数据库:国内DBA职业发展与国产化转型实践
数据库·人工智能·ai·dba
mask哥2 小时前
详解flink SQL基础(四)
java·大数据·数据库·sql·微服务·flink
小猿姐3 小时前
如何在 OpenShift 上部署和使用 KubeBlocks
云原生·kubernetes
小猿姐3 小时前
KubeBlocks for Kafka 揭秘
kafka·kubernetes
左灯右行的爱情3 小时前
分库分表系列-基础内容
网络·数据库·oracle
Monly213 小时前
Docker:部署Nginx
nginx·docker·容器