當前位置:
首頁 > 最新 > WordPress:如何應用Kubernetes和Portworx實現高可用和可擴展性

WordPress:如何應用Kubernetes和Portworx實現高可用和可擴展性

據統計,全球28%的網站都運行在WordPress上,這是一個驚人的數字,以此計算的話,大約有7500萬個站點。WordPress是14年前出現的,在此期間,互聯網用戶數量從6億已增加到了37億。WordPress擁有兩個狀態的組件: MySQL資料庫;及文件系統目錄(用來保存上傳的媒體文件和插件)。

WordPress發布之初,最常見的部署策略在伺服器上安裝WordPress PHP應用程序,MySQL資料庫以及文件存儲目錄。我們希望能夠進行備份,但事實上,我們並不需要考慮「存儲」問題,因為事實上已經超出了本地磁碟容量。

在這14年時間裡,以及包括新增的31億用戶,我們都明白現如今的互聯網環境與WordPress發布時完全不一樣。在這7500萬個WordPress網站中,總有一部分網站的流量大的驚人,所以單個伺服器上的流量訪問對於開發者來說是一大頭疼的事。

不得不說,總有那麼一群人一直在研發很棒的工具來幫助解決這些問題。本文講述其中的兩個:

Kubernetes

Portworx

Kubernetes允許WordPress和MySQL容器在許多計算機上運行。這意味著可以橫向擴展,同時有足夠的能力來應對快速增長的用戶群。

Portworx則提供了一個「數據管理層」,這表示能在一個節點上安全地運行MySQL伺服器,不用擔心節點是否中斷。其block layer複製意味著數據已存在另一台機器上,這樣便大大減少了故障時轉移的時間。

Portworx同時還提供「共享卷」,這是WordPress的一大利器。「共享卷」使WordPress在文件夾中上傳文件時擁有「多作者」。,這意味著可以橫向擴展WordPress PHP容器,而不用擔心在集群中的多個磁碟上分割上傳。

將 Portworx的這兩個功能與Kubernetes集群相結合,我們得到WordPress實例,它具備以下能力:

在block層自動複製MySQL數據

橫向擴展WordPress PHP容器,並對文件上傳目錄使用「多作者」語義

節點發生故障時自動修復

然而,以上所有這些都使用單個數據管理層!

WordPress架構

首先,我們來看看沒有Kubernetes或Portworx的WordPress的單個節點安裝是如何運行的:

WordPress容器部署圖

可以看到,PHP應用的伺服器會處理HTTP請求,處理包含讀、寫、上傳文件及查詢後台MySQL資料庫。

▌文件上傳

在單個節點設置中,文件上傳目錄和MySQL數據目錄都是本地磁碟上的文件夾,一個塊設備上有一個文件系統。如果要擴展WordPress容器,就要在它前面用代理來平衡流量。這樣設置的問題是,文件的上傳是跨多個伺服器分離的。

來看看在兩個節點上運行WordPress手動安裝的2節點集群:

你可以看到,文件上傳的整個卷現在跨多個磁碟分離。WordPress對這個並沒有一個原生的理解,所以用戶能用這個設置來查看定期丟失的文件。

理想情況下,我們需要共享的文件系統;無論從哪裡讀取或寫入什麼,抑或是存儲,對於每個WordPress容器來說都是一樣的。

▌MySQL數據

資料庫存儲有一個不同的問題:我們需要確保數據在節點發生故障時是安全的。第一步是確保在另一台電腦上有一個數據副本,以便在出現故障時能重新構建伺服器。

MySQL伺服器失敗的設置:

WordPress容器故障圖

我們通過在另一台計算機上自動更新數據副本來降低節點故障的風險。然而,這意味著我們必須以某種方式來進行故障自動轉移,這樣做對用戶並不友好。此時,我們可以使用MySQL主從設置,但這並不是最快的轉移方式,而且當我們重新同步新舊之間的更改時,性能可能會受到影響。

上面提到的文件上傳卷也因為同樣的原因需要某種類型的複製(比如,磁碟中斷)。

▌Kubernetes

使用Kubernetes,可以解決故障自動轉移的問題。如果一個節點死機,它將自動將MySQL容器重新安排到另一個節點。

但我們也需要數據,所以這個解決方案還不夠完整。如果在AWS上,可以用EBS作為解決方案(Kubernetes也有一個EBS插件),但這會導致諸如如EBS 卷卡住的問題。

同樣,當橫向擴展WordPress PHP容器時,問題並不是由Kubernetes單獨解決,而是一個容器管理層。可用NFS 卷,但這增加了一定的複雜性,因為我們正在為項目使用多個存儲後端。

我們需要一個數據管理層提供以下功能:

用於故障轉移的塊層複製

用於橫向擴展的「多作者」語義

這個解決方案需要原生的Kubernetes集成,一起來具體看看吧。

▌在kubernetes上的Portworx

Portworx是這個例子的完美解決方案,因為它提供了兩種類型的存儲(複製和多作者),同時,還具備原生的Kubernetes集成。

以下方式解決了我們的用例:

運行MySQL的節點可能會死,Kubernetes將使用副本數據集重新安排一個新的MySQL pod到節點 (使用HyperConvergence)。

橫向擴展的WordPress PHP容器都具有單個文件上傳磁碟的相同視圖(即「多作者」)

文件上傳卷及多作者也會複製,以防止任何節點出現故障

▌文件上傳

因為Portworx可以創建使用「多作者」語義的「共享」卷,我們可以為多個WordPress容器使用相同的Portworx 卷。

由於Portworx知道文件所處在實際節點,並能可視化地代理將該文件載入到節點上的請求,所以寫入的每個文件都可用於其他卷。這在塊層發生,因此,任何可寫入文件系統的都不知道卷的大小,實際上,共享的數據並不是本地的數據。

通過下圖可以看到這一點:

使用Portworx複製和共享卷

此外,共享卷可以被複制(以防節點故障),它為我們提供了一個解決方案,能解決文件被寫入到多個主機的問題。

▌MySQL數據

這是節點故障前的集群。注意Portworx是如何進行MySQL卷的塊層複製的。

HA WordPress使用Portworx複製

然後,如果節點出現故障,Kubernetes將把這個pod重新安排到Node B,在那裡,MySQL副本準備就緒並等待開始。這樣就減少了故障轉移的時間,通過將容器和數據遷移到新主機來自動處理故障。

伺服器故障期間的HA WordPress

▌MySQL主從

為了簡單起見,我們使用單個MySQL pod。在生產中,將使用StatefulSet,因為它允許MySQL在主/從配置中運行。

當然,Portworx 能很好地與StatefulSets 進行集成,在其應用層複製之下MySQL能利用塊層更快複製。

▌額外功能

此外,Portworx不僅僅是一個存儲連接器,也是一個數據管理層,以下有用的特性都是免費的:

能安全地進行生產數據集的快照,而不會停機(這一點對於CI非常有用)

將底層塊設備池存儲到一個統一的存儲結構中,以此來將存儲從計算中分離出來

用於加密數據的各種選項

自動將備份的快照發送到各種雲存儲提供商

為各種物理後端存儲設備提供統一的存儲管理層

舉 例

下面是使用kops工具在AWS的Kubernetes上運行的安裝程序的簡短介紹。

▌創建集群

首先使用kops AWS在AWS上創建一個Kubernetes集群。

$ kops create cluster

--zones=$

--kubernetes-version=$

--dns-zone=$

--yes

--name $

▌安裝etcd

安裝一個etcd伺服器(Portworx將使用它來保持集群協調)。使用CoreOS etcd來安裝etcd。

$ kubectl apply -f https://coreos.com/operators/etcd/latest/deployment.yaml

$ sleep 20

$ kubectl apply -f https://coreos.com/operators/etcd/latest/example-etcd-cluster.yaml

$ kubectl apply -f manifests/etcd-proxy.yaml

▌模板卷

然後,創建一個模板卷。』 kops』使用AWS的Auto Scaling Groups,Portworx與之能很好地集成在一起。

$ export VOLUMEID=$(aws ec2 create-volume

--size 20

--volume-type gp2

--region $

--availability-zone $

--output text

--query VolumeId )

▌Portworx Deamonset

這一步,我們將Portworx作為Deamonset運行,這表示一個Portworx容器將在集群中的每個節點上運行。

$ cat manifests/px.yaml envsubst kubectl create -f -

$ ssh admin@api.$ sudo /opt/pwx/bin/pxctl status

▌創建卷

安裝好了Portworx,我們可以在集群中的任何節點上進行SSH,使用"pxctl cli並創建卷。

為MySQL數據創建一個複製卷:

$ ssh admin@api.$ sudo /opt/pwx/bin/pxctl volume create

--size=5

--repl=2

--fs=ext4

mysql-disk

上面的卷名稱為「mysql-disk」,大小為「5GB」,格式為「ext4」,在集群中有2個副本(故障轉移時我們需要複製)。

然後為WordPress PHP容器創建「multi-writer」磁碟。它將有和MySQL磁碟相同的屬性,並帶有額外的共享標誌。它允許卷連接到多個容器,這便是我們需要的橫向擴展WordPress容器:

$ ssh admin@api.$ sudo /opt/pwx/bin/pxctl volume create

--size=5

--repl=2

--fs=ext4

--shared

storage-disk

卷通過`pxctl`的`list`命令創建:

$ ssh admin@api.$ sudo /opt/pwx/bin/pxctl volume list

▌啟動MySQL

有一個磁碟ID,用它來運行MySQL pod:

$ export MYSQL_DISK_ID=$(ssh admin@api.$ sudo /opt/pwx/bin/pxctl volume list grep mysql-disk awk )

$ cat manifests/mysql.yaml envsubst kubectl apply -f -

以下是YAML的內容,使用`envsubst`來替換新創建的磁碟的ID:

---

apiVersion: v1

kind: Namespace

metadata:

name: mysql

---

apiVersion: v1

kind: Service

metadata:

name: mysql

namespace: mysql

labels:

app: mysql

spec:

ports:

- port: 3306

name: mysql

clusterIP: None

selector:

app: mysql

---

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: mysql

namespace: mysql

spec:

replicas: 1

template:

metadata:

labels:

app: mysql

spec:

containers:

- name: mysql

image: mysql:5.6

env:

# Use secret in real usage

- name: MYSQL_ROOT_PASSWORD

value: password

ports:

- containerPort: 3306

name: mysql

volumeMounts:

- name: "$"

mountPath: /var/lib/mysql

volumes:

- name: "$"

portworxVolume:

volumeID: "$"

fsType: ext4

▌啟動WordPress

最後運行WordPress PHP pod:

$ export WORDPRESS_DISK_ID=$(ssh admin@api.$ sudo /opt/pwx/bin/pxctl volume list grep storage-disk awk )

$ cat manifests/wordpress.yaml envsubst kubectl apply -f -

與MySQL pod一樣,用`envsubst`替換新創建的磁碟的ID:

---

apiVersion: v1

kind: Namespace

metadata:

name: wordpress

---

apiVersion: v1

kind: Service

metadata:

name: wordpress

namespace: wordpress

labels:

app: wordpress

spec:

ports:

- port: 80

name: wordpress

clusterIP: None

selector:

app: wordpress

---

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: wordpress

namespace: wordpress

spec:

replicas: 1

template:

metadata:

labels:

app: wordpress

spec:

containers:

- name: wordpress

image: wordpress:latest

env:

# Use secret in real usage

- name: WORDPRESS_DB_PASSWORD

value: password

- name: WORDPRESS_DB_HOST

value: mysql.svc.cluster.local

ports:

- containerPort: 80

name: wordpress

volumeMounts:

- name: "$"

mountPath: /var/www/html

volumes:

- name: "$"

portworxVolume:

volumeID: "$"

fsType: ext4

▌思考

注意我們是如何在Kubernetes「部署」中實際部署WordPress和MySQL的。這就表示我們可以輕鬆地縮放每個部署運行的容器數量。

單純地增加MySQL部署的規模是沒有意義的。如前所述,我們將為其使用狀態設置和主/從概念。

但我們可使用「kubectl規模部署」來增加WordPress容器的數量,因為它們正在使用Portworx的「共享」卷。

以下是將WordPress容器增加到10個的命令行:

kubectl scale deployment wordpress --replicas 10

總 結

本文展示了如何在AWS Kubernetes集群上安裝和操作WordPress和Portworx。如其他文章所示的一樣,使用Portworx還有許多優點,如EBS 卷被卡在附加狀態時。

一起使用Kops和Portworx的另一個好處是能與AWS的Auto Scaling Groups集成。這預示著Portworx能管理底層EBS池,並且能在升級/縮小/升級操作之後重用以前的EBS卷。

https://dzone.com/articles/kubernetes-and-wordpress-scalability-and-ha

譯者簡介

Ghostcloud(中文名:精靈雲)坐落於成都天府軟體園,是成都高新區重點扶持企業,國內首批從事容器虛擬化研發的企業,是西南地區唯一一家基於Docker的雲計算服務商,為企業級行業客戶提供針對互聯網化、私有雲管理平台、大數據業務基礎架構的平台服務。

Ghostcloud因容器技術而生,以最新容器技術Docker為基礎,為適應不同行業客戶需求,全自主研發了一套調度引擎框架Newben,且全方位適配Kubernetes主流開源調度引擎,也是國內率先實現雙調度引擎的企業,是一流的企業級容器雲服務專家。Ghostcloud推出了企業級容器雲PaaS/CaaS平台,命名為EcOS(EnterpriseContainer Operation System)。Ghostcloud將EcOS平台與微服務/DevOps相融合,運用至企業IT系統的全生命周期的開發、測試、運維及發布流程中,致力於為多個領域企業向「互聯網+」轉型提供針對互聯網化、私有雲管理平台、大數據業務基礎架構的平台服務幫助企業級客戶降低成本、提升效率、簡化運維及產品部署,並提升系統的可靠性和安全性。

閱 讀 推 薦

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 GoDocker 的精彩文章:

TAG:GoDocker |