您好,登录后才能下订单哦!
本篇内容主要讲解“如何在Kubernetes上运行高可用的WordPress和MySQL”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何在Kubernetes上运行高可用的WordPress和MySQL”吧!
现在我来简要介绍一下我们将要使用的技术及其功能:
• WordPress应用程序文件的存储:具有GCE持久性磁盘备份的NFS存储
• 数据库集群:带有用于奇偶校验的xtrabackup的MySQL
• 应用程序级别:挂载到NFS存储的WordPress DockerHub映像
• 负载均衡和网络:基于Kubernetes的负载均衡器和服务网络
该体系架构如下所示:
在Kubernetes中,状态集提供了一种定义pod初始化顺序的方法。我们将使用一个有状态的MySQL集合,因为它能确保我们的数据节点有足够的时间在启动时复制先前pods中的记录。我们配置这个状态集的方式可以让MySQL主机在其他附属机器之前先启动,因此当我们扩展时,可以直接从主机将克隆发送到附属机器上。
首先,我们需要创建一个持久卷存储类和配置映射,以根据需要应用主从配置。
我们使用持久卷,避免数据库中的数据受限于集群中任何特定的pods。这种方式可以避免数据库在MySQL主机pod丢失的情况下丢失数据,当主机pod丢失时,它可以重新连接到带xtrabackup的附属机器,并将数据从附属机器拷贝到主机中。MySQL的复制负责主机-附属的复制,而xtrabackup负责附属-主机的复制。
要动态分配持久卷,我们使用GCE持久磁盘创建存储类。不过,Kubernetes提供了各种持久性卷的存储方案:
创建类,并且使用指令:$ kubectl create -f storage-class.yaml部署它。
接下来,我们将创建configmap,它指定了一些在MySQL配置文件中设置的变量。这些不同的配置由pod本身选择有关,但它们也为我们提供了一种便捷的方式来管理潜在的配置变量。 创建名为mysql-configmap.yaml的YAML文件来处理配置,如下:
创建configmap并使用指令:$ kubectl create -f mysql-configmap.yaml来部署它。
接下来我们要设置服务以便MySQL pods可以互相通信,并且我们的WordPress pod可以使用mysql-services.yaml与MySQL通信。这也为MySQL服务启动了服务负载均衡器。
通过此服务声明,我们就为实现一个多写入、多读取的MySQL实例集群奠定了基础。这种配置是必要的,每个WordPress实例都可能写入数据库,所以每个节点都必须准备好读写。
执行命令$ kubectl create -f mysql-services.yaml来创建上述的服务。
到这为止,我们创建了卷声明存储类,它将持久磁盘交给所有请求它们的容器,我们配置了configmap,在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卷,这是他们在我们之前定义的持久卷存储类中请求的。
将该文件存为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 pods部署到集群上。为此我们希望为WordPress的服务和部署进行定义。
为了让WordPress实现高可用,我们希望每个容器运行时都是完全可替换的,这意味着我们可以终止一个,启动另一个而不需要对数据或服务可用性进行修改。我们也希望能够容忍至少一个容器的失误,有一个冗余的容器负责处理slack。
WordPress将重要的站点相关数据存储在应用程序目录/var/www/html中。对于要为同一站点提供服务的两个WordPress实例,该文件夹必须包含相同的数据。
当运行高可用WordPress时,我们需要在实例之间共享/var/www/html文件夹,因此我们定义一个NGS服务作为这些卷的挂载点。
下面是设置NFS服务的配置,我提供了纯英文的版本:
使用指令$ kubectl create -f nfs.yaml部署NFS服务。 现在,我们需要运行$ kubectl describe services nfs-server获得IP地址,这在后面会用到。 注意:将来,我们可以使用服务名称讲这些绑定在一起,但现在你需要对IP地址进行硬编码。
我们现在创建了一个持久卷声明,和我们之前创建的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”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。