应对网站流量激增:使用 Helm 在 Kubernetes 集群上部署 WordPress 网站

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
  • 结论

前提条件

要完成本教程,你需要:

  1. Helm,用于管理 WordPress、Nginx Ingress Controller 和 Cert-Manager 的发布和升级。
  2. Doctl CLI,用于管理 DigitalOcean 资源。
  3. Kubectl CLI,用于与 Kubernetes API 交互。
  4. 基本的 Kubernetes 知识
  5. 配置一个域名(如 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   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:表示数据库 ID
  • c278b4a3-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) 之间设置可信源:

  1. 首先,提取 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
  1. 最后,限制传入连接:
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: true
    storageClass: rwx-storage
    accessModes: ["ReadWriteMany"]
    size: 5Gi
auth:
  enabled: true
  password: <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          2m24s

NAME                     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   2m25s

NAME                            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: true
  storageClassName: rwx-storage
  accessModes: ["ReadWriteMany"]
  size: 5Gi

volumePermissions:
  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: 25060
  user: <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: false

wordpressExtraConfigContent: |
    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          23h

NAME                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/wordpress   ClusterIP   10.245.36.237   <none>        80/TCP,443/TCP   23h

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/wordpress   1/1     1            1           23h

NAME                                   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          87s

NAME                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S

)          AGE
service/wordpress   ClusterIP   10.245.151.58   <none>        80/TCP,443/TCP   35m

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/wordpress   3/3     3            3           35m

NAME                                   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-prod
  namespace: wordpress
spec:
  acme:
    # 你必须将此电子邮件地址替换为你自己的。
    # Let's Encrypt 将使用此地址与您联系有关证书到期和账户相关的问题。
    email:  <YOUR-EMAIL-HERE>
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      # 用于存储账户私钥的 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: true
  certManager: true
  tls: false
  hostname: <YOUR_WORDPRESS_DOMAIN_HERE>
  annotations:
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer: "let

sencrypt-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 插件:

  1. 通过以下链接在你的 Web 浏览器中打开 WordPress 安装的管理员控制台(确保相应替换 <YOUR_WORDPRESS_DOMAIN_HERE> 占位符):
https://<YOUR_WORDPRESS_DOMAIN_HERE>/wp-admin 
  1. 当被要求时,请使用 WordPress 管理员凭据登录。
  1. 点击插件菜单项,然后打开“添加新”子菜单。
  2. 搜索 NitroPack 插件,然后在结果页面中点击“立即安装”按钮。安装完成后,点击“激活”按钮。你应该能看到插件添加到你的插件列表中。
  3. 点击插件名称下的设置链接。在接下来的页面中,点击“连接到 NitroPack”按钮。接下来,你将被重定向到登录或创建一个新的 NitroPack 账户。
  4. NitroPack.io 仪表板页面应打开,显示与计划、优化页面等相关的信息。

接下来,请按照以下步骤将你的网站与 NitroPack 连接:

  1. 导航至 NitroPack,使用配置插件时创建的账户登录。
  2. 点击“添加新网站”菜单项,然后填写网站 URL 和网站名称。现在,点击“免费订阅”选项,然后点击“继续”按钮。
  3. 如果你的域名托管在 Cloudflare 上,你将被提示将你的 Cloudflare 账户与 NitroPack 账户连接。
  4. 你应该可以看到仪表板上的缓存信息。

注意:安装 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 网站:

  1. 使用你的账户登录 Cloudflare 仪表板,并点击“+添加站点”。
  2. 输入 WordPress 网站的域名,然后点击“添加站点”按钮。
  3. 在计划选择页面中,点击“免费计划”下的“开始使用”按钮。
  4. 在“查看 DNS 记录”页面,点击“添加记录”按钮并添加 A 记录。
  5. 为记录选择一个名称,并确保输入的 IPv4 地址是 DigitalOcean 负载均衡器的地址,然后点击“继续”按钮。
  6. 在下一页,你将被要求删除域名注册商中的任何自定义名称服务器,并添加 Cloudflare 的名称服务器。使用你的管理员账户登录域名注册商并更改自定义名称服务器。
  7. 点击“完成,检查名称服务器”按钮。
  8. 在下一页,Cloudflare 提供了一些配置建议,可以跳过,稍后处理。点击“跳过建议”链接。

当站点在 Cloudflare 上激活时,将发送电子邮件通知你。在 Cloudflare 账户中,你可以查看分析页面,获取有关 WordPress 网站的 Web 流量信息。

处理名称服务器更新可能需要最多 24 小时完成。

配置 Redis 对象缓存

WordPress 会进行多次 MySQL 查询,而 Redis 对象缓存可以优化 WordPress 数据库的使用。Redis 对象可用于存储发送到 MySQL 服务器的特定查询的请求输出缓存。

接下来,你将为你的 WordPress 实例配置 Redis 对象缓存插件。

请按照以下步骤配置 Redis 对象缓存,使其与你的 WordPress 网站配合使用:

  1. 在浏览器中通过以下链接打开 WordPress 安装的管理员控制面板(确保相应替换 <YOUR_WORDPRESS_DOMAIN_HERE> 占位符):

plaintext https://<YOUR_WORDPRESS_DOMAIN_HERE>/wp-admin

  1. 当被要求时,请使用 WordPress 管理员凭据登录。
  2. 点击插件菜单项,然后打开“添加新”子菜单。
  3. 搜索 Redis 对象缓存插件,然后在结果页面中点击“立即安装”按钮。安装完成后,点击“激活”按钮。你应该能看到插件概述页面。
  4. 点击“启用对象缓存”按钮。插件应连接到 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 中国区独家战略合作伙伴卓普云