k8s部署MySQL5.7单节点
·
一、环境配置
| 项目 | 配置值 |
|---|---|
| 集群架构 | 单 Master(k8s-master)+ 3 Worker(k8s-node1/2/3) |
| K8s 版本 | v1.23.0 |
| 容器运行时 | Docker 26.1.4 |
| 网络插件 | Calico v3.22 |
| 监控组件 | Metrics Server v0.5.2(国内镜像) |
| Dashboard 版本 | v2.5.1(官方稳定版) |
| 操作系统 | CentOS 7.9 |
| 内核版本 | 3.10.0-1160.el7.x86_64 |
| Master 节点 IP | 10.132.47.60 |
| Worker 节点 IP | 10.132.47.61/62/63 |
二、编写yaml文件
#我的文件存放位置: /root/k8s-yaml/mysql
mkdir /root/k8s-yaml
mkdir /root/k8s-yaml/mysql
vim mysql-deploy.yaml
------------------------------------------------------------------------------------------------------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: registry.cn-beijing.aliyuncs.com/mirrors/mysql:5.7 # 新镜像地址
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "Shyshy521521!"
- name: MYSQL_DATABASE
value: "testdb"
- name: MYSQL_CHARSET
value: "utf8mb4"
- name: MYSQL_COLLATION
value: "utf8mb4_unicode_ci"
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumes:
- name: mysql-data
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: default
spec:
type: NodePort
selector:
app: mysql
ports:
- port: 3306
targetPort: 3306
nodePort: 30036
------------------------------------------------------------------------------------------------------------
#第一部分:Deployment 资源,用于定义 MySQL 容器的部署规则(如镜像、环境变量、数据卷等)
apiVersion: apps/v1 # API 版本,Deployment 属于 apps 组的 v1 版本
kind: Deployment # 资源类型:Deployment(用于管理无状态应用的部署和扩缩容)
metadata:
name: mysql # Deployment 的名称(唯一标识,用于 kubectl 操作)
namespace: default # 命名空间(默认命名空间,可自定义,用于资源隔离)
spec:
replicas: 1 # 副本数:1(单节点部署)
selector: # 标签选择器:用于关联 Deployment 和它管理的 Pod
matchLabels:
app: mysql # 匹配标签为 app=mysql 的 Pod
template: # Pod 模板:定义要创建的 Pod 的配置(Deployment 会根据此模板创建 Pod)
metadata:
labels:
app: mysql # Pod 的标签(需与 selector.matchLabels 一致,否则 Deployment 无法管理)
spec: # Pod 的详细配置
containers: # 容器列表(一个 Pod 可包含多个容器,这里只部署 MySQL 一个容器)
- name: mysql # 容器名称(在 Pod 内唯一)
image: registry.cn-beijing.aliyuncs.com/mirrors/mysql:5.7 # 容器使用的镜像
# 这里使用阿里云北京仓库的 MySQL 5.7 镜像(国内仓库,拉取速度快)
imagePullPolicy: IfNotPresent # 镜像拉取策略:本地有则使用本地镜像,没有则拉取远程
ports: # 容器暴露的端口
- containerPort: 3306 # 容器内 MySQL 监听的端口(MySQL 默认端口)
env: # 环境变量(传递给容器的配置参数,MySQL 镜像会读取这些变量初始化)
- name: MYSQL_ROOT_PASSWORD
value: "Shyshy521521!" # MySQL root 用户的密码(必须设置,用于登录)
- name: MYSQL_DATABASE
value: "testdb" # 初始化时自动创建的数据库名称(可选,按需修改)
- name: MYSQL_CHARSET
value: "utf8mb4" # 数据库默认字符集(支持 emoji 等特殊字符,比 utf8 更完善)
- name: MYSQL_COLLATION
value: "utf8mb4_unicode_ci" # 字符排序规则(与 utf8mb4 配套使用)
volumeMounts: # 数据卷挂载:将 Pod 内的卷挂载到容器的指定路径(用于数据持久化)
- name: mysql-data # 关联下面定义的 volumes.name=mysql-data 的卷
mountPath: /var/lib/mysql # 容器内的挂载路径(MySQL 数据文件的默认存储路径)
volumes: # 定义 Pod 内的卷(用于容器间共享数据或持久化数据)
- name: mysql-data # 卷的名称(与 volumeMounts.name 对应)
emptyDir: {} # 卷类型:emptyDir(临时目录,生命周期与 Pod 一致,Pod 删除后数据丢失)
# 注意:仅适合测试,生产环境需替换为 PV/PVC(持久化存储)
------------------------------------------------------------------------------------------------------------
#第二部分:Service 资源,用于定义如何在集群内外访问 MySQL 容器。
apiVersion: v1 # API 版本,Service 属于核心组的 v1 版本
kind: Service # 资源类型:Service(用于暴露 Pod 访问入口,实现 Pod 访问的负载均衡和固定入口)
metadata:
name: mysql # Service 名称(与 Deployment 同名,方便关联和记忆)
namespace: default # 命名空间(需与 Deployment 一致,否则无法关联 Pod)
spec:
type: NodePort # Service 类型:NodePort(在集群所有节点上开放一个静态端口,用于外部访问)
selector: # 标签选择器:关联要暴露的 Pod(匹配标签为 app=mysql 的 Pod)
app: mysql
ports: # 端口映射规则
- port: 3306 # Service 内部端口(集群内其他 Pod 访问此 Service 时使用的端口)
targetPort: 3306 # 目标端口(对应 Pod 内容器的端口,即 MySQL 容器的 3306 端口)
nodePort: 30036 # 节点端口(集群节点对外开放的端口,范围 30000-32767,外部通过此端口访问)
三、执行部署命令
执行部署命令:
kubectl apply -f mysql-deploy.yaml

查看部署状态(确保所有资源正常):
- 查看 Deployment:
kubectl get deploy mysql(STATUS 为 Ready 1/1 表示正常) - 查看 Pod:
kubectl get pod -l app=mysql(STATUS 为 Running 表示正常) - 查看 Service:
kubectl get svc mysql(记录 NodePort 端口,确认是 30036)

四、验证 MySQL 可用性
kubectl exec -it $(kubectl get pod -l app=mysql -o jsonpath='{.items[0].metadata.name}') -- /bin/bash
登录 MySQL(使用 YAML 中设置的密码 Shyshy521521!)
mysql -u root -p
执行简单查询(验证正常)
show databases; # 查看数据库(应包含 testdb)
select version(); # 查看版本

确保外部机器能访问 Worker 节点 IP(10.132.47.61/62/63 任一)和 NodePort 30036。
使用 MySQL 客户端(如 Navicat、SQLyog)连接:
-
主机:Worker 节点 IP(比如 10.132.47.61)
-
端口:30036(YAML 中定义的 NodePort)
-
用户名:root
-
密码:Shyshy521521!(替换为你设置的密码)

五、删除卸载
#如果仍保留部署时使用的 YAML 文件(如 mysql-deploy.yaml),直接通过文件删除所有关联资源:
kubectl delete -f mysql-deploy.yaml
#该命令会同时删除:
# Deployment(mysql)
# Service(mysql)
# 由 Deployment 管理的 Pod(自动关联删除)

# 检查 Deployment
kubectl get deploy mysql -n default
# 检查 Service
kubectl get svc mysql -n default
# 检查 Pod
kubectl get pods -l app=mysql -n default
#如果有残留,手动删除对应资源(例如残留 Pod):
kubectl delete pod <残留的Pod名称> -n default

#由于部署时使用的是 emptyDir 类型的卷(数据随 Pod 生命周期存在),当 Pod 被删除后,emptyDir 中的数据会自动清理,无需额外操作。
#如果之前使用过 PV/PVC 持久化存储(生产环境常用),则需要额外删除 PV/PVC(若不再使用):
# 查看是否有相关 PVC
kubectl get pvc -n default | grep mysql
# 若有,删除 PVC(会自动删除关联的 PV,前提是 PV 的回收策略为 Delete)
kubectl delete pvc <mysql相关的PVC名称> -n default
tyDir 中的数据会自动清理,无需额外操作。
#如果之前使用过 PV/PVC 持久化存储(生产环境常用),则需要额外删除 PV/PVC(若不再使用):
查看是否有相关 PVC
kubectl get pvc -n default | grep mysql
若有,删除 PVC(会自动删除关联的 PV,前提是 PV 的回收策略为 Delete)
kubectl delete pvc <mysql相关的PVC名称> -n default
更多推荐


所有评论(0)