背景知识

因为担心数据安全加上对 K8S 存储不熟悉,所以我们使用的mysql 一直都没有上 K8S。

之前使用 mysql 很简单粗暴:

sudo docker run -p 3306:3306 --name zjmysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7

docker一键部署,数据迁移备份就是拷贝 /usr/local/docker/mysql/data 里面的数据。没有高可用,没有主动定时备份。

使用 RadonDB MySQL

为什么要用 RandonDB 呢?

  • 自动化运维
  • 多节点角色
  • 灾备集群
  • SSL 传输加密
  • 增删节点
  • 升级集群
  • 备份与恢复
  • 故障自动转移
  • 重建节点
  • 账户管理

以上每一个功能都值得。应用上了 K8S ,目前最流行的运维方式就是 operator 了。那什么是 operator呢:

Operator 定义了一组在 Kubernetes 集群中打包和部署复杂业务应用的方法,它可以方便地在不同集群中部署并在不同的客户间传播共享;同时 Operator 还提供了一套应用在运行时刻的监控管理方法,应用领域专家通过将业务关联的运维逻辑编写融入到 operator 自身控制器中,而一个运行中的 Operator 就像一个 7*24 不间断工作的优秀运维团队,它可以时刻监控应用自身状态和该应用在 Kubernetes 集群中的关注事件,并在毫秒级别基于期望终态做出对监听事件的处理,比如对应用的自动化容灾响应或是滚动升级等高级运维操作。

废话少说,开始部署 RadonDB MySQL 吧。

准备可用 Kubernetes 集群

这个,直接部署一套 kubesphere 吧。十几分钟一套界面优美、功能强大的 k8集群就装好了。

添加 Helm 仓库

helm repo add radondb https://radondb.github.io/radondb-mysql-kubernetes/

部署 Operator

helm install demo radondb/mysql-operator

部署 RadonDB MySQL 集群

kubectl apply -f https://github.com/radondb/radondb-mysql-kubernetes/releases/latest/download/mysql_v1alpha1_mysqlcluster.yaml

简简单单三行命令,我们就在三个节点上部署了 mysql,一个 mysql 集群就搭建好了,我们来试试看看好不好用。

使用体验

先创建一个用户

用户名:sample_user

密码:RadonDB@123

apiVersion: v1
kind: Secret
metadata:
  name: sample-user-password   # 密钥名称。应用于 MysqlUser 中的 secretSelector.secretName。  
data:
  pwdForSample: UmFkb25EQkAxMjMKIA==  #密钥键,应用于 MysqlUser 中的 secretSelector.secretKey。示例密码为 base64 加密的 RadonDB@123
  # pwdForSample2:
  # pwdForSample3:
apiVersion: mysql.radondb.com/v1alpha1
kind: MysqlUser
metadata:
 
  name: sample-user-cr  # 用户 CR 名称,建议使用一个用户 CR 管理一个用户。
spec:
  user: sample_user  # 需要创建/更新的用户的名称。
  hosts:            # 支持访问的主机,可以填多个,% 代表所有主机。 
       - "%"
  permissions:
    - database: "*"  # 数据库名称,* 代表所有数据库。 
      tables:        # 表名称,* 代表所有表。
         - "*"
      privileges:     # 权限,参考 https://dev.mysql.com/doc/refman/5.7/en/grant.html。
         - SELECT
  
  userOwner:  # 指定被操作用户所在的集群。不支持修改。  
    clusterName: sample
    nameSpace: default # radondb mysql 集群所在的命名空间。
  
  secretSelector:  # 指定用户的密钥和保存当前用户密码的键。
    secretName: sample-user-password  # 密钥名称。   
    secretKey: pwdForSample  # 密钥键,一个密钥可以保存多个用户的密码,以键区分。

部署:

kubectl apply -f mysqluser_secret.yaml
kubectl apply -f mysql_v1alpha1_mysqluser.yaml

由于 mysql_v1alpha1_mysqluser.yaml设置的权限是 SELECT 所以 该账号只能写不能读。

      privileges:     # 权限,参考 https://dev.mysql.com/doc/refman/5.7/en/grant.html。         
         - SELECT

那我们开始创建一个超级用户吧

用户名:root_user

密码:RadonDB@123

apiVersion: mysql.radondb.com/v1alpha1
kind: MysqlUser
metadata:
 
  name: root-user-cr  # 用户 CR 名称,建议使用一个用户 CR 管理一个用户。
spec:
  user: root_user  # 需要创建/更新的用户的名称。
  hosts:            # 支持访问的主机,可以填多个,% 代表所有主机。 
       - "%"
  permissions:
    - database: "*"  # 数据库名称,* 代表所有数据库。 
      tables:        # 表名称,* 代表所有表。
         - "*"
      privileges:     # 权限,参考 https://dev.mysql.com/doc/refman/5.7/en/grant.html。
         - ALL PRIVILEGES
  
  userOwner:  # 指定被操作用户所在的集群。不支持修改。  
    clusterName: sample
    nameSpace: default # radondb mysql 集群所在的命名空间。
  
  secretSelector:  # 指定用户的密钥和保存当前用户密码的键。
    secretName: sample-user-password  # 密钥名称。   
    secretKey: pwdForSample  # 密钥键,一个密钥可以保存多个用户的密码,以键区分。

这里设置 `ALL PRIVILEGES` 就是一个啥都可以做的超级用户。

使用起来还是蛮方便的,期待 RadonDB 后面更多的功能

【问题调研】

  • 使用过哪些 MySQL Operator?

    没用过

  • 对 RadonDB MySQL Kuberentes 有哪些期待?

    期待增加一个前端页面管理 mysql

  • 是否愿意关注并支持项目的改进?

    愿意