一、环境配置
项目配置值
集群架构单 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 节点 IP10.132.47.60
Worker 节点 IP10.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 可用性
  1. 集群内测试
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();  # 查看版本

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 外部机器测试

确保外部机器能访问 Worker 节点 IP(10.132.47.61/62/63 任一)和 NodePort 30036。

使用 MySQL 客户端(如 Navicat、SQLyog)连接:

  • 主机:Worker 节点 IP(比如 10.132.47.61)

  • 端口:30036(YAML 中定义的 NodePort)

  • 用户名:root

  • 密码:Shyshy521521!(替换为你设置的密码)

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

五、删除卸载
  1. 删除部署文件定义的资源
#如果仍保留部署时使用的 YAML 文件(如 mysql-deploy.yaml),直接通过文件删除所有关联资源:

kubectl delete -f mysql-deploy.yaml

#该命令会同时删除:
#	Deployment(mysql)
#	Service(mysql)
#	由 Deployment 管理的 Pod(自动关联删除)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 确认删除
# 检查 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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 清理临时数据
#由于部署时使用的是 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


更多推荐