WordPress 是專為每個人設計的開源軟件,強調創建網站、博客或應用程序的可訪問性、性能、安全性和易用性。WordPress 是一個基于 PHP 的內容管理系統(CMS),使用 MySQL 作為數據存儲,目前很多網站、電商獨立站、個人博客都采用了WordPress。不過,當用戶訪問量變多的時候,單一服務器很容易出現可用性問題。所以為了補足這一點,就需要建立集群。
本教程面向不熟悉 Kubernetes 的入門級用戶。在本教程中,你將使用 Helm 在 Kubernetes 集群上安裝 WordPress,創建高可用性網站。除了利用 Kubernetes 固有的可擴展性和高可用性之外,這種設置還能通過 Helm 提供簡化的升級和回滾工作流,從而確保 WordPress 的安全。
我們還將配置 NitroPack,這是一個用于代碼精簡、緩存、CDN 和懶加載的插件。
我們將使用外部 MySQL 服務器來抽象數據庫組件,因為它可以是單獨集群或托管服務的一部分,可以提高可用性。
完成本教程所述步驟后,你就可以在 Kubernetes 管理的容器化集群環境中安裝功能齊全的 WordPress,并建立一個更加高可用且安全的網站了。
WordPress 設置圖
目錄
- 概述
- WordPress 設置圖
- 先決條件
- 建立受 DigitalOcean 管理的 Kubernetes 集群(DOKS)
- 安裝和配置 OpenEBS 動態 NFS Provisioner
- 配置 WordPress MySQL 托管數據庫
- 配置 Redis 數據庫
- 配置 Redis 托管數據庫
- 配置 Redis Helm 圖
- 安裝 WordPress
- 部署 Helm 圖
- 確保流量的安全使用 Let's Encrypt 證書
- 安裝 Nginx 入口控制器
- 為 Nginx 配置 DNS 入口控制器
- 安裝證書管理器
- 為 WordPress 配置生產就緒的 TLS 證書
- 啟用 WordPress 監控指標
- 配置 WordPress 插件
- 提高 WordPress 性能
- 配置 NitroPack 插件
- 升級 WordPress
- 結論
前提條件
要完成本教程,你需要:
- Helm,用于管理 WordPress、Nginx Ingress Controller 和 Cert-Manager 的發布和升級。
- Doctl CLI,用于管理 DigitalOcean 資源。
- Kubectl CLI,用于與 Kubernetes API 交互。
- 基本的 Kubernetes 知識。
- 配置一個域名(如 GoDaddy、Cloudflare 等)在你的賬戶中。
在此之前,你也可以閱讀往期文章了解如何在 DigitalOcean 的 Droplet 云主機上一鍵安裝 WordPress。
建立 DigitalOcean Kubernetes 托管集群(DOKS)
在開始教程步驟之前,你需要有一個 DigitalOcean 托管的 Kubernetes 集群(DOKS)。如果你已經配置了一個,可以跳到下一節 - 配置 WordPress MySQL 托管數據庫。
你可以使用以下命令創建新的 DOKS 集群:
doctl k8s cluster create <YOUR_CLUSTER_NAME> \--auto-upgrade=false \--maintenance-window "saturday=21:00" \--node-pool "name=basicnp;size=s-4vcpu-8gb-amd;count=3;tag=cluster2;label=type=basic;auto-scale=true;min-nodes=2;max-nodes=4" \--region nyc1
注意:我們建議使用至少有 2 個工作節點的 DOKS 集群,以減少節點故障時對應用程序的影響。本教程中的示例使用了 3 個工作節點,每個節點 4 CPU/8GB(48 美元/月),自動擴展器最大配置為 2 至 4 個節點。選擇不同的節點類型,你可以從 doctl compute 中查看更多選項。
請訪問 How to Set Up a DigitalOcean Managed Kubernetes Cluster (DOKS) 獲取更多詳情。
安裝和配置 OpenEBS 動態 NFS Provisioner
本節介紹如何使用 Helm 安裝 NFS 配置器。如果你想使用 DigitalOcean Kubernetes 一鍵安裝,請跳過本節,使用 DigitalOcean Kubernetes 1-Click Apps?安裝 NFS 配置器。
每次使用持久化卷(PersistentVolume)作為 Kubernetes 有狀態應用程序的一部分時,都會配置一個新的 DigitalOcean 塊存儲卷。StorageClass 資源會告訴 Kubernetes 可用的底層存儲類型。DigitalOcean 默認使用 "塊存儲"(do-block-storage)。
下面的命令列出了 Kubernetes 集群的可用存儲類:
kubectl get sc
輸出結果類似于:
Output
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
do-block-storage (default) dobs.csi.digitalocean.com Delete Immediate true 24h
DigitalOcean 塊存儲卷(Block Storage Volumes)是由單個節點以讀寫方式(RWO)掛載的。其他節點不能掛載同一個卷。持久卷(PersistentVolume)的數據內容不能被多個 Pod 同時訪問。
水平 Pod 自動擴展(HPA)用于擴展動態 StatefulSet 中的 WordPress Pod,因此 WordPress 需要一個被許多節點(RWX)掛載為讀寫器的卷。
NFS(網絡文件系統)是在塊存儲上提供 RWX 卷的常用解決方案。該服務器在 RWX 模式下提供持久卷申領(PVC),以便多個網絡應用程序能以共享的方式訪問數據。
OpenEBS 動態 NFS Provisioner 允許用戶創建一個 NFS PV,在用戶選擇的后端存儲之上為每個 PV 設置一個新的內核 NFS 實例。
接下來,你將使用以下命令在 Kubernetes 集群上安裝 OpenEBS 動態 NFS Provisioner:
首先,克隆 container-blueprints 倉庫。然后,將目錄更改為你本地副本中的 DOKS-wordpress 子文件夾:
git clone https://github.com/digitalocean/container-blueprints.git
cd container-blueprints/DOKS-wordpress
接下來,添加 Helm 倉庫:
helm repo add openebs-nfs https://openebs.github.io/dynamic-nfs-provisioner
helm repo update
然后,打開并檢查倉庫中提供的 assets/manifests/openEBS-nfs-provisioner-values.yaml
文件:
nfsStorageClass:backendStorageClass: "do-block-storage"
注意:上面顯示的覆蓋值將 backendStorageClass
的默認值更改為 do-block-storage
。請訪問 openebs nfs provisioner helm values 了解完整的 values.yaml
文件和更多詳細信息。
最后,使用 Helm 安裝圖表:
helm install openebs-nfs openebs-nfs/nfs-provisioner --version 0.9.0 \--namespace openebs \--create-namespace \-f "assets/manifests/openEBS-nfs-provisioner-values.yaml"
注意:使用的是特定版本的 Helm 圖表。在本例中,選擇了 0.9.0 版本,該版本對應應用程序的 0.9.0 版本。一般來說,鎖定特定版本是一種好的做法。這有助于獲得可預測的結果,并允許通過 Git 進行版本控制。
你可以通過以下方式驗證 openEBS 的部署狀態:
helm ls -n openebs
輸出結果類似于(注意 STATUS 列的值為 "deployed"):
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
openebs-nfs openebs 1 2022-05-09 10:58:14.388721 +0300 EEST deployed nfs-provisioner-0.9.0 0.9.0
NFS 配置器需要一個塊存儲設備來創建 NFS 服務器所需的磁盤容量。接下來,你將配置 DigitalOcean 提供的默認 Kubernetes Storage Class (do-block-storage
) 作為 NFS 配置器的后端存儲。在這種情況下,任何使用新創建的 Storage Class 的應用程序,都可以在 DigitalOcean 卷上通過 OpenEBS NFS 配置器使用共享存儲(NFS)。
接下來,打開并檢查倉庫中提供的 sc-rwx-values.yaml
文件:
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: rwx-storageannotations: openebs.io/cas-type: nsfrwxcas.openebs.io/config: |- name: NSFServerTypevalue: "kernel"- name: BackendStorageClassvalue: "do-block-storage"
provisioner: openebs.io/nfsrwx
reclaimPolicy: Delete
上述配置的解釋:
provisioner
- 定義了用于配置 PV 的存儲類(例如 openebs.io/nfsrwx)reclaimPolicy
- 動態配置的卷會在用戶刪除相應的 PersistentVolumeClaim 時自動刪除
有關 openEBS 的更多信息,請訪問 OpenEBS 文檔。
通過 kubectl 應用:
kubectl apply -f assets/manifests/sc-rwx-values.yaml
通過執行以下命令驗證是否創建了 StorageClass:
kubectl get sc
輸出結果類似于:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
do-block-storage (default) dobs.csi.digitalocean.com Delete Immediate true 107m
openebs-kernel-nfs openebs.io/nfsrwx Delete Immediate false 84m
rwx-storage openebs.io/nfsrwx Delete Immediate false 84m
現在,你有了一個名為 rwx-storage
的新 StorageClass,可以在 DigitalOcean Block Storage 上動態配置共享卷。
配置 WordPress MySQL 托管數據庫
在本節中,你將創建一個專用的 MySQL 數據庫,例如 DigitalOcean 的托管數據庫用于 WordPress。這是必要的,因為你的 WordPress 安裝將位于 Kubernetes 集群內的單獨服務器上。(可觀看視頻教程了解如何快速配置數據庫)
默認情況下,WordPress Helm 圖表在集群內的單獨 pod 上安裝 MariaDB 并將其配置為默認數據庫。在決定使用托管數據庫還是默認的 MariaDB 之前,你應該考慮以下幾個方面:
- 使用托管數據庫服務時,你只需決定數據庫服務器的初始大小即可。此外,自動化方面也具有吸引力。執行更新、運行遷移和創建備份都是自動完成的。有關托管數據庫的更多信息,請參閱這篇文章。使用托管數據庫會產生額外費用。
- 使用默認的 MariaDB Helm 圖表安裝時,需要注意 DB pods(數據庫應用容器)是臨時的,因此它們可能會經常重啟或失敗。特定的管理任務如備份或擴展需要更多的手動工作和設置來實現這些目標。使用 MariaDB 安裝不會產生任何額外費用。
如果你不想使用外部數據庫,請跳到下一章 - 配置 Redis 數據庫。
首先,創建 MySQL 托管數據庫:
doctl databases create wordpress-mysql --engine mysql --region nyc1 --num-nodes 2 --size db-s-2vcpu-4gb
本教程中的示例使用一個主節點和一個從節點,2 個 CPU/4 GB(100 美元/月)。有關可用大小的列表,請訪問:DigitalOcean API 參考。
輸出結果類似于以下內容(STATE 列應顯示 online):
Output
ID Name Engine Version Number of Nodes Region Status Size
2f0d0969-a8e1-4f94-8b73-2d43c68f8e72 wordpress-mysql-test mysql 8 1 nyc1 online db-s-1vcpu-1gb
要完成 MySQL 的設置,需要數據庫 ID。你可以運行以下命令來打印你的 MySQL 數據庫 ID:
doctl databases list
接下來,創建 WordPress 數據庫用戶:
doctl databases user create 2f0d0969-a8e1-4f94-8b73-2d43c68f8e72 wordpress_user
輸出結果類似于以下內容(密碼將自動生成):
Name Role Password
wordpress_user normal *******
默認情況下,新用戶可以獲得整個數據庫的全部權限。一般來說,最好的安全做法是將新用戶的權限限制在 WordPress 數據庫內。你可以按照 DigitalOcean 提供的如何修改 MySQL 數據庫中的用戶權限指南來完成這項任務。
接下來,創建主要的 WordPress 數據庫:
doctl databases db create 2f0d0969-a8e1-4f94-8b73-2d43c68f8e72 wordpress
輸出結果類似于以下內容(密碼將自動生成):
Name
wordpress
最后,你需要在 MySQL 數據庫和 Kubernetes 集群 (DOKS) 之間設置可信源:
首先,提取 Kubernetes 集群 ID:
doctl kubernetes cluster list
輸出結果類似于以下內容:
Output
ID Name Region Version Auto Upgrade Status Node Pools
c278b4a3-19f0-4de6-b1b2-6d90d94faa3b k8s-cluster nyc1 1.21.10-do.0 false running basic
最后,限制傳入連接:
doctl databases firewalls append 2f0d0969-a8e1-4f94-8b73-2d43c68f8e72 --rule k8s:c278b4a3-19f0-4de6-b1b2-6d90d94faa3b
注意:
2f0d0969-a8e1-4f94-8b73-2d43c68f8e72
:表示數據庫 IDc278b4a3-19f0-4de6-b1b2-6d90d94faa3b
:表示 Kubernetes ID
請訪問如何保護 MySQL 托管數據庫集群了解更多詳細信息。
配置 Redis 數據庫
遠程字典服務器(Redis)是一種內存、持久、鍵值數據庫,也稱為數據結構服務器。Redis 的緩存機制與 MySQL 或 MariaDB 結合使用時,可以加快 WordPress 數據庫查詢的速度。Redis 允許你在內存中緩存和存儲數據,以實現高性能的數據檢索和存儲。使用 Redis,可以將 MySQL 數據庫查詢處理的數據存儲在 Redis 緩存實例中,以便快速檢索。
安裝和配置 Redis 實例有兩種方式。使用 DigitalOcean 的托管數據庫服務或通過 Helm 圖表安裝。以下將探討這兩種選項。
配置 Redis DO 托管數據庫
在本節中,你將使用 DigitalOcean 創建一個 Redis 數據庫。如果不想使用托管數據庫,請跳至下一節 - 配置 Redis Helm 圖。
在決定使用托管數據庫還是 Helm 安裝的數據庫之前,你應該考慮以下幾個方面:
- 使用托管數據庫服務時,你只需決定數據庫服務器的初始大小即可。此外,自動化方面也具有吸引力。執行更新、運行遷移和創建備份都是自動完成的。使用托管數據庫會產生額外費用。
- 使用 Redis Helm 圖表安裝時,需要注意 DB pods(數據庫應用容器)是臨時的,因此它們可能會經常重啟或失敗。特定的管理任務如備份或擴展需要更多的手動工作和設置來實現這些目標。使用 Redis 安裝不會產生任何額外費用。
首先,創建 Redis 托管數據庫:
doctl databases create wordpress-redis --engine redis --region nyc1 --num-nodes 1 --size db-s-1vcpu-1gb
本教程中的示例使用一個節點,1 個 CPU/1 GB(10 美元/月)。有關可用大小的列表,請訪問API 文檔。
輸出結果類似于以下內容(STATE 列應顯示 online):
Output
ID Name Engine Version Number of Nodes Region Status Size
91180998-7fe2-450c-b353-492d8abcddad wordpress-redis redis 6 1 nyc1 creating db-s-1vcpu-1gb
接下來,你需要在 Redis 數據庫和 Kubernetes 集群 (DOKS) 之間設置可信源:
- 首先,提取 Kubernetes 集群 ID:
doctl kubernetes cluster list
輸出結果類似于以下內容:
Output
ID Name Region Version Auto Upgrade Status Node Pools
c278b4a3-19f0-4de6-b1b2-6d90d94faa3b k8s-cluster nyc1 1.21.10-do.0 false running basic
- 最后,限制傳入連接:
doctl databases firewalls append 2f0d0969-a8e1-4f94-8b73-2d43c68f8e72 --rule k8s:c278b4a3-19f0-4de6-b1b2-6d90d94faa3b
請訪問如何保護 Redis 托管數據庫集群了解更多詳細信息。
配置 Redis Helm 圖表
在本節中,你將使用 Bitnami Redis Helm 圖表在 Kubernetes 集群中創建一個 Redis 數據庫。
首先,添加 Helm 倉庫,并列出可用的圖表:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update bitnami
接下來,打開并檢查倉庫中提供的 assets/manifests/redis-values.yaml
文件:
master:persistence:enabled: truestorageClass: rwx-storageaccessModes: ["ReadWriteMany"]size: 5Gi
auth:enabled: truepassword: <YOUR_REDIS_PASSWORD_HERE>architecture: standalone
上述配置的解釋:
master.persistance
塊 - 啟用 Redis 主節點上的持久性,使用 PVC 并將 PV 存儲類設置為之前創建的存儲類auth
塊 - 啟用并設置密碼認證,密碼由用戶設置architecture
- Redis 架構。獨立的 Redis StatefulSet。Redis 主服務指向主節點,可以在此執行讀寫操作。
注意:大多數覆蓋項可以自定義。請訪問 redis helm values 了解更多詳細信息。
最后,使用 Helm 安裝圖表:
helm upgrade redis bitnami/redis \--atomic \--create-namespace \--install \--namespace redis \--version 17.0.5 \--values assets/manifests/redis-values.yaml
使用的是特定版本的 Redis Helm 圖表。在本例中,選擇了 17.0.5 版本,該版本對應 Redis 的 7.0.4 版本。一般來說,鎖定特定版本是一種好的做法。這有助于獲得可預測的結果,并允許通過 Git 進行版本控制。
檢查 Helm 發布狀態:
helm ls -n redis
輸出結果類似于(注意 STATUS 列的值為 "deployed"):
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
redis redis 1 2022-06-02 08:45:38.617726 +0300 EEST deployed redis-17.0.5 7.0.4
驗證 Redis 是否正常運行:
kubectl get all -n redis
輸出結果類似于(所有 Redis pods 應為 UP 和 RUNNING 狀態):
NAME READY STATUS RESTARTS AGE
pod/redis-master-0 1/1 Running 0 2m24sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/redis-headless ClusterIP None <none> 6379/TCP 2m25s
service/redis-master ClusterIP 10.245.14.50 <none> 6379/TCP 2m25sNAME READY AGE
statefulset.apps/redis-master 1/1 2m26s
安裝 WordPress
部署 Helm 圖表
在本節中,你將使用 Bitnami WordPress Helm 圖表在 Kubernetes 集群中安裝 WordPress。
最重要的 Helm 圖表值是:
externalDatabase
- 配置 WordPress 使用外部數據庫(例如 DigitalOcean 托管的 MySQL 數據庫)。mariadb.enabled
- 配置 WordPress 使用集群內數據庫(例如 MariaDB)。
首先,添加 Helm 倉庫,并列出可用的圖表:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update bitnami
接下來,打開并檢查倉庫中提供的 assets/manifests/wordpress-values.yaml
文件:
# WordPress 服務類型
service:type: ClusterIP# 啟用使用持久卷聲明的持久性
persistence:enabled: truestorageClassName: rwx-storageaccessModes: ["ReadWriteMany"]size: 5GivolumePermissions:enabled: true# Prometheus 導出器 / 指標配置
metrics:enabled: false# 允許的自動更新級別。允許值:major, minor 或 none。
wordpressAutoUpdateLevel: minor# 用于生成 WordPress URL 的方案
wordpressScheme: https# WordPress 憑據
wordpressUsername: <YOUR_WORDPRESS_USER_NAME_HERE>
wordpressPassword: <YOUR_WORDPRESS_USER_PASSSWORD_HERE># 外部數據庫詳細信息
externalDatabase:host: <YOUR_WORDPRESS_MYSQL_DB_HOST_HERE>port: 25060user: <YOUR_WORDPRESS_MYSQL_DB_USER_NAME_HERE>password: <YOUR_WORDPRESS_MYSQL_DB_USER_PASSWORD_HERE>database: <YOUR_WORDPRESS_MYSQL_DB_NAME_HERE># 禁用 MariaDB
mariadb:enabled: falsewordpressExtraConfigContent: |define( 'WP_REDIS_SCHEME', '<REDIS_SCHEME>' );define( 'WP_REDIS_HOST', '<REDIS_HOST>' );define( 'WP_REDIS_PORT', <REDIS_PORT> );define( 'WP_REDIS_PASSWORD', '<REDIS_PASSWORD>');define( 'WP_REDIS_DATABASE', 0 );
大多數覆蓋項可以自定義。請訪問 wordpress helm values 了解更多詳細信息。使用托管 Redis DO 數據庫時,WP_REDIS_SCHEME
參數需要設置為 tls
,而使用 helm 安裝的 Redis 數據庫時需要設置為 tcp
。對于 helm 安裝的 Redis 數據庫,可以通過以下命令獲取 WP_REDIS_HOST
參數值:
kubectl exec -i -t <REDIS_POD> --namespace redis -- hostname -i
最后,使用 Helm 安裝圖表:
helm upgrade wordpress bitnami/wordpress \--atomic \--create-namespace \--install \--namespace wordpress \--version 15.0.11 \--values assets/manifests/wordpress-values.yaml
使用的是特定版本的 WordPress Helm 圖表。在本例中,選擇了 15.0.11 版本,該版本對應 WordPress 的 6.0.1 版本。一般來說,鎖定特定版本是一種好的做法。這有助于獲得可預測的結果,并允許通過 Git 進行版本控制。
檢查 Helm 發布狀態:
helm ls -n wordpress
輸出結果類似于(注意 STATUS 列的值為 "deployed"):
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
wordpress wordpress 1 2022-03-22 14:22:18.146474 +0200 EET deployed wordpress-15.0.11 6.0.1
驗證 WordPress 是否正常運行:
kubectl get all -n wordpress
輸出結果類似于(所有 WordPress pods 應為 UP 和 RUNNING 狀態):
NAME READY STATUS RESTARTS AGE
pod/wordpress-6f55c9ffbd-4frrh 1/1 Running 0 23hNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/wordpress ClusterIP 10.245.36.237 <none> 80/TCP,443/TCP 23hNAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/wordpress 1/1 1 1 23hNAME DESIRED CURRENT READY AGE
replicaset.apps/wordpress-6f55c9ffbd 1 1 1 23h
驗證 wordpress
命名空間下創建的 PVC 和 openebs
命名空間下關聯的 OpenEBS 卷:
kubectl get pvc -A
輸出結果類似于(注意 WordPress PVC 的 RWX 訪問模式,以及之前通過 OpenEBS NFS provisioner 定義的新存儲類):
NAMESPACE NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
openebs nfs-pvc-2b898be6-19f4-4e52-ab9b-10e73ce7d82f Bound pvc-b253c0eb-b02b-46a6-ae88-9a7dd2b71377 5Gi RWO do-block-storage 10m
openebs nfs-pvc-4ce1c2a8-ee65-420f-a722-50f4e50c60a7 Bound pvc-2f2c9dd8-807d-4919-aac1-ab1af69e24c7 5Gi RWO do-block-storage 3m22s
redis redis-data-redis-master-0 Bound pvc-2b898be6-19f4-4e52-ab9b-10e73ce7d82f 5Gi RWX rwx-storage 10m
wordpress wordpress Bound pvc-4ce1c2a8-ee65-420f-a722-50f4e50c60a7 5Gi RWX rwx-storage 3m22s
驗證集群中創建的關聯 PV:
kubectl get pv
輸出結果類似于:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-2b898be6-19f4-4e52-ab9b-10e73ce7d82f 5Gi RWX Delete Bound redis/redis-data-redis-master-0 rwx-storage 12m
pvc-2f2c9dd8-807d-4919-aac1-ab1af69e24c7 5Gi RWO Delete Bound openebs/nfs-pvc-4ce1c2a8-ee65-420f-a722-50f4e50c60a7 do-block-storage 4m48s
pvc-4ce1c2a8-ee65-420f-a722-50f4e50c60a7 5Gi RWX Delete Bound wordpress/wordpress rwx-storage 4m48s
pvc-b253c0eb-b02b-46a6-ae88-9a7dd2b71377 5Gi RWO Delete Bound openebs/nfs-pvc-2b898be6-19f4-4e52-ab9b-10e73ce7d82f do-block-storage 12m
你還可以創建其他 pods 以展示 NFS provisioner 的能力,方法是打開 wordpress-values.yaml
文件并添加 replicaCount
行,設置為所需的副本數。
...
replicaCount: 3
...
使用 helm upgrade
命令應用更改:
helm upgrade wordpress bitnami/wordpress \--atomic \--create-namespace \--install \--namespace wordpress \--version 15.0.11 \--values assets/manifests/wordpress-values.yaml
驗證更改是否已應用。注意增加的副本數和 pods 數量:
kubectl get all -n wordpress
輸出結果類似于:
NAME READY STATUS RESTARTS AGE
pod/wordpress-5f5f4cf94c-d7mqb 1/1 Running 0 2m58s
pod/wordpress-5f5f4cf94c-qkxdq 1/1 Running 0 3m38s
pod/wordpress-5f5f4cf94c-zf46h 1/1 Running 0 87sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/wordpress ClusterIP 10.245.151.58 <none> 80/TCP,443/TCP 35mNAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/wordpress 3/3 3 3 35mNAME DESIRED CURRENT READY AGE
replicaset.apps/wordpress-5f5f4cf94c 3 3 3 35m
replicaset.apps/wordpress-798789f994 0 0 0 19m
我們還可以檢查 pods 部署的位置:
kubectl get all -n wordpress -o wide
輸出結果類似于(注意 pods 部署在不同的節點上):
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/wordpress-5f5f4cf94c-d7mqb 1/1 Running 0 4m7s 10.244.0.206 basicnp-cwxop <none> <none>
pod/wordpress-5f5f4cf94c-qkxdq 1/1 Running 0 4m47s 10.244.1.84 basicnp-cwxol <none> <none>
pod/wordpress-5f5f4cf94c-zf46h 1/1 Running 0 2m36s 10.244.0.194 basicnp-cwxop <none> <none>
使用 Let's Encrypt 證書確保流量安全
Bitnami WordPress Helm?圖表通過 cert-manager 內置了對 Ingress 路由和證書管理的支持。這使得使用包括 Let's Encrypt 在內的各種證書提供商的證書來配置 TLS 支持變得容易。
安裝 Nginx Ingress Controller
首先,添加 Helm 倉庫,并列出可用的圖表:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update ingress-nginx
接下來,使用 Helm 安裝 Nginx Ingress Controller:
helm install ingress-nginx ingress-nginx/ingress-nginx --version 4.1.3 \--namespace ingress-nginx \--create-namespace
接下來,通過運行以下命令檢查 Helm 安裝是否成功:
helm ls -n ingress-nginx
輸出結果類似于(注意 STATUS 列的值為 "deployed"):
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ingress-nginx ingress-nginx 1 2022-02-14 12:04:06.670028 +0200 EET deployed ingress-nginx-4.1.3 1.2.1
最后,列出 DigitalOcean 賬戶中的所有負載均衡器資源,并打印 IP、ID、名稱和狀態:
doctl compute load-balancer list --format IP,ID,Name,Status
輸出結果類似于(應該包含為 Nginx Ingress Controller 創建的新負載均衡器資源,狀態應為健康):
IP ID Name Status
45.55.107.209 0471a318-a98d-49e3-aaa1-ccd855831447 acdc25c5cfd404fd68cd103be95af8ae active
為 Nginx Ingress Controller 配置 DNS
在此步驟中,你將使用你擁有的域名在 DigitalOcean 賬戶中配置 DNS。然后,你將為 WordPress 創建域名 A 記錄。
首先,請發出以下命令以創建新域(例如 bond-0.co):
doctl compute domain create bond-0.co
注意:你需要確保你的域名注冊商已配置為指向 DigitalOcean 名稱服務器。請訪問 如何設置 DigitalOcean 名稱服務器 獲取更多信息。
接下來,你將為 WordPress 應用程序添加所需的 A 記錄。首先,需要確定由 Nginx 部署創建的負載均衡器外部 IP:
kubectl get svc -n ingress-nginx
輸出結果類似于(注意 ingress-nginx-controller 服務的 EXTERNAL-IP 列值):
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.245.109.87 45.55.107.209 80:32667/TCP,443:31663/TCP 25h
ingress-nginx-controller-admission ClusterIP 10.245.90.207 <none> 443/TCP 25h
然后,添加記錄(請相應替換 <>
占位符)。你可以根據需要更改 TTL 值:
doctl compute domain records create bond-0.co --record-type "A" --record-name "wordpress" --record-data "<YOUR_LB_IP_ADDRESS>" --record-ttl "30"
提示:如果你的賬戶中只有一個負載均衡器,請使用以下代碼片段:
LOAD_BALANCER_IP=$(doctl compute load-balancer list --format IP --no-header)
doctl compute domain records create bond-0.co --record-type "A" --record-name "wordpress" --record-data "$LOAD_BALANCER_IP" --record-ttl "30"
觀察和結果:
列出 bond-0.co 域的可用記錄:
doctl compute domain records list bond-0.co
輸出結果類似于:
Output
ID Type Name Data Priority Port TTL Weight
311452740 SOA @ 1800 0 0 1800 0
311452742 NS @ ns1.digitalocean.com 0 0 1800 0
311452743 NS @ ns2.digitalocean.com 0 0 1800 0
311452744 NS @ ns3.digitalocean.com 0 0 1800 0
311453305 A wordpress 45.55.107.209 0 0 30 0
安裝 Cert-Manager
首先,添加 Jetstack Helm 倉庫并列出可用的圖表:
helm repo add jetstack https://charts.jetstack.io
helm repo update jetstack
接下來,使用 Helm 安裝 Cert-Manager:
helm install cert-manager jetstack/cert-manager --version 1.8.0 \--namespace cert-manager \--create-namespace \--set installCRDs=true
最后,通過運行以下命令檢查 Cert-Manager 安裝是否成功:
helm ls -n cert-manager
輸出結果類似于(STATUS 列應顯示 "deployed"):
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
cert-manager cert-manager 1 2021-10-20 12:13:05.124264 +0300 EEST deployed cert-manager-v1.8.0 v1.8.0
為 WordPress 配置生產就緒的 TLS 證書
首先,需要一個集群頒發者來獲取最終的 TLS 證書。打開并檢查倉庫中提供的 assets/manifests/letsencrypt-issuer-values-values.yaml
文件:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:name: letsencrypt-prodnamespace: wordpress
spec:acme:# 你必須將此電子郵件地址替換為你自己的。# Let's Encrypt 將使用此地址與您聯系有關證書到期和賬戶相關的問題。email: <YOUR-EMAIL-HERE>server: https://acme-v02.api.letsencrypt.org/directoryprivateKeySecretRef:# 用于存儲賬戶私鑰的 Secret 資源。name: prod-issuer-account-key# 添加一個單一的挑戰解決器,使用 nginx 進行 HTTP01 驗證solvers:- http01:ingress:class: nginx
通過 kubectl 應用:
kubectl apply -f assets/manifests/letsencrypt-issuer-values.yaml
為了確保 WordPress 流量安全,打開之前創建的 wordpress-values.yaml
文件,并在末尾添加以下設置:
# 啟用 WordPress 的 Ingress 記錄生成
ingress:enabled: truecertManager: truetls: falsehostname: <YOUR_WORDPRESS_DOMAIN_HERE>annotations:kubernetes.io/ingress.class: "nginx"cert-manager.io/cluster-issuer: "letsencrypt-prod"extraTls:- hosts:- <YOUR_WORDPRESS_DOMAIN_HERE>secretName: wordpress.local-tls
通過 helm 升級:
helm upgrade wordpress bitnami/wordpress \--create-namespace \--namespace wordpress \--version 15.0.11 \--timeout 10m0s \--values assets/manifests/wordpress-values.yaml
這會自動通過 cert-manager 創建一個證書。然后,你可以通過運行以下命令驗證你是否已成功獲取證書:
kubectl get certificate -n wordpress wordpress.local-tls
如果成功,輸出的 READY 列應顯示 True:
NAME READY SECRET AGE
wordpress.local-tls True wordpress.local-tls 24h
現在,你可以使用之前配置的域名訪問 WordPress。你將通過安裝過程的引導。
啟用 WordPress 監控指標
在本節中,你將學習如何啟用指標來監控 WordPress 實例。
首先,打開之前在本教程中創建的 wordpress-values.yaml
文件,并將 metrics.enabled
字段設置為 true:
# Prometheus 導出器 / 指標配置
metrics:enabled: true
使用 Helm 應用更改:
helm upgrade wordpress bitnami/wordpress \--create-namespace \--namespace wordpress \--version 15.0.11 \--timeout 10m0s \--values assets/manifests/wordpress-values.yaml
接下來,端口轉發 wordpress 服務以檢查可用的指標:
kubectl port-forward --namespace wordpress svc/wordpress-metrics 9150:9150
現在,打開 Web 瀏覽器并導航到 localhost:9150/metrics
,查看所有 WordPress 指標。
最后,你需要配置 Grafana 和 Prometheus 來可視化你的新 WordPress 實例暴露的指標。請訪問 如何安裝 Prometheus 監控堆棧 了解如何安裝和配置 Grafana 和 Prometheus。
配置 WordPress 插件
插件是 WordPress 網站的構建模塊。無論你是需要添加聯系表單、改善 SEO、提高網站速度、創建在線商店,還是提供電子郵件訂閱等功能,插件都能為你的網站帶來重要功能。
以下是一些推薦的插件:
- Contact Form by WPForms:允許你為你的網站創建精美的聯系表單、反饋表單、訂閱表單、付款表單以及其他類型的表單。
- MonsterInsights:是 WordPress 上最好的 Google Analytics 插件。它可以“正確”地將你的網站與 Google Analytics 連接起來,這樣你就可以清楚地看到人們如何發現和使用你的網站。
- All in One SEO:幫助你從搜索引擎獲得更多的訪問量。雖然 WordPress 本身是 SEO 友好的,但使用 SEO 最佳實踐可以大幅增加你的網站流量。
- SeedProd:是 WordPress 上最好的拖放式頁面生成器。它允許你輕松定制網站設計,并創建自定義頁面布局,而無需編寫任何代碼。
- LiteSpeed Cache:是一款多功能網站加速插件,具有獨有的服務器級緩存和優化功能集合。
- UpdraftPlus:簡化了備份和恢復。將文件和數據庫備份到云端,并一鍵恢復。
- Query Monitor:WordPress 的開發者工具面板。它可以調試數據庫查詢、PHP 錯誤、鉤子和操作。
更多插件請訪問 WordPress 插件。
提高 WordPress 性能
CDN(內容分發網絡)是加快 WordPress 網站速度的一種簡單方法。CDN 是一種服務器設置,通過優化媒體文件的傳輸請求來提高網頁的加載速度。當訪問者遠離服務器位置時,大多數網站會面臨延遲問題。使用 CDN 可以通過在提供靜態內容(如圖像、CSS、JavaScript 和視頻流)時卸載 Web 服務器來加快內容交付速度。緩存靜態內容的另一個好處是最小化延遲。CDN 是優化網站并改善全球用戶體驗的可靠解決方案。
配置 NitroPack 插件
NitroPack 是一款用于優化網站速度和性能的插件。
接下來,你將為你的 WordPress 實例配置 NitroPack 插件。
注意:通過 WordPress Helm 圖表值文件(wordpress-values.yaml)配置的管理員密碼在嘗試登錄 WordPress 管理員控制臺時會失敗。要更改密碼,你需要連接到數據庫并重置它。首先,如果你不熟悉 DigitalOcean 管理的數據庫,請閱讀 如何連接到 MySQL 數據庫集群。然后,按照 WordPress 支持網站上的 重置 WordPress 用戶密碼 文章進行操作。
請按照以下步驟為你的 WordPress 實例配置 NitroPack 插件:
- 通過以下鏈接在你的 Web 瀏覽器中打開 WordPress 安裝的管理員控制臺(確保相應替換
<YOUR_WORDPRESS_DOMAIN_HERE>
占位符):
https://<YOUR_WORDPRESS_DOMAIN_HERE>/wp-admin
- 當被要求時,請使用 WordPress 管理員憑據登錄。
- 點擊插件菜單項,然后打開“添加新”子菜單。
- 搜索 NitroPack 插件,然后在結果頁面中點擊“立即安裝”按鈕。安裝完成后,點擊“激活”按鈕。你應該能看到插件添加到你的插件列表中。
- 點擊插件名稱下的設置鏈接。在接下來的頁面中,點擊“連接到 NitroPack”按鈕。接下來,你將被重定向到登錄或創建一個新的 NitroPack 賬戶。
- NitroPack.io 儀表板頁面應打開,顯示與計劃、優化頁面等相關的信息。
接下來,請按照以下步驟將你的網站與 NitroPack 連接:
- 導航至 NitroPack,使用配置插件時創建的賬戶登錄。
- 點擊“添加新網站”菜單項,然后填寫網站 URL 和網站名稱。現在,點擊“免費訂閱”選項,然后點擊“繼續”按鈕。
- 如果你的域名托管在 Cloudflare 上,你將被提示將你的 Cloudflare 賬戶與 NitroPack 賬戶連接。
- 你應該可以看到儀表板上的緩存信息。
注意:安裝 NitroPack 后你可能會看到以下信息:Could not turn on the WP_CACHE constant in wp-config.php.
這是由于 wp-config.php 文件的權限限制。要解決此問題,你需要使用 kubectl SSH 進入 WordPress 容器:
kubectl exec --stdin --tty <your_wordpress_pod> -n wordpress -- /bin/bash
導航到容器內的 /bitnami/wordpress
目錄并運行以下命令更改權限:
chmod 0644 wp-config.php
重啟插件主頁應解決該錯誤。
你還可以查看這篇文章了解 NitroPack 是否正在為訪問者提供優化頁面。
配置 Cloudflare
Cloudflare 是一家提供內容分發網絡(CDN)、DNS、DDoS 保護和安全服務的公司。Cloudflare 是加快和增強 WordPress 網站安全性的好解決方案。
注意:配置此項需要一個 Cloudflare 賬戶。如果你沒有,請訪問 Cloudflare 網站 并注冊一個免費賬戶。如果 WordPress 安裝是使用其他注冊商(如 GoDaddy)購買的域名配置的,你需要將其自定義名稱服務器更改為指向 Cloudflare 名稱服務器。
請按照以下步驟配置 Cloudflare 以配合你的 WordPress 網站:
- 使用你的賬戶登錄 Cloudflare 儀表板,并點擊“+添加站點”。
- 輸入 WordPress 網站的域名,然后點擊“添加站點”按鈕。
- 在計劃選擇頁面中,點擊“免費計劃”下的“開始使用”按鈕。
- 在“查看 DNS 記錄”頁面,點擊“添加記錄”按鈕并添加 A 記錄。
- 為記錄選擇一個名稱,并確保輸入的 IPv4 地址是 DigitalOcean 負載均衡器的地址,然后點擊“繼續”按鈕。
- 在下一頁,你將被要求刪除域名注冊商中的任何自定義名稱服務器,并添加 Cloudflare 的名稱服務器。使用你的管理員賬戶登錄域名注冊商并更改自定義名稱服務器。
- 點擊“完成,檢查名稱服務器”按鈕。
- 在下一頁,Cloudflare 提供了一些配置建議,可以跳過,稍后處理。點擊“跳過建議”鏈接。
當站點在 Cloudflare 上激活時,將發送電子郵件通知你。在 Cloudflare 賬戶中,你可以查看分析頁面,獲取有關 WordPress 網站的 Web 流量信息。
處理名稱服務器更新可能需要最多 24 小時完成。
配置 Redis 對象緩存
WordPress 會進行多次 MySQL 查詢,而 Redis 對象緩存可以優化 WordPress 數據庫的使用。Redis 對象可用于存儲發送到 MySQL 服務器的特定查詢的請求輸出緩存。
接下來,你將為你的 WordPress 實例配置 Redis 對象緩存插件。
請按照以下步驟配置 Redis 對象緩存,使其與你的 WordPress 網站配合使用:
- 在瀏覽器中通過以下鏈接打開 WordPress 安裝的管理員控制面板(確保相應替換
<YOUR_WORDPRESS_DOMAIN_HERE>
占位符):
plaintext https://<YOUR_WORDPRESS_DOMAIN_HERE>/wp-admin
- 當被要求時,請使用 WordPress 管理員憑據登錄。
- 點擊插件菜單項,然后打開“添加新”子菜單。
- 搜索 Redis 對象緩存插件,然后在結果頁面中點擊“立即安裝”按鈕。安裝完成后,點擊“激活”按鈕。你應該能看到插件概述頁面。
- 點擊“啟用對象緩存”按鈕。插件應連接到 Redis 集群,并顯示“已連接”狀態。
升級 WordPress
由于 WordPress 如此受歡迎,它經常成為惡意利用的目標,因此,保持它的最新版本是非常重要的。你可以通過 helm 升級命令升級 WordPress。
首先,更新 helm 倉庫:
helm repo update
接下來,將 WordPress 升級到新版本:
helm upgrade wordpress bitnami/wordpress \--atomic \--create-namespace \--install \--namespace wordpress \--version <WORDPRESS_NEW_VERSION> \--timeout 10m0s \--values assets/manifests/wordpress-values.yaml
將 <WORDPRESS_NEW_VERSION>
替換為新版本號。
結論
在本指南中,你學習了如何使用 Helm 和外部 MySQL 數據庫,以 Kubernetes 方式安裝 WordPress。你還學習了如何將 WordPress 升級到新版本,以及在出錯時如何回滾到之前的版本。
如果你想了解有關 Kubernetes 和 Helm 的更多信息,請查看我們社區頁面的 DO Kubernetes 部分。
感謝你與 DigitalOcean 社區一起學習。查看我們的 計算、存儲、負載均衡、DDoS 和 托管數據庫 產品,了解更多產品信息。中國區用戶需要技術支持,或需要咨詢更多產品方案或場景,比如程序化廣告、跨境電商,可聯系 DigitalOcean 中國區獨家戰略合作伙伴卓普云。