温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何在Kubernetes上运行高可用的WordPress和MySQL

发布时间:2021-09-16 11:37:58 来源:亿速云 阅读:122 作者:chen 栏目:云计算

本篇内容主要讲解“如何在Kubernetes上运行高可用的WordPress和MySQL”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何在Kubernetes上运行高可用的WordPress和MySQL”吧!

架构概述

现在我来简要介绍一下我们将要使用的技术及其功能:

• WordPress应用程序文件的存储:具有GCE持久性磁盘备份的NFS存储

• 数据库集群:带有用于奇偶校验的xtrabackup的MySQL

• 应用程序级别:挂载到NFS存储的WordPress DockerHub映像

负载均衡和网络:基于Kubernetes的负载均衡器和服务网络

该体系架构如下所示: 如何在Kubernetes上运行高可用的WordPress和MySQL

在Kubernetes中创建存储类、服务和配置映射

在Kubernetes中,状态集提供了一种定义pod初始化顺序的方法。我们将使用一个有状态的MySQL集合,因为它能确保我们的数据节点有足够的时间在启动时复制先前pods中的记录。我们配置这个状态集的方式可以让MySQL主机在其他附属机器之前先启动,因此当我们扩展时,可以直接从主机将克隆发送到附属机器上。

首先,我们需要创建一个持久卷存储类和配置映射,以根据需要应用主从配置。

我们使用持久卷,避免数据库中的数据受限于集群中任何特定的pods。这种方式可以避免数据库在MySQL主机pod丢失的情况下丢失数据,当主机pod丢失时,它可以重新连接到带xtrabackup的附属机器,并将数据从附属机器拷贝到主机中。MySQL的复制负责主机-附属的复制,而xtrabackup负责附属-主机的复制。

要动态分配持久卷,我们使用GCE持久磁盘创建存储类。不过,Kubernetes提供了各种持久性卷的存储方案: 如何在Kubernetes上运行高可用的WordPress和MySQL

创建类,并且使用指令:$ kubectl create -f storage-class.yaml部署它。

接下来,我们将创建configmap,它指定了一些在MySQL配置文件中设置的变量。这些不同的配置由pod本身选择有关,但它们也为我们提供了一种便捷的方式来管理潜在的配置变量。 创建名为mysql-configmap.yaml的YAML文件来处理配置,如下: 如何在Kubernetes上运行高可用的WordPress和MySQL

创建configmap并使用指令:$ kubectl create -f mysql-configmap.yaml来部署它。

接下来我们要设置服务以便MySQL pods可以互相通信,并且我们的WordPress pod可以使用mysql-services.yaml与MySQL通信。这也为MySQL服务启动了服务负载均衡器。 如何在Kubernetes上运行高可用的WordPress和MySQL

通过此服务声明,我们就为实现一个多写入、多读取的MySQL实例集群奠定了基础。这种配置是必要的,每个WordPress实例都可能写入数据库,所以每个节点都必须准备好读写。

执行命令$ kubectl create -f mysql-services.yaml来创建上述的服务。

到这为止,我们创建了卷声明存储类,它将持久磁盘交给所有请求它们的容器,我们配置了configmap,在MySQL配置文件中设置了一些变量,并且我们配置了一个网络层服务,负责对MySQL服务器请求的负载均衡。上面说的这些只是准备有状态集的框架, MySQL服务器实际在哪里运行,我们接下来将继续探讨。

配置有状态集的MySQL

本节中,我们将编写一个YAML配置文件应用于使用了状态集的MySQL实例。 我们先定义我们的状态集:

  • 创建三个pods并将它们注册到MySQL服务上。

  • 按照下列模版定义每个pod:

    • 为主机MySQL服务器创建初始化容器,命名为init-mysql.

    • 给这个容器使用mysql:5.7镜像

    • 运行一个bash脚本来启动xtrabackup

    • 为配置文件和configmap挂载两个新卷

  • 为主机MySQL服务器创建初始化容器,命名为clone-mysql.

    • 为该容器使用Google Cloud Registry的xtrabackup:1.0镜像

    • 运行bash脚本来克隆上一个同级的现有xtrabackups

    • 为数据和配置文件挂在两个新卷

    • 该容器有效地托管克隆的数据,便于新的附属容器可以获取它

  • 为附属MySQL服务器创建基本容器

    • 创建一个MySQL附属容器,配置它连接到MySQL主机

    • 创建附属xtrabackup容器,配置它连接到xtrabackup主机

  • 创建一个卷声明模板来描述每个卷,每个卷是一个10GB的持久磁盘

下面的配置文件定义了MySQL集群的主节点和附属节点的行为,提供了运行附属客户端的bash配置,并确保在克隆之前主节点能够正常运行。附属节点和主节点分别获得他们自己的10GB卷,这是他们在我们之前定义的持久卷存储类中请求的。 如何在Kubernetes上运行高可用的WordPress和MySQL

将该文件存为mysql-statefulset.yaml,输入kubectl create -f mysql-statefulset.yaml并让Kubernetes部署你的数据库。

现在当你调用$ kubectl get pods,你应该看到3个pods启动或者准备好,其中每个pod上都有两个容器。 主节点pod表示为mysql-0,而附属的pods为mysql-1和mysql-2.

让pods执行几分钟来确保xtrabackup服务在pod之间正确同步,然后进行WordPress的部署。

您可以检查单个容器的日志来确认没有错误消息抛出。 查看日志的命令为$ kubectl logs -f -c <container_name>

主节点xtrabackup容器应显示来自附属的两个连接,并且日志中不应该出现任何错误。

部署高可用的WordPress

整个过程的最后一步是将我们的WordPress pods部署到集群上。为此我们希望为WordPress的服务和部署进行定义。

为了让WordPress实现高可用,我们希望每个容器运行时都是完全可替换的,这意味着我们可以终止一个,启动另一个而不需要对数据或服务可用性进行修改。我们也希望能够容忍至少一个容器的失误,有一个冗余的容器负责处理slack。

WordPress将重要的站点相关数据存储在应用程序目录/var/www/html中。对于要为同一站点提供服务的两个WordPress实例,该文件夹必须包含相同的数据。

当运行高可用WordPress时,我们需要在实例之间共享/var/www/html文件夹,因此我们定义一个NGS服务作为这些卷的挂载点。

下面是设置NFS服务的配置,我提供了纯英文的版本: 如何在Kubernetes上运行高可用的WordPress和MySQL

使用指令$ kubectl create -f nfs.yaml部署NFS服务。 现在,我们需要运行$ kubectl describe services nfs-server获得IP地址,这在后面会用到。 注意:将来,我们可以使用服务名称讲这些绑定在一起,但现在你需要对IP地址进行硬编码。

如何在Kubernetes上运行高可用的WordPress和MySQL

我们现在创建了一个持久卷声明,和我们之前创建的NFS服务建立映射,然后将卷附加到WordPress pod上,即/var/www/html根目录,这也是WordPress安装的地方。这里保留了集群中WordPress pods的所有安装和环境。有了这些配置,我们就可以对任何WordPress节点进行启动和拆除,而数据能够留下来。因为NFS服务需要不断使用物理卷,该卷将保留下来,并且不会被回收或错误分配。

使用指令$ kubectl create -f wordpress.yaml部署WordPress实例。

默认部署只会运行一个WordPress实例,可以使用指令$ kubectl scale --replicas=<number of replicas> deployment/wordpress扩展WordPress实例数量。

要获得WordPress服务负载均衡器的地址,你需要输入$ kubectl get services wordpress并从结果中获取EXTERNAL-IP字段来导航到WordPress。

弹性测试

OK,现在我们已经部署好了服务,那我们来拆除一下它们,看看我们的高可用架构如何处理这些混乱。在这种部署方式中,唯一剩下的单点故障就是NFS服务(原因总结在文末结论中)。你应该能够测试其他任何的服务来了解应用程序是如何响应的。现在我已经启动了WordPress服务的三个副本,以及MySQL服务中的一个主两个附属节点。

首先,我们先kill掉其他而只留下一个WordPress节点,来看看应用如何响应: $ kubectl scale --replicas=1 deployment/wordpress

现在我们应该看到WordPress部署的pod数量有所下降。 $ kubectl get pods

应该能看到WordPress pods的运行变成了1/1。

点击WordPress服务IP,我们将看到与之前一样的站点和数据库。

如果要扩展复原,可以使用$ kubectl scale --replicas=3 deployment/wordpress。

再一次,我们可以看到数据包留在了三个实例中。

下面测试MySQL的状态集,我们使用指令缩小备份的数量: $ kubectl scale statefulsets mysql --replicas=1

我们会看到两个附属从该实例中丢失,如果主节点在此时丢失,它所保存的数据将保存在GCE持久磁盘上。不过就必须手动从磁盘恢复数据。

如果所有三个MySQL节点都关闭了,当新节点出现时就无法复制。但是,如果一个主节点发生故障,一个新的主节点就会自动启动,并且通过xtrabackup重新配置来自附属节点的数据。因此,在运行生产数据库时,我不建议以小于3的复制系数来运行。

到此,相信大家对“如何在Kubernetes上运行高可用的WordPress和MySQL”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI