KubeSphere学习笔记:部署mysql

一、前置准备

部署 MySQL 前,需要先完成以下环境搭建(具体步骤见之前的两篇教程):

  1. Docker Desktop 启用 K8s(建议使用 kind 模式,因为 LoadBalancer 支持映射所有端口)
  2. 安装 KubeSphere
  3. 激活 KubeSphere(申请免费 License,否则无法使用扩展中心安装插件)

本文基于以下环境:

宿主机:Windows 11 + WSL 2 Ubuntu 22.04
Docker Desktop:K8s 启用,kind 模式
KubeSphere:已安装并激活

二、概念速览

在开始之前,先快速了解几个 K8s 概念,后面会用到:

概念 作用 类比(Docker)
工作负载(Deployment) 管理 Pod 的生命周期,保证容器始终运行 docker run + 自动重启
持久卷声明(PVC) 申请一块持久化存储空间 docker volume
保密字典(Secret) 存储敏感信息(密码、密钥等) 环境变量文件
配置字典(ConfigMap) 存储配置文件 挂载配置文件
服务(Service) 暴露 Pod 的网络入口 docker port 映射
LoadBalancer 将服务暴露到宿主机(kind 模式下自动映射端口) 自动端口转发

三、创建企业空间和项目

登录 KubeSphere Web 控制台(http://localhost:30880,账号 admin / P@88w0rd),依次创建:

  1. 企业空间 → 给团队用的顶层隔离单元
  2. 项目(命名空间) → 资源隔离的项目空间,所有 MySQL 资源都会创建在此项目下

image.png

项目在 K8s 中对应 namespace,后续的 kubectl 命令中 -n mysql 就是指定项目名称。


四、创建保密字典(Secret)

MySQL 需要配置 root 密码,敏感信息应该放在 Secret 中,而不是写在配置文件里。

在项目左侧菜单 → 配置保密字典创建

  • 名称mysql-secret
  • mysql-root-password
  • 123456(你的密码)

image.png

这样密码就以密文形式存储在 K8s 中,工作负载引用时以环境变量注入,不会明文暴露。


五、创建配置字典(ConfigMap)

MySQL 的配置文件(my.cnf)放在 ConfigMap 中,方便修改和管理。

在项目左侧菜单 → 配置配置字典创建

名称mysql-config

配置数据(键 my.cnf,值如下):

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
init_connect='SET collation_connection = utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
max_connections=1000

image.png

配置说明

配置项 作用
character-set-server=utf8mb4 设置 MySQL 默认字符集为 utf8mb4(支持 emoji)
collation-server=utf8mb4_unicode_ci 设置排序规则
skip-name-resolve 跳过 DNS 反向解析,加快连接速度
max_connections=1000 最大连接数,开发环境够用

参考 YAML 格式:

kind: ConfigMap
apiVersion: v1
metadata:
  name: mysql-config
  namespace: mysql
data:
  my.cnf: |
    [client]
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    [mysqld]
    init_connect='SET collation_connection = utf8mb4_unicode_ci'
    init_connect='SET NAMES utf8mb4'
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    skip-character-set-client-handshake
    skip-name-resolve
    max_connections=1000

六、创建持久卷声明(PVC)

MySQL 的数据需要持久化,否则 Pod 重启后数据就丢了。

在项目左侧菜单 → 存储持久卷声明创建

image.png

存储类选择

存储类 说明 适用场景
hostPath 直接使用宿主机磁盘路径 单节点开发环境,简单直接
standard 通过 CSI 驱动分配存储 集群环境,功能更完善

对于 Docker Desktop 单节点环境,用 hostPath 就够了。如果选 standard,在 Docker Desktop 上通常也能用,但需要确保 provisioner 已安装。

访问模式

模式 说明
ReadWriteOnce(RWO) 只能被一个节点挂载读写 ✅ MySQL 选这个
ReadOnlyMany(ROX) 可以被多个节点同时只读挂载
ReadWriteMany(RWX) 可以被多个节点同时读写挂载

MySQL 是单点数据库,选 ReadWriteOnce 即可。

配置参数

  • 名称mysql-pvc
  • 存储类hostpath
  • 访问模式ReadWriteOnce
  • 容量5Gi(根据实际需求调整)

七、创建工作负载(Deployment)

这是最核心的一步,把 MySQL 容器跑起来。

在项目左侧菜单 → 工作负载部署创建

7.1 基本信息

  • 名称mysql
  • 版本v1

7.2 容器镜像

image.png

  • 镜像mysql:8.0(或指定版本如 mysql:8.0.46
  • 容器名称mysql

⚠️ 国内网络问题:如果拉取官方镜像超时,可以使用国内镜像加速地址:

https://docker.1ms.run
https://docker.1panel.live

在 Docker Desktop 的 Docker Engine 配置中设置 registry-mirrors,或者提前用 docker pull 手动拉取(Docker 配置了加速后更快)。

7.3 环境变量

从之前创建的 Secret 中引用密码:

image.png

环境变量 来源
MYSQL_ROOT_PASSWORD 引用 Secret mysql-secret 中的 mysql-root-password 自动注入
MYSQL_DATABASE 直接填写 test(可选,自动创建的默认数据库)

使用 Secret 引用密码的好处:密码不会明文出现在工作负载 YAML 中,其他人查看配置也看不到密码。

7.4 挂载存储

image.png

需要挂载两个路径:

挂载类型 来源 挂载路径 作用
持久卷声明 mysql-pvc /var/lib/mysql 存储 MySQL 数据文件
配置字典 mysql-config(挂载 my.cnf /etc/mysql/my.cnf 挂载 MySQL 配置文件

⚠️ 注意:配置字典挂载时,子路径要填写 my.cnf,否则 ConfigMap 会以目录形式挂载,覆盖整个 /etc/mysql/ 目录,导致 MySQL 找不到其他默认配置。

7.5 创建完成

点击 创建,等待 Pod 启动完成。可以在工作负载页面查看状态:

image.png

Pod 状态从 ContainerCreatingRunning 即表示启动成功。


八、创建服务(Service)

Pod 默认只能在集群内部访问(ClusterIP),外部无法连接。需要创建一个 Service 来暴露端口。

工作负载详情页更多操作创建服务

8.1 配置服务端口

image.png

参数 说明
名称 mysql 服务名称
内部端口(Service Port) 3306 服务对外暴露的端口
容器端口(Target Port) 3306 MySQL 容器监听的端口
协议 TCP MySQL 使用 TCP 协议

⚠️ 常见错误:Service Port 和 Target Port 都可以自定义,但 Target Port 必须和容器内应用的监听端口一致。MySQL 默认监听 3306,Target Port 也要填 3306。如果填错,连接会成功建立 TCP 连接但读不到 MySQL 握手包,报错:

Can not read response from server. Expected to read 4 bytes, read 0 bytes

8.2 选择外部访问方式

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

K8s Service 的三种访问类型:

类型 宿主机能否访问 说明
ClusterIP 仅集群内部可访问,外部无法连接
NodePort ⚠️ 在节点上开一个端口,但 Docker Desktop 的 kind 模式下无法直接访问
LoadBalancer 自动映射到 localhost,外部可直接访问

选择 LoadBalancer。 因为 KubeSphere 运行在 WSL 的 Docker Desktop 上,kind 模式自带 cloud-provider-kind,创建 LoadBalancer 服务后会自动生成一个 kindccm 代理容器,把 localhost:<端口> 映射到你的服务。

8.3 确认服务创建成功

创建后,在 服务 页面可以看到:

名称  类型           Cluster IP      External IP   端口
mysql  LoadBalancer  10.96.xx.xxx    172.18.0.x    3306:3xxxx/TCP

同时 docker ps 可以看到 kindccm 代理容器自动创建:

kindccm-xxx   0.0.0.0:3306->3306/tcp

九、验证部署

9.1 查看日志

点击工作负载,下拉到 容器副本列表,点击右侧的 容器日志

image.png

看到以下信息表示 MySQL 启动成功:

/usr/sbin/mysqld: ready for connections. Version: '8.0.46'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306

9.2 通过 KubeSphere Web 终端

在工作负载详情页,点击 Pod 的 终端 图标,进入容器内部:

image.png

进入后执行:

mysql -u root -p
# 输入密码 123456

image.png

看到 MySQL 提示符 mysql> 即表示正常。

9.3 通过 WSL 命令行

也可以直接在 WSL Ubuntu 终端用 kubectl 进入容器:

# 查看 MySQL Pod 名称
kubectl get pods -A | grep mysql

# 进入容器内部
kubectl exec -it -n mysql mysql-5444fbf78-hjjq8 -- /bin/bash

# 进入后连接 MySQL
mysql -u root -p

image.png

9.4 从 IDE 连接

在 IntelliJ IDEA、DataGrip、Navicat 等数据库工具中:

参数
Host localhost
Port 3306
User root
Password 123456

image.png

如果连接失败,按以下顺序排查:

  1. 检查 kubectl get pods -n <项目名> 是否 Running
  2. 检查 kubectl get svc -n <项目名> 是否 LoadBalancer 类型且有 EXTERNAL-IP
  3. 检查 docker ps 是否有 kindccm 代理容器,端口映射是否正确
  4. 检查 Service 的 targetPort 是否等于 MySQL 容器监听端口(默认 3306)

十、部署第二个 MySQL 实例

如果要部署第二个 MySQL(比如测试环境),直接在 KubeSphere 中重复上述步骤即可:

  • 新的持久卷声明(如 mysql02-pvc
  • 新的工作负载(如 mysql02
  • 新的服务,端口设为 3307targetPort 仍为 3306

关键点: Service Port 是对外端口(可以自定义),Target Port 始终是容器内 MySQL 的监听端口(3306)。

创建完成后,kind 会自动创建一个新的 kindccm 代理容器,将 localhost:3307 映射到新的 MySQL 实例。

查看所有 kindccm 代理:

docker ps --format "table {{.Names}}\t{{.Ports}}" | grep kindccm

输出示例:

kindccm-xxx   0.0.0.0:3306->3306/tcp    # 第一个 MySQL
kindccm-yyy   0.0.0.0:3307->3307/tcp    # 第二个 MySQL
kindccm-zzz   0.0.0.0:30880->30880/tcp  # KubeSphere 控制台

每个 LoadBalancer 服务都由独立的 kindccm 代理管理,互不干扰。


十一、总结

阶段 操作 关键点
Secret 存储 MySQL 密码 引用到环境变量,不暴露明文
ConfigMap 存储 my.cnf 配置 设置 utf8mb4 字符集
PVC 申请持久化存储 hostPath + ReadWriteOnce
工作负载 运行 MySQL 容器 挂载 PVC 和 ConfigMap
Service 暴露外部访问 LoadBalancer 类型
验证 连接测试 localhost:3306

部署 MySQL 的流程覆盖了 K8s 的配置、存储、工作负载、网络四个核心模块,理解了这个流程,部署其他中间件(Redis、PostgreSQL 等)也是类似的思路。

posted @ 2026-08-06 15:26  PC2005-cloud  阅读(14)  评论(0)    收藏  举报