Kubernetes 单实例有状态应用部署实战:MySQL 案例解析
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
前言
在 Kubernetes 中部署有状态应用与无状态应用有着显著不同。本文将深入探讨如何在 Kubernetes 中部署一个单实例的 MySQL 数据库,这是理解 Kubernetes 有状态工作负载管理的重要一步。
核心概念解析
有状态应用的特点
有状态应用(如 MySQL、PostgreSQL 等数据库)具有以下关键特征:
- 数据持久性:需要长期保存数据,即使容器重启或迁移
- 唯一标识:通常需要稳定的网络标识和存储
- 有序部署:可能需要特定的启动和停止顺序
Kubernetes 相关组件
在本次部署中,我们将使用几个关键的 Kubernetes 资源:
- PersistentVolume (PV):集群中的存储资源
- PersistentVolumeClaim (PVC):Pod 对存储资源的请求
- Deployment:管理 Pod 的声明式更新方式
- 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 命令行提示符。
重要注意事项
- 单实例限制:此部署仅适用于单实例 MySQL,不能扩展副本数
- 数据安全:
- 示例中密码明文存储不安全,生产环境应使用 Secret
- 考虑定期备份 PV 中的数据
- 存储选择:
- 开发环境可以使用 hostPath
- 生产环境建议使用网络存储或云存储
- 更新策略:必须使用 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: 项目地址: https://gitcode.com/gh_mirrors/webs/website
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考