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-storage
annotations:
openebs.io/cas-type: nsfrwx
cas.openebs.io/config: |
- name: NSFServerType
value: "kernel"
- name: BackendStorageClass
value: "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