示例一 - 部署 MySQL 有状态应用

目的

本文以创建一个有状态副本集 (Statefulset) 为例,使用 Mysql:5.6 镜像部署一个有状态的 MySQL 应用,作为 Wordpress 网站的后端,演示如何创建使用 Statefulset。本示例的 MySQL 初始密码将以 密钥 (Secret) 的方式进行创建和保存。为方便演示,本示例仅说明流程,关于参数和字段的详细释义参见 密钥有状态副本集

前提条件

  • 已创建了企业空间和项目,若还未创建请参考 管理员快速入门
  • 以上一篇文档创建的 project-regular 用户登录 KubeSphere,进入已创建的企业空间下的项目

预估时间

约 10 分钟。

操作示例

示例视频

部署 MySQL

第一步:创建密钥

MySQL 的环境变量 MYSQL_ROOT_PASSWORD 即 root 用户的密码属于敏感信息,不适合以明文的方式表现在步骤中,因此以创建密钥的方式来代替该环境变量。创建的密钥将在创建 MySQL 的容器组设置时作为环境变量写入。

1.1. 在当前项目下左侧菜单栏的 配置中心 选择 密钥,点击 创建

创建密钥

1.2. 填写密钥的基本信息,完成后点击 下一步

  • 名称:作为 MySQL 容器中环境变量的名称,可自定义,例如 mysql-secret
  • 别名:别名可以由任意字符组成,帮助您更好的区分资源,例如 MySQL 密钥
  • 描述信息:简单介绍该密钥,如 MySQL 初始密码

基本信息

1.3. 密钥设置页,填写如下信息,完成后点击 创建

  • 类型:选择 默认 (Opaque)
  • Data:Data 键值对填写 MYSQL_ROOT_PASSWORD123456

Secret 设置

第二步:创建有状态副本集

在左侧菜单栏选择 工作负载 → 有状态副本集,然后点击 创建有状态副本集

创建有状态副本集

第三步:填写基本信息

基本信息中,参考如下填写,完成后点击 下一步

  • 名称:必填,起一个简洁明了的名称,便于用户浏览和搜索,例如填写 wordpress-mysql
  • 别名:可选,支持中文帮助更好的区分资源,例如填写 MySQL 数据库
  • 描述信息:简单介绍该工作负载,方便用户进一步了解

填写基本信息

第四步:容器组模板

4.1. 点击 添加容器,填写容器组设置,名称可由用户自定义,镜像填写 mysql:5.6(应指定镜像版本号),CPU 此处暂不作限定,将使用在创建项目时指定的默认请求值,内存的 最大使用 设置为 1024 Mi (即 1 Gi)。

展开 高级选项

添加容器

4.2. 对 端口环境变量 进行设置,其它项暂不作设置,完成后点击 保存

  • 端口:名称可自定义,选择 TCP 协议,填写 MySQL 在容器内的端口 3306
  • 环境变量:点击 引用配置中心,名称填写 MYSQL_ROOT_PASSWORD,选择在第一步创建的密钥 mysql-secret (MySQL 密钥)MYSQL_ROOT_PASSWORD

容器组模板

4.3. 更新策略保持默认的 滚动更新,Partition 默认为 0,点击 下一步

第五步:添加存储卷模板

容器组模板完成后点击 下一步,在存储卷模板中点击 添加存储卷模板。有状态应用的数据需要存储在持久化存储卷 (PVC) 中,因此需要添加存储卷来实现数据持久化。参考下图填写存储卷信息,完成后点击 保存。添加存储卷模板完成后,点击 下一步

  • 存储卷名称:必填,起一个简洁明了的名称,便于用户浏览和搜索,此处填写 mysql-pvc
  • 描述信息:简单介绍该存储卷,方便用户进一步了解,如 MySQL 存储卷
  • 存储类型:选择集群已有的存储类型,如 Local
  • 容量和访问模式:容量默认 10 Gi,访问模式选择 ReadWriteOnce (单个节点读写)
  • 挂载路径:存储卷在容器内的挂载路径,选择 读写,路径填写 /var/lib/mysql

添加存储卷模板

第六步:服务配置

一个 Kubernetes 的服务 (Service) 是一种抽象,它定义了一类 Pod 的逻辑集合和一个用于访问它们的策略 - 有的时候被称之为微服务。因此要将 MySQL 应用暴露给外部访问,需要创建服务,参考以下截图完成参数设置,完成后点击 下一步

  • 服务名称:此处填写 mysql-service,注意,这里定义的服务名称将关联 Wordpress,因此在创建 Wordpress 添加环境变量时应填此服务名
  • 会话亲和性:默认 None
  • 端口:名称可自定义,选择 TCP 协议,MySQL 服务的端口和目标端口都填写 3306,其中第一个端口是需要暴露出去的服务端口,第二个端口(目标端口)是容器端口

说明: 若有实现基于客户端 IP 的会话亲和性的需求,可以在会话亲和性下拉框选择 "ClientIP" 或在代码模式将 service.spec.sessionAffinity 的值设置为 "ClientIP"(默认值为 "None"),该设置可将来自同一个 IP 地址的访问请求都转发到同一个后端 Pod。

服务配置

第七步:标签设置

为方便识别此应用,我们标签设置为 app: wordpress-mysql。下一步的节点选择器可以指定容器组调度到期望运行的节点上,此处暂不作设置,直接点击 创建

标签设置

查看 MySQL 有状态应用

在列表页可以看到有状态副本集 "wordpress-mysql" 的状态为 “更新中”,该过程需要拉取镜像仓库中指定 tag 的 Docker 镜像、创建容器和初始化数据库等一系列操作,状态显示 ContainerCreating。正常情况下在一分钟左右状态将变为 “运行中”,点击该项即可进入有状态副本集的详情页,包括资源状态、版本控制、监控、环境变量、事件等信息。

查看 MySQL 有状态应用

至此,有状态应用 MySQL 已经创建成功,将作为 Wordpress 网站的后端数据库。下一步需要创建 Wordpress 部署并通过外网访问该应用,参见 快速入门 - 部署 Wordpress