在 K8s 上使用 KubeBlocks 提供的 MySQL operator 部署高可用 WordPress 站点

引言

WordPress

WordPress 是全球最流行的内容管理系统(CMS),自 2003 年发布以来,已成为网站建设的首选工具。其广泛的插件和主题生态系统使用户能够轻松扩展功能和美化外观。活跃的社区提供丰富的资源和支持,进一步降低了开发和维护的难度。

凭借易用性、灵活性和强大的社区支持,WordPress 已成为全球数百万用户的共同选择,在网站建设领域占据了重要地位。

什么是 KubeBlocks

KubeBlocks 是一个可以管理多种数据库和有状态中间件的 K8s operator,支持管理 MySQL、PostgreSQL、Redis、MongoDB、Kafka、ClickHouse、Elasticsearch 等 30 余种数据库。其原理是定义一组通用和抽象的 API(CRDs)来描述各种引擎的共同属性,在其之上,数据库厂商和开发者可以通过插件来描述不同引擎的差异。

为什么要用 KubeBlocks 来管理 WordPress

在使用 WordPress Bitnami 镜像时,虽然内置的 MariaDB 提供了一个开箱即用的数据库解决方案,但存在几方面的缺陷:

  • 高可用性限制:Bitnami 镜像中的 MariaDB 通常是单节点部署,如果节点出现问题会导致网站服务中断;内置的 MariaDB 也不具备自动故障转移机制。
  • 资源竞争:MariaDB 的数据库和网站服务部署在同一个 Pod 中,会产生资源竞争,存在资源分配难题。
  • 扩展性差:虽然 MariaDB 可以进行一定程度的扩展,但水平扩展(通过增加更多数据库实例来提升性能和容量)相对复杂,需要额外的管理和配置工具。
  • 监控与管理:内置的 MariaDB 缺乏完善的监控和管理工具,难以及时发现和解决性能问题或故障。

而使用 KubeBlocks 来部署提供 WordPress 数据库服务,可以很好解决 MariaDB 的缺陷:

  • 高可用性:可以分别为 WordPress 和数据库配置高可用方案,提高整体系统的可靠性。
  • 资源隔离:WordPress 和数据库运行在不同的 Pod 中,资源隔离性更好,避免了资源竞争。
  • 拓展性强:可以独立扩展 WordPress 和数据库的副本数,分别调整它们的资源配置。
  • 快捷管理:KubeBlocks 可以快速一键部署 WordPress 所需数据库集群,无需额外操作,且内置数据库的备份和监控功能,能提高管理效率。

快速部署

安装 KubeBlocks

KubeBlocks 提供了专属的 kbcli 命令行管理工具,如果您没有安装 KubeBlocks,也能通过几行命令轻松安装KubeBlocks。

安装前,请确保您的环境满足 KubeBlocks 的环境要求

  1. 安装 kbcli。

    curl -fsSL https://kubeblocks.io/installer/install_cli.sh | bash
    
  2. 安装 KubeBlocks。

    kbcli kubeblocks install
    
  3. 检查 KubeBlocks 是否安装成功。

    bash 复制代码
    kbcli kubeblocks status

您也可参考官方安装文档,查看具体操作说明。

一键部署高可用数据库集群

在部署 WordPress 之前,首先需要部署一个数据库集群用于管理 WordPress 的后台数据,可使用 kbcli 或者 kubectl 部署集群。

  1. 创建高可用集群。

    这里我们使用 KubeBlocks apecloud-mysql addon 创建一个 MySQL 数据库作为 WordPress 的数据库。使用 kbcli 快速部署一个具有高可用多副本且达到生产环境水平的 MySQL 数据库集群。

    设置集群参数 replicas=3,以启用数据库 RaftGroup 模式,创建一个 MySQL 三副本集群。

    # 启用 addon(默认开启)
    kbcli addon install apecloud-mysql 
    
    # 部署集群 可以设置参数,如 --set replicas=3 表示三副本
    kbcli cluster create apecloud-mysql --cluster-definition=apecloud-mysql --set replicas=3
    
  2. 查看集群状态,等待所有相关 Pod 变为 running 状态:

    kubectl get pods
    
  3. 获取访问地址。

    可通过 services 访问已创建的 MySQL 集群,也可通过 Pod 直接访问。本文以通过 services 访问为例。

    执行以下命令,获取 service 地址,即 apecloud-mysql.default(命名空间).svc.cluster.local (默认后缀)

    bash 复制代码
    kubectl get services

WordPress 部署

配置数据库
  1. 根据实际需要,可以在数据库中创建若干用户,以便于 WordPress 进行角色管理。下面我们将创建一个 myadmin 用户作为 WordPress 安装时的主用户。

    使用以下命令以 root 身份连接 MySQL 数据库。

    kbcli cluster connect apecloud-mysql 
    
  2. 进入数据库后,执行以下 SQL 语句创建用户并赋予权限,可根据需要设置数据库权限。

    CREATE USER 'myadmin'@'%' IDENTIFIED BY 'password';
    GRANT ALL PRIVILEGES ON *.* TO 'myadmin'@'%';
    FLUSH PRIVILEGES;
    create database wordpress;
    

    注意

    可根据需求选择创建 secret,用于 WordPress 安装时引用,以避免明文传输密码。

  3. 执行如下命令创建 mysql-secret,设置键 mariadb-password=password,安装时 WordPress 会优先将该密码键值作为数据库密码,注意密码的键名必须为 mariadb-password。用户名不会从该 secret 中读取。

    kubectl create secret generic mysql-secret --from-literal=mariadb-password=password
    
一键安装 WordPress
  1. 使用 helm install 命令安装 WordPress,同时配置前面所述参数。

    helm install my-release oci://registry-1.docker.io/bitnamicharts/wordpress \
    --set mariadb.enabled=false \
    --set externalDatabase.host=apecloud-mysql.default.svc.cluster.local \ 
    --set externalDatabase.database=wordpress \ 
    --set externalDatabase.port=3306 \
    --set externalDatabase.user="myadmin"
    --set externalDatabase.existingSecret="mysql-secret" \
    --set replicaCount=2
    

    参数说明:

    • mariadb.enabled:需设置为 false,将禁用 MariaDB 的安装,以使用外部数据库服务。
    • host:我们可以使用前面的 MySQL service 地址来访问 MySQL 服务,如:apecloud-mysql.default.svc.cluster.local
    • user, database, port:根据实际情况设置。
    • existingSecret:推荐使用该方式传输密码。可引用前面创建的 secret 来传输密码,以避免明文传输这些内容。注意 secret 必须包含连接密码,设置了 existingSecret 后,password 会被忽略。
    • password:可选设置。本文推荐使用 existingSecret 引用前面创建的 secret 来传输密码,避免明文传输。此外,设置了 existingSecret 后,password 将被忽略。
    • replicaCount:代表 WordPress 实例启动 Pod 数量。
  2. 查看 Pod 运行情况 ,确保所有 Pod ready 且处于 running 状态 :

    kubectl get pods
    
  3. 进入 WordPress 容器,可远程连接数据库,查看 WordPress 数据库信息。

    kubectl exec -it wordpress-584444f68b-sxcss  -- bash
    mysql -h  apecloud-mysql.default.svc.cluster.local  -u Wordpress
    

至此,你已经成功部署了 WordPress 和对应的数据库集群。

高可用性能测试

本文将通过删除其中一个 Pod 来模拟故障。

kubectl delete pod apecloud-mysql-0

可以看到 Pod apecloud-mysql-0 现在 ready 状态是 3/4,其中 MySQL 容器无法使用。

但并不影响正常连接数据库,且可以看到 apecloud-mysql-1 成为了 leader(默认是 apecloud-mysql-0),这是 KubeBlocks 强大故障转移能力的体现之一。

数据库扩容测试

当出现性能瓶颈等情况,或许需要对数据库节点进行资源扩容,KubeBlocks 提供了非常方便的扩容命令,可使用 kbcli vsclae 命令轻松扩充计算资源。

kbcli cluster vscale mycluster --components=apecloud-mysql --cpu=500m --memory=500Mi

更多数据库参数设置可以参考官方文档

相关推荐
xp_fangfei1 小时前
MySQL第10讲--约束的介绍
数据库·mysql
清风 0011 小时前
k8s-pod 实战二 (Pod 重启策略、探针及实现方式详解)
云原生·容器·kubernetes
WangLinXX2 小时前
介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
docker·容器·eureka
qq31785355712 小时前
Mysql集群技术
android·数据库·mysql·adb
阿船·2 小时前
MySQL调优
数据库·mysql
xia_20173 小时前
windows下安装docker操作步骤
运维·docker·容器
计算机学姐3 小时前
基于SSM的超市管理系统
java·mysql·spring·tomcat·mybatis
haozihua3 小时前
Spring6梳理5——基于XML管理Bean环境搭建
java·开发语言·mysql
观止study4 小时前
【MySQL】Explain执行计划(十七)
数据库·mysql
一身傲骨@4 小时前
sql-labs56-60通关攻略
数据库·sql·mysql