在 Kubernetes 集群中運行 WordPress
作為一名開發者,我會嘗試留意那些我可能不會每天使用的技術的進步。了解這些技術至關重要,因為它們可能會間接影響到我的工作。比如由 Docker 推動的、近期正在興起的容器化技術,可用於上規模地託管 Web 應用。從技術層面來講,我並不是一個 DevOps,但當我每天構建 Web 應用時,多去留意這些技術如何去發展,會對我有所裨益。
這種進步的一個絕佳的例子,是近一段時間高速發展的容器編排平台。它允許你輕鬆地部署、管理容器化應用,並對它們的規模進行調整。目前看來,容器編排的流行工具有 Kubernetes (來自 Google),Docker Swarm 和 Apache Mesos。如果你想較好的了解上面那些技術以及它們的區別,我推薦你看一下這篇文章。
在這篇文章中,我們將會從一些簡單的操作開始,了解一下 Kubernetes 平台,看看如何將一個 WordPress 網站部署在本地機器上的一個單節點集群中。
安裝 Kubernetes
在 Kubernetes 文檔中有一個很好的互動教程,涵蓋了很多東西。但出於本文的目的,我只會介紹在 MacOS 中 Kuberentes 的安裝和使用。
我們要做的第一件事是在你的本地主機中安裝 Kubernetes。我們將使用一個叫做 MiniKube 的工具,它專門用於在你的機器上方便地設置一個用於測試的 Kubernetes 集群。
根據 Minikube 文檔,在我們開始之前,有一些先決條件。首先要保證你已經安裝了一個 Hypervisor (我將會使用 Virtualbox)。接下來,我們需要安裝 Kubernetes 命令行工具(也就是 kubectl
)。如果你在用 Homebrew,這一步非常簡單,只需要運行命令:
$ brew install kubectl
現在我們可以真正 安裝 Minikube 了:
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.21.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
最後,我們要啟動 Minicube 創建一個虛擬機,來作為我們的單節點 Kubernetes 集群。現在我要說一點:儘管我們在本文中只在本地運行它,但是在真正的伺服器上運行 Kubernetes 集群時,後面提到的大多數概念都會適用。在多節點集群上,「主節點」將負責管理其它工作節點(虛擬機或物理伺服器),並且 Kubernetes 將會在集群中自動進行容器的分發和調度。
$ minikube start --vm-driver=virtualbox
安裝 Helm
現在,本機中應該有一個正在運行的(單節點)Kubernetes 集群了。我們現在可以用任何方式來與 Kubernetes 交互。如果你想現在可以體驗一下,我覺得 kubernetesbyexample.com 可以很好地向你介紹 Kubernetes 的概念和術語。
雖然我們可以手動配置這些東西,但實際上我們將會使用另外的工具,來將我們的 WordPress 應用部署到 Kubernetes 集群中。Helm 被稱為「Kubernetes 的包管理工具」,它可以讓你輕鬆地在你的集群中部署預構建的軟體包,也就是「 圖表 」。你可以把圖表看做一組專為特定應用(如 WordPress)而設計的容器定義和配置。首先我們在本地主機上安裝 Helm:
$ brew install kubernetes-helm
然後我們需要在集群中安裝 Helm。 幸運的是,只需要運行下面的命令就好:
$ helm init
安裝 WordPress
現在 Helm 已經在我們的集群中運行了,我們可以安裝 WordPress 圖表。運行:
$ helm install --namespace wordpress --name wordpress --set serviceType=NodePort stable/wordpress
這條命令將會在容器中安裝並運行 WordPress,並在容器中運行 MariaDB 作為資料庫。它在 Kubernetes 中被稱為「Pod」。一個 Pod 基本上可視為一個或多個應用程序容器和這些容器的一些共享資源(例如存儲卷,網路等)的組合的抽象。
我們需要給這個部署一個名字和一個命名空間,以將它們組織起來並便於查找。我們同樣會將 serviceType
設置為 NodePort
。這一步非常重要,因為在默認設置中,服務類型會被設置為 LoadBalancer
。由於我們的集群現在沒有負載均衡器,所以我們將無法在集群外訪問我們的 WordPress 站點。
在輸出數據的最後一部分,你會注意到一些關於訪問你的 WordPress 站點的有用的命令。運行那些命令,你可以獲取到我們的 WordPress 站點的外部 IP 地址和埠:
$ export NODE_PORT=$(kubectl get --namespace wordpress -o jsonpath="{.spec.ports[0].nodePort}" services wordpress-wordpress)
$ export NODE_IP=$(kubectl get nodes --namespace wordpress -o jsonpath="{.items[0].status.addresses[0].address}")
$ echo http://$NODE_IP:$NODE_PORT/admin
你現在訪問剛剛生成的 URL(忽略 /admin
部分),就可以看到 WordPress 已經在你的 Kubernetes 集群中運行了!
擴展 WordPress
Kubernetes 等服務編排平台的一個偉大之處,在於它將應用的擴展和管理變得易如反掌。我們看一下應用的部署狀態:
$ kubectl get deployments --namespace=wordpress
可以看到,我們有兩個部署,一個是 Mariadb 資料庫,一個是 WordPress 本身。現在,我們假設你的 WordPress 開始承載大量的流量,所以我們想將這些負載分攤在多個實例上。我們可以通過一個簡單的命令來擴展 wordpress-wordpress
部署:
$ kubectl scale --replicas 2 deployments wordpress-wordpress --namespace=wordpress
再次運行 kubectl get deployments
,我們現在應該會看到下面的場景:
你剛剛擴大了你的 WordPress 站點規模!超級簡單,對不對?現在我們有了多個 WordPress 容器,可以在它們之中對流量進行負載均衡。想了解 Kubernetes 擴展的更多信息,參見這篇指南。
高可用
Kubernetes 等平台的的另一大特色在於,它不單單能進行方便的擴展,還可以通過自愈組件來提供高可用性。假設我們的一個 WordPress 部署因為某些原因失效了,那 Kubernetes 會立刻自動替換掉這個部署。我們可以通過刪除我們 WordPress 部署的一個 pod 來模擬這個過程。
首先運行命令,獲取 pod 列表:
$ kubectl get pods --namespace=wordpress
然後刪除其中一個 pod:
$ kubectl delete pod wordpress-wordpress-876183909-jqc8s --namespace=wordpress
如果你再次運行 kubectl get pods
命令,應該會看到 Kubernetes 立刻換上了新的 pod (3l167
)。
更進一步
我們只是簡單了解了 Kubernetes 能完成工作的表面。如果你想深入研究,我建議你查看以下功能:
你在容器平台上運行過 WordPress 嗎?有沒有使用過 Kubernetes(或其它容器編排平台),有沒有什麼好的技巧?你通常會怎麼擴展你的 WordPress 站點?請在評論中告訴我們。
作者簡介:
Gilbert 喜歡構建軟體。從 jQuery 腳本到 WordPress 插件,再到完整的 SaaS 應用程序,Gilbert 一直在創造優雅的軟體。 他粗昂做的最有名的的產品,應該是 Nivo Slider.
via: https://deliciousbrains.com/running-wordpress-kubernetes-cluster/
作者:Gilbert Pellegrom 譯者:StdioA 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive