溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在Kubernetes上運(yùn)行高可用的WordPress和MySQL

發(fā)布時(shí)間:2021-09-16 11:37:58 來(lái)源:億速云 閱讀:120 作者:chen 欄目:云計(jì)算

本篇內(nèi)容主要講解“如何在Kubernetes上運(yùn)行高可用的WordPress和MySQL”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何在Kubernetes上運(yùn)行高可用的WordPress和MySQL”吧!

架構(gòu)概述

現(xiàn)在我來(lái)簡(jiǎn)要介紹一下我們將要使用的技術(shù)及其功能:

? WordPress應(yīng)用程序文件的存儲(chǔ):具有GCE持久性磁盤(pán)備份的NFS存儲(chǔ)

? 數(shù)據(jù)庫(kù)集群:帶有用于奇偶校驗(yàn)的xtrabackup的MySQL

? 應(yīng)用程序級(jí)別:掛載到NFS存儲(chǔ)的WordPress DockerHub映像

? 負(fù)載均衡和網(wǎng)絡(luò):基于Kubernetes的負(fù)載均衡器和服務(wù)網(wǎng)絡(luò)

該體系架構(gòu)如下所示: 如何在Kubernetes上運(yùn)行高可用的WordPress和MySQL

在Kubernetes中創(chuàng)建存儲(chǔ)類、服務(wù)和配置映射

在Kubernetes中,狀態(tài)集提供了一種定義pod初始化順序的方法。我們將使用一個(gè)有狀態(tài)的MySQL集合,因?yàn)樗艽_保我們的數(shù)據(jù)節(jié)點(diǎn)有足夠的時(shí)間在啟動(dòng)時(shí)復(fù)制先前pods中的記錄。我們配置這個(gè)狀態(tài)集的方式可以讓MySQL主機(jī)在其他附屬機(jī)器之前先啟動(dòng),因此當(dāng)我們擴(kuò)展時(shí),可以直接從主機(jī)將克隆發(fā)送到附屬機(jī)器上。

首先,我們需要?jiǎng)?chuàng)建一個(gè)持久卷存儲(chǔ)類和配置映射,以根據(jù)需要應(yīng)用主從配置。

我們使用持久卷,避免數(shù)據(jù)庫(kù)中的數(shù)據(jù)受限于集群中任何特定的pods。這種方式可以避免數(shù)據(jù)庫(kù)在MySQL主機(jī)pod丟失的情況下丟失數(shù)據(jù),當(dāng)主機(jī)pod丟失時(shí),它可以重新連接到帶xtrabackup的附屬機(jī)器,并將數(shù)據(jù)從附屬機(jī)器拷貝到主機(jī)中。MySQL的復(fù)制負(fù)責(zé)主機(jī)-附屬的復(fù)制,而xtrabackup負(fù)責(zé)附屬-主機(jī)的復(fù)制。

要?jiǎng)討B(tài)分配持久卷,我們使用GCE持久磁盤(pán)創(chuàng)建存儲(chǔ)類。不過(guò),Kubernetes提供了各種持久性卷的存儲(chǔ)方案: 如何在Kubernetes上運(yùn)行高可用的WordPress和MySQL

創(chuàng)建類,并且使用指令:$ kubectl create -f storage-class.yaml部署它。

接下來(lái),我們將創(chuàng)建configmap,它指定了一些在MySQL配置文件中設(shè)置的變量。這些不同的配置由pod本身選擇有關(guān),但它們也為我們提供了一種便捷的方式來(lái)管理潛在的配置變量。 創(chuàng)建名為mysql-configmap.yaml的YAML文件來(lái)處理配置,如下: 如何在Kubernetes上運(yùn)行高可用的WordPress和MySQL

創(chuàng)建configmap并使用指令:$ kubectl create -f mysql-configmap.yaml來(lái)部署它。

接下來(lái)我們要設(shè)置服務(wù)以便MySQL pods可以互相通信,并且我們的WordPress pod可以使用mysql-services.yaml與MySQL通信。這也為MySQL服務(wù)啟動(dòng)了服務(wù)負(fù)載均衡器。 如何在Kubernetes上運(yùn)行高可用的WordPress和MySQL

通過(guò)此服務(wù)聲明,我們就為實(shí)現(xiàn)一個(gè)多寫(xiě)入、多讀取的MySQL實(shí)例集群奠定了基礎(chǔ)。這種配置是必要的,每個(gè)WordPress實(shí)例都可能寫(xiě)入數(shù)據(jù)庫(kù),所以每個(gè)節(jié)點(diǎn)都必須準(zhǔn)備好讀寫(xiě)。

執(zhí)行命令$ kubectl create -f mysql-services.yaml來(lái)創(chuàng)建上述的服務(wù)。

到這為止,我們創(chuàng)建了卷聲明存儲(chǔ)類,它將持久磁盤(pán)交給所有請(qǐng)求它們的容器,我們配置了configmap,在MySQL配置文件中設(shè)置了一些變量,并且我們配置了一個(gè)網(wǎng)絡(luò)層服務(wù),負(fù)責(zé)對(duì)MySQL服務(wù)器請(qǐng)求的負(fù)載均衡。上面說(shuō)的這些只是準(zhǔn)備有狀態(tài)集的框架, MySQL服務(wù)器實(shí)際在哪里運(yùn)行,我們接下來(lái)將繼續(xù)探討。

配置有狀態(tài)集的MySQL

本節(jié)中,我們將編寫(xiě)一個(gè)YAML配置文件應(yīng)用于使用了狀態(tài)集的MySQL實(shí)例。 我們先定義我們的狀態(tài)集:

  • 創(chuàng)建三個(gè)pods并將它們注冊(cè)到MySQL服務(wù)上。

  • 按照下列模版定義每個(gè)pod:

    • 為主機(jī)MySQL服務(wù)器創(chuàng)建初始化容器,命名為init-mysql.

    • 給這個(gè)容器使用mysql:5.7鏡像

    • 運(yùn)行一個(gè)bash腳本來(lái)啟動(dòng)xtrabackup

    • 為配置文件和configmap掛載兩個(gè)新卷

  • 為主機(jī)MySQL服務(wù)器創(chuàng)建初始化容器,命名為clone-mysql.

    • 為該容器使用Google Cloud Registry的xtrabackup:1.0鏡像

    • 運(yùn)行bash腳本來(lái)克隆上一個(gè)同級(jí)的現(xiàn)有xtrabackups

    • 為數(shù)據(jù)和配置文件掛在兩個(gè)新卷

    • 該容器有效地托管克隆的數(shù)據(jù),便于新的附屬容器可以獲取它

  • 為附屬M(fèi)ySQL服務(wù)器創(chuàng)建基本容器

    • 創(chuàng)建一個(gè)MySQL附屬容器,配置它連接到MySQL主機(jī)

    • 創(chuàng)建附屬xtrabackup容器,配置它連接到xtrabackup主機(jī)

  • 創(chuàng)建一個(gè)卷聲明模板來(lái)描述每個(gè)卷,每個(gè)卷是一個(gè)10GB的持久磁盤(pán)

下面的配置文件定義了MySQL集群的主節(jié)點(diǎn)和附屬節(jié)點(diǎn)的行為,提供了運(yùn)行附屬客戶端的bash配置,并確保在克隆之前主節(jié)點(diǎn)能夠正常運(yùn)行。附屬節(jié)點(diǎn)和主節(jié)點(diǎn)分別獲得他們自己的10GB卷,這是他們?cè)谖覀冎岸x的持久卷存儲(chǔ)類中請(qǐng)求的。 如何在Kubernetes上運(yùn)行高可用的WordPress和MySQL

將該文件存為mysql-statefulset.yaml,輸入kubectl create -f mysql-statefulset.yaml并讓Kubernetes部署你的數(shù)據(jù)庫(kù)。

現(xiàn)在當(dāng)你調(diào)用$ kubectl get pods,你應(yīng)該看到3個(gè)pods啟動(dòng)或者準(zhǔn)備好,其中每個(gè)pod上都有兩個(gè)容器。 主節(jié)點(diǎn)pod表示為mysql-0,而附屬的pods為mysql-1和mysql-2.

讓pods執(zhí)行幾分鐘來(lái)確保xtrabackup服務(wù)在pod之間正確同步,然后進(jìn)行WordPress的部署。

您可以檢查單個(gè)容器的日志來(lái)確認(rèn)沒(méi)有錯(cuò)誤消息拋出。 查看日志的命令為$ kubectl logs -f -c <container_name>

主節(jié)點(diǎn)xtrabackup容器應(yīng)顯示來(lái)自附屬的兩個(gè)連接,并且日志中不應(yīng)該出現(xiàn)任何錯(cuò)誤。

部署高可用的WordPress

整個(gè)過(guò)程的最后一步是將我們的WordPress pods部署到集群上。為此我們希望為WordPress的服務(wù)和部署進(jìn)行定義。

為了讓W(xué)ordPress實(shí)現(xiàn)高可用,我們希望每個(gè)容器運(yùn)行時(shí)都是完全可替換的,這意味著我們可以終止一個(gè),啟動(dòng)另一個(gè)而不需要對(duì)數(shù)據(jù)或服務(wù)可用性進(jìn)行修改。我們也希望能夠容忍至少一個(gè)容器的失誤,有一個(gè)冗余的容器負(fù)責(zé)處理slack。

WordPress將重要的站點(diǎn)相關(guān)數(shù)據(jù)存儲(chǔ)在應(yīng)用程序目錄/var/www/html中。對(duì)于要為同一站點(diǎn)提供服務(wù)的兩個(gè)WordPress實(shí)例,該文件夾必須包含相同的數(shù)據(jù)。

當(dāng)運(yùn)行高可用WordPress時(shí),我們需要在實(shí)例之間共享/var/www/html文件夾,因此我們定義一個(gè)NGS服務(wù)作為這些卷的掛載點(diǎn)。

下面是設(shè)置NFS服務(wù)的配置,我提供了純英文的版本: 如何在Kubernetes上運(yùn)行高可用的WordPress和MySQL

使用指令$ kubectl create -f nfs.yaml部署NFS服務(wù)。 現(xiàn)在,我們需要運(yùn)行$ kubectl describe services nfs-server獲得IP地址,這在后面會(huì)用到。 注意:將來(lái),我們可以使用服務(wù)名稱講這些綁定在一起,但現(xiàn)在你需要對(duì)IP地址進(jìn)行硬編碼。

如何在Kubernetes上運(yùn)行高可用的WordPress和MySQL

我們現(xiàn)在創(chuàng)建了一個(gè)持久卷聲明,和我們之前創(chuàng)建的NFS服務(wù)建立映射,然后將卷附加到WordPress pod上,即/var/www/html根目錄,這也是WordPress安裝的地方。這里保留了集群中WordPress pods的所有安裝和環(huán)境。有了這些配置,我們就可以對(duì)任何WordPress節(jié)點(diǎn)進(jìn)行啟動(dòng)和拆除,而數(shù)據(jù)能夠留下來(lái)。因?yàn)镹FS服務(wù)需要不斷使用物理卷,該卷將保留下來(lái),并且不會(huì)被回收或錯(cuò)誤分配。

使用指令$ kubectl create -f wordpress.yaml部署WordPress實(shí)例。

默認(rèn)部署只會(huì)運(yùn)行一個(gè)WordPress實(shí)例,可以使用指令$ kubectl scale --replicas=<number of replicas> deployment/wordpress擴(kuò)展WordPress實(shí)例數(shù)量。

要獲得WordPress服務(wù)負(fù)載均衡器的地址,你需要輸入$ kubectl get services wordpress并從結(jié)果中獲取EXTERNAL-IP字段來(lái)導(dǎo)航到WordPress。

彈性測(cè)試

OK,現(xiàn)在我們已經(jīng)部署好了服務(wù),那我們來(lái)拆除一下它們,看看我們的高可用架構(gòu)如何處理這些混亂。在這種部署方式中,唯一剩下的單點(diǎn)故障就是NFS服務(wù)(原因總結(jié)在文末結(jié)論中)。你應(yīng)該能夠測(cè)試其他任何的服務(wù)來(lái)了解應(yīng)用程序是如何響應(yīng)的?,F(xiàn)在我已經(jīng)啟動(dòng)了WordPress服務(wù)的三個(gè)副本,以及MySQL服務(wù)中的一個(gè)主兩個(gè)附屬節(jié)點(diǎn)。

首先,我們先kill掉其他而只留下一個(gè)WordPress節(jié)點(diǎn),來(lái)看看應(yīng)用如何響應(yīng): $ kubectl scale --replicas=1 deployment/wordpress

現(xiàn)在我們應(yīng)該看到WordPress部署的pod數(shù)量有所下降。 $ kubectl get pods

應(yīng)該能看到WordPress pods的運(yùn)行變成了1/1。

點(diǎn)擊WordPress服務(wù)IP,我們將看到與之前一樣的站點(diǎn)和數(shù)據(jù)庫(kù)。

如果要擴(kuò)展復(fù)原,可以使用$ kubectl scale --replicas=3 deployment/wordpress。

再一次,我們可以看到數(shù)據(jù)包留在了三個(gè)實(shí)例中。

下面測(cè)試MySQL的狀態(tài)集,我們使用指令縮小備份的數(shù)量: $ kubectl scale statefulsets mysql --replicas=1

我們會(huì)看到兩個(gè)附屬?gòu)脑搶?shí)例中丟失,如果主節(jié)點(diǎn)在此時(shí)丟失,它所保存的數(shù)據(jù)將保存在GCE持久磁盤(pán)上。不過(guò)就必須手動(dòng)從磁盤(pán)恢復(fù)數(shù)據(jù)。

如果所有三個(gè)MySQL節(jié)點(diǎn)都關(guān)閉了,當(dāng)新節(jié)點(diǎn)出現(xiàn)時(shí)就無(wú)法復(fù)制。但是,如果一個(gè)主節(jié)點(diǎn)發(fā)生故障,一個(gè)新的主節(jié)點(diǎn)就會(huì)自動(dòng)啟動(dòng),并且通過(guò)xtrabackup重新配置來(lái)自附屬節(jié)點(diǎn)的數(shù)據(jù)。因此,在運(yùn)行生產(chǎn)數(shù)據(jù)庫(kù)時(shí),我不建議以小于3的復(fù)制系數(shù)來(lái)運(yùn)行。

到此,相信大家對(duì)“如何在Kubernetes上運(yùn)行高可用的WordPress和MySQL”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI