技术栈:Docker、Kubernetes(k8s)、MySQL
一、项目基本信息
-
项目名称:云原生 MySQL 容器化部署实战
-
核心技术:Docker 镜像构建、K8s 资源编排、MySQL 数据库运维
-
适用场景:云计算运维实习生简历项目、课程实训
二、基础环境检查命令
bash
# 查看Docker版本,验证Docker安装成功
docker -v
# 查看K8s集群节点状态,确保集群正常运行
kubectl get nodes
三、Docker 镜像构建
3.1 MySQL 定制镜像 Dockerfile
bash
# 基础镜像:基于官方MySQL 8.0镜像构建
FROM mysql:8.0
# 设置环境变量:MySQL root账号密码(容器启动自动配置)
ENV MYSQL_ROOT_PASSWORD=Root@123456
# 设置环境变量:系统字符集为UTF-8,防止中文乱码
ENV LANG=C.UTF-8
3.2 业务应用镜像 Dockerfile(用于连接 MySQL)
bash
# 基础镜像:CentOS 7系统
FROM centos:7
# 执行命令:安装MySQL客户端,用于测试连接数据库
RUN yum install -y mysql
# 容器启动命令:让容器持续运行(sleep 36000秒=10小时)
CMD ["sleep", "36000"]
3.3 镜像构建命令
bash
# 构建MySQL镜像,镜像名称:my-mysql,版本标签:v1
docker build -t my-mysql:v1 .
# 构建业务应用镜像,镜像名称:my-app,版本标签:v1
docker build -t my-app:v1 .
四、K8s 资源编排文件
4.1 创建命名空间(环境隔离)
mysql-ns.yaml
bash
# API版本:K8s核心资源固定版本
apiVersion: v1
# 资源类型:命名空间
kind: Namespace
# 元数据:资源名称
metadata:
# 命名空间名称:dev-db(开发环境数据库专用隔离空间)
name: dev-db
4.2 MySQL 密码密钥配置(加密存储密码)
mysql-secret.yaml
bash
apiVersion: v1
# 资源类型:密钥(用于存储敏感信息,如密码)
kind: Secret
metadata:
# 密钥名称
name: mysql-secret
# 归属命名空间:dev-db
namespace: dev-db
# 密钥类型:不透明类型(通用加密存储)
type: Opaque
data:
# 密码数据:Root@123456 的Base64加密值(K8s Secret要求加密存储)
password: Um9vdEAxMjM0NTY=
4.3 MySQL 有状态部署(核心配置)
mysql-sts.yaml
bash
# API版本:应用工作负载版本
apiVersion: apps/v1
# 资源类型:有状态副本集(专门用于数据库等有状态服务)
kind: StatefulSet
metadata:
# 名称:mysql
name: mysql
namespace: dev-db
spec:
# 关联的Headless Service名称(固定写法)
serviceName: mysql-svc
# 副本数:1个MySQL实例
replicas: 1
# 标签选择器:匹配Pod标签
selector:
matchLabels:
app: mysql
# Pod模板:定义容器运行参数
template:
metadata:
# Pod标签:与上面选择器对应
labels:
app: mysql
spec:
# 容器配置
containers:
# 容器名称
- name: mysql
# 使用的镜像:我们自己构建的MySQL镜像
image: my-mysql:v1
# 容器暴露端口:MySQL默认端口3306
ports:
- containerPort: 3306
# 环境变量:从Secret中读取MySQL密码(不明文写密码)
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
# 数据卷挂载:将持久化存储挂载到MySQL数据目录
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
# 持久化存储申请模板:自动创建存储卷
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
# 存储访问模式:单节点读写
accessModes: ["ReadWriteOnce"]
# 申请存储大小:5G
resources:
requests:
storage: 5Gi
4.4 MySQL 服务暴露(内部访问)
mysql-svc.yaml
bash
apiVersion: v1
# 资源类型:服务(K8s服务发现核心)
kind: Service
metadata:
name: mysql-svc
namespace: dev-db
spec:
# Headless Service:无集群IP,用于有状态服务固定访问
clusterIP: None
# 选择器:关联MySQL Pod
selector:
app: mysql
# 服务端口:映射容器3306端口
ports:
- port: 3306
4.5 业务应用部署
app-deploy.yaml
bash
apiVersion: apps/v1
# 资源类型:无状态副本集(用于普通应用)
kind: Deployment
metadata:
name: my-app
namespace: dev-db
spec:
# 应用副本数:2个
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
# 使用我们构建的业务应用镜像
image: my-app:v1
五、一键部署命令
bash
# 1. 创建命名空间
kubectl apply -f mysql-ns.yaml
# 2. 创建MySQL密码密钥
kubectl apply -f mysql-secret.yaml
# 3. 部署MySQL有状态服务
kubectl apply -f mysql-sts.yaml
# 4. 暴露MySQL服务
kubectl apply -f mysql-svc.yaml
# 5. 部署业务应用
kubectl apply -f app-deploy.yaml
# 查看所有资源状态(验证部署成功)
kubectl get all -n dev-db
六、数据库验证操作
6.1 进入 MySQL 容器创建测试数据
bash
# 进入MySQL容器内部
kubectl exec -it -n dev-db mysql-0 -- bash
# 登录MySQL数据库(密码:Root@123456)
mysql -uroot -pRoot@123456
# 以下为MySQL命令
# 创建测试数据库
CREATE DATABASE testdb;
# 切换数据库
USE testdb;
# 创建测试表
CREATE TABLE user(id INT PRIMARY KEY, name VARCHAR(20));
# 插入测试数据
INSERT INTO user VALUES (1,'test');
6.2 业务容器测试连接 MySQL
bash
# 进入业务应用容器
kubectl exec -it -n dev-db deploy/my-app -- bash
# 通过K8s Service域名连接MySQL,查询数据
mysql -hmysql-svc.dev-db.svc.cluster.local -uroot -pRoot@123456 -e "USE testdb; SELECT * FROM user;"
七、高可用故障恢复测试
bash
# 手动删除MySQL Pod,测试K8s自动重建能力
kubectl delete pod mysql-0 -n dev-db
# 实时监控Pod重建状态(-w:持续监听)
kubectl get pods -n dev-db -w
# 重建完成后,验证数据不丢失
kubectl exec -it mysql-0 -n dev-db -- mysql -uroot -pRoot@123456 -e "SELECT * FROM testdb.user;"
八、日常运维命令
bash
# 查看MySQL容器运行日志
kubectl logs -n dev-db mysql-0
# 扩容业务应用:将副本数从2改为3
kubectl scale deploy my-apa --replicas=3 -n dev-db
# 彻底删除整个项目(删除命名空间,所有资源一并删除)
kubectl delete ns dev-db