Kubernetes 单实例有状态应用部署实战:MySQL 案例解析

Kubernetes 单实例有状态应用部署实战:MySQL 案例解析

website Kubernetes website and documentation repo: website 项目地址: https://gitcode.com/gh_mirrors/webs/website

前言

在 Kubernetes 中部署有状态应用与无状态应用有着显著不同。本文将深入探讨如何在 Kubernetes 中部署一个单实例的 MySQL 数据库,这是理解 Kubernetes 有状态工作负载管理的重要一步。

核心概念解析

有状态应用的特点

有状态应用(如 MySQL、PostgreSQL 等数据库)具有以下关键特征:

  1. 数据持久性:需要长期保存数据,即使容器重启或迁移
  2. 唯一标识:通常需要稳定的网络标识和存储
  3. 有序部署:可能需要特定的启动和停止顺序

Kubernetes 相关组件

在本次部署中,我们将使用几个关键的 Kubernetes 资源:

  1. PersistentVolume (PV):集群中的存储资源
  2. PersistentVolumeClaim (PVC):Pod 对存储资源的请求
  3. Deployment:管理 Pod 的声明式更新方式
  4. Service:为 Pod 提供稳定的网络端点

详细部署步骤

1. 准备存储资源

首先需要为 MySQL 准备持久化存储。我们创建一个 PV:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /mnt/data

这个 PV 使用主机路径 /mnt/data 作为存储后端,提供 20GB 的存储空间,访问模式为 ReadWriteOnce(RWO),表示同时只能被一个 Pod 挂载为读写模式。

生产环境建议:在生产环境中,建议使用网络存储(如 NFS、云存储等)而非 hostPath,以确保数据的高可用性。

2. 创建 MySQL 部署

接下来创建 MySQL 的 Deployment 和 PVC:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:9
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

关键配置说明:

  • strategy.type: Recreate:确保在更新时先终止旧 Pod 再创建新 Pod,避免同时运行多个实例
  • volumeMounts:将 MySQL 的数据目录挂载到持久化存储
  • env:设置 MySQL root 密码(注意:生产环境应使用 Secret)

同时创建对应的 PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

3. 创建 Service 暴露 MySQL

为了让其他 Pod 能够访问 MySQL,我们需要创建一个 Service:

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
  clusterIP: None

这里使用了 clusterIP: None 创建了一个 Headless Service,DNS 会直接解析到 Pod IP,适用于单实例场景。

验证部署

检查部署状态

kubectl get deployment mysql
kubectl get pods -l app=mysql
kubectl get pvc mysql-pv-claim

连接测试

运行一个临时 MySQL 客户端 Pod 进行连接测试:

kubectl run mysql-client --rm -it --image=mysql:9 --restart=Never -- mysql -h mysql -ppassword

如果连接成功,会看到 MySQL 命令行提示符。

重要注意事项

  1. 单实例限制:此部署仅适用于单实例 MySQL,不能扩展副本数
  2. 数据安全
    • 示例中密码明文存储不安全,生产环境应使用 Secret
    • 考虑定期备份 PV 中的数据
  3. 存储选择
    • 开发环境可以使用 hostPath
    • 生产环境建议使用网络存储或云存储
  4. 更新策略:必须使用 Recreate 策略,不能使用 RollingUpdate

清理资源

完成测试后,删除所有创建的资源:

kubectl delete deployment mysql
kubectl delete service mysql
kubectl delete pvc mysql-pv-claim
kubectl delete pv mysql-pv-volume

进阶思考

对于需要高可用的 MySQL 部署,单实例方案显然不够。Kubernetes 提供了 StatefulSet 控制器来更好地管理有状态应用,它能够提供:

  • 稳定的、唯一的网络标识
  • 有序的、优雅的部署和扩展
  • 持久化存储的自动配置

在后续的学习中,可以进一步探索如何使用 StatefulSet 部署 MySQL 集群,以及如何配置主从复制等高级特性。

总结

通过本教程,我们学习了在 Kubernetes 中部署单实例有状态应用的基本模式。虽然以 MySQL 为例,但类似的模式也适用于其他需要持久化存储的单实例应用。理解这些基础知识是掌握更复杂的有状态应用部署的前提。

website Kubernetes website and documentation repo: website 项目地址: https://gitcode.com/gh_mirrors/webs/website

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岑姣盼Estra

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值