教程:在 Kubernetes 集群上部署 WordPress 网站

教程:在 Kubernetes 集群上部署 WordPress 网站
WordPress 是专为每个人设计的开源软件,强调创建网站、博客或应用程序的可访问性、性能、安全性和易用性。WordPress 是一个基于 PHP 的内

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 配置程序配置WordPress MySQL 托管数据库配置Redis 数据库配置Redis 托管数据库配置Redis Helm 图WordPress 安装部署Helm 图保护流量入门加密证书安装Nginx Ingress 控制器为Nginx 配置DNS 安装Ingress 控制器证书管理器为WordPress 配置生产就绪TLS 证书启用WordPress 监控指标WordPress 配置WordPress 插件以提高NitroPack 的性能配置插件升级WordPress 结论

前提条件

要完成本教程,您将需要:

Helm 用于管理WordPress、Nginx Ingress Controller 和Cert-Manager 的发布和升级。用于管理DigitalOcean 资源的Doctl CLI。 Kubectl CLI 用于与Kubernetes API 交互。 Kubernetes 基础知识。在您的帐户中配置域名(GoDaddy、Cloudflare 等)。

在此之前,您还可以阅读我们之前的文章,了解如何在DigitalOcean的Droplet云主机上一键安装WordPress。

建立 DigitalOcean Kubernetes 托管集群(DOKS)

在开始教程步骤之前,您需要一个托管在DigitalOcean 上的Kubernetes 集群(DOKS)。如果您已经配置它,请跳到下一部分,配置WordPress MySQL 管理数据库。

您可以使用以下命令创建新的DOKS 集群:

doctl k8s 集群创建YOUR_CLUSTER_NAME \\

–自动升级=假\\

–维护窗口\’星期六=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=四\’\\

— 地区nyc1

注意:我们建议使用至少具有两个工作节点的DOKS 集群,以减少节点故障时对应用程序的影响。本教程中的示例使用3 个工作节点,每个节点有4 个CPU/8GB(48 美元/月),以及最多2-4 个节点的自动缩放器配置。如果您选择不同的节点类型,doctlcompute将显示更多选项。

有关更多信息,请参阅如何设置DigitalOcean 管理的Kubernetes 集群(DOKS)。

安装和配置 OpenEBS 动态 NFS Provisioner

本节介绍如何使用Helm 安装NFS 配置器。如果您更喜欢DigitalOcean Kubernetes 1-Click 安装,请跳过本节并使用DigitalOcean Kubernetes 1-Click 应用程序安装NFS 配置器。

每次使用持久卷(PersistentVolume) 作为Kubernetes 有状态应用程序的一部分时,都会配置一个新的DigitalOcean 块存储卷。 StorageClass 资源告诉Kubernetes 可用的底层存储类型。 DigitalOcean 默认使用“do-block-storage”。

以下命令列出了Kubernetes 集群的可用存储类。

kubectl 获取sc

输出应如下所示:

输出

名称提供商回收策略卷绑定模式允许卷扩展年龄

do-block-storage (默认) dobs.csi.digitalocean.com 立即删除true 24h

DigitalOcean 块存储卷由单个节点以读/写(RWO) 方式安装。其他节点无法挂载同一卷。持久卷(PersistentVolume)的数据内容不能同时被多个Pod 访问。

水平Pod 自动缩放(HPA) 用于缩放动态StatefulSet 中的WordPress Pod,因此WordPress 需要由许多节点(RWX) 作为读取器/写入器安装的卷。

NFS(网络文件系统)是一种在块存储上提供RWX 卷的流行解决方案。服务器提供RWX模式的持久卷声明(PVC),允许多个网络应用程序以共享的方式访问数据。

OpenEBS 动态NFS 配置程序允许用户创建NFS PV,并为用户选择的后端存储上的每个PV 提供新的内核NFS 实例。

接下来,使用以下命令在Kubernetes 集群上安装OpenEBS 动态NFS 配置程序:

首先,克隆容器蓝图存储库。接下来,将目录更改为本地副本的DOKS-wordpress 子文件夹。

git 克隆https://github.com/digitalocean/container-blueprints.git

cd 容器-blueprint/DOKS-wordpress

接下来,添加Helm 存储库。

添加Helm 存储库openebs-nfs https://openebs.github.io/dynamic-nfs-provisioner

更新helm 存储库

接下来,打开并检查存储库中的asset/manifests/openEBS-nfs-provisioner-values.yaml 文件。

nfs 存储类别:

backendStorageClass: \’do-block-storage\’

注意:上面的覆盖值将backendStorageClass 的默认值更改为do-block-storage。有关完整的value.yaml 文件和更多信息,请参阅openebs nfs 配置程序helm 值。

最后,使用Helm 安装图表。

helm 安装openebs-nfs openebs-nfs/nfs-provisioner –版本0.9.0 \\

–命名空间openebs \\

–创建命名空间\\

-f \’资产/清单/openEBS-nfs-provisioner-values.yaml\’

注意:使用特定版本的Helm 图表。在本示例中,选择版本0.9.0。这对应于应用程序的0.9.0 版本。一般来说,锁定特定版本是个好主意。这提供了可预测的结果并允许通过Git 进行版本控制。

您可以通过以下方式查看openEBS部署状态:

helm ls -n openebs

输出应如下所示(请注意,STATUS 列的值为“Deployed”):

名称命名空间修订更新状态图表应用程序版本

openebs-nfs openebs 1 2022-05-09 10:58:14.388721 +0300 EEST 部署nfs-provisioner-0.9.0 0.9.0

NFS 配置器需要块存储设备来为NFS 服务器创建所需的磁盘空间。接下来,在NFS 配置器中将DigitalOcean 提供的默认Kubernetes 存储类(do-block-storage)配置为后端存储。在这种情况下,使用新创建的存储类的应用程序可以通过OpenEBS NFS 配置器使用DigitalOcean 卷上的共享存储(NFS)。

接下来,打开并检查存储库中的sc-rwx-values.yaml 文件。

apiVersion: storage.k8s.io/v1

kind:存储类

元数据:

name: rwx-存储

注释:

openebs.io/cas-type: nsfrwx

cas.openebs.io/config: |

– name: NSF服务器类型

value: \’内核\’

– name:后端存储类

value: \’do-block-storage\’

Provisioner: openebs.io/nfsrwx

reclaimPolicy: 删除

上述配置说明:

Provisioner – 定义用于配置PV 的存储类(例如openebs.io/nfsrwx)。

有关openEBS 的更多信息,请参阅OpenEBS 文档。

通过kubectl 申请。

kubectl apply -f asset/manifest/sc-rwx-values.yaml

通过运行以下命令验证StorageClass 是否已创建:

kubectl 获取sc

输出应如下所示:

名称提供商回收策略卷绑定模式允许卷扩展年龄

do-block-storage (默认) dobs.csi.digitalocean.com 立即删除true 107m

openebs-kernel-nfs openebs.io/nfsrwx 立即删除false 84m

rwx-storage openebs.io/nfsrwx 立即删除false 84m

现在,您有了一个名为rwx-storage 的新StorageClass,它允许您在DigitalOcean 块存储上动态配置共享卷。

配置 WordPress MySQL 托管数据库

在本部分中,您将创建一个专用的MySQL 数据库,例如用于WordPress 的DigitalOcean 托管数据库。这是必需的,因为WordPress 安装将位于Kubernetes 集群中的单独服务器上。 (您可以观看视频教程来学习如何快速配置您的数据库)

默认情况下,WordPress Helm 图表将MariaDB 安装在集群中的单独pod 中,并将其配置为默认数据库。在决定使用托管数据库或默认的MariaDB 之前,您应该考虑以下事项:

使用托管数据库服务时,您只需确定数据库服务器的初始大小。它在自动化方面也很有吸引力。执行更新、执行迁移和创建备份都是自动的。有关托管数据库的更多信息,请参阅本文。使用托管数据库需要支付额外费用。如果您使用默认的MariaDB Helm 图表安装,请注意DB pod(数据库应用程序容器)是临时的,可能会频繁重启或失败。某些管理任务(例如备份和扩展)需要更多的手动工作和设置才能实现这些目标。使用MariaDB 安装无需额外付费。

如果您不想使用外部数据库,请继续下一章配置Redis 数据库。

首先,创建一个MySQL 托管数据库。

doctl 数据库创建wordpress-mysql –engine mysql –region nyc1 –num-nodes 2 –size db-s-2vcpu-4gb

本教程中的示例使用1 个主节点和1 个从节点、2 个CPU/4 GB(100 美元/月)。有关可用大小的列表,请参阅DigitalOcean API 参考。

输出应如下所示(STATE 列必须在线):

输出

ID 名称引擎版本节点数区域状态大小

2f0d0969-a8e1-4f94-8b73-2d43c68f8e72 wordpress-mysql-test mysql 8 1 nyc1 在线db-s-1vcpu-1gb

您将需要一个数据库ID 来完成MySQL 设置。您可以通过运行以下命令打印MySQL 数据库ID:

dotl 数据库列表

接下来,创建一个WordPress 数据库用户。

doctl数据库用户创建2f0d0969-a8e1-4f94-8b73-2d43c68f8e72 wordpress_user

输出应如下所示(密码是自动生成的):

名称角色密码

wordpress_user 通常********

默认情况下,新用户获得整个数据库的完全权限。一般来说,安全最佳实践是限制新用户在WordPress 数据库中的权限。您可以按照DigitalOcean 提供的有关如何更改MySQL 数据库的用户权限的指南来完成此任务。

接下来,创建您的主WordPress 数据库。

doctl数据库数据库创建2f0d0969-a8e1-4f94-8b73-2d43c68f8e72 wordpress

输出应如下所示(密码是自动生成的):

姓名

文字新闻

最后,您需要在MySQL 数据库和Kubernetes 集群(DOKS) 之间建立信任源。

首先,提取Kubernetes 集群ID。

doctl Kubernetes 集群列表

输出应如下所示:

输出

ID名称区域版本自动升级状态节点池

c278b4a3-19f0-4de6-b1b2-6d90d94faa3b k8s-cluster nyc1 1.21.10-do.0 false 运行基本

最后,限制传入连接。

doctl数据库防火墙添加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 Chart 安装。下面解释了这两个选项。

配置 Redis DO 托管数据库

在本部分中,您将使用DigitalOcean 创建Redis 数据库。如果您不想使用托管数据库,请跳至下一部分“配置Redis Helm 图表”。

在决定使用托管数据库还是Helm 安装的数据库之前,您应该考虑以下事项:

使用托管数据库服务时,您只需确定数据库服务器的初始大小。它在自动化方面也很有吸引力。执行更新、执行迁移和创建备份都是自动的。使用托管数据库需要支付额外费用。使用Redis Helm 图表安装时,请记住DB pod(数据库应用程序容器)是临时的,可能会频繁重启或失败。某些管理任务(例如备份和扩展)需要更多的手动工作和设置才能实现这些目标。使用Redis 安装无需额外付费。

首先,创建一个Redis 托管数据库。

doctl 数据库创建wordpress-redis –engine redis –region nyc1 –num-nodes 1 –size db-s-1vcpu-1gb

本教程中的示例使用1 个节点、1 个CPU/1 GB(10 美元/月)。有关可用大小的列表,请参阅API 文档。

输出应如下所示(STATE 列必须在线):

输出

ID 名称引擎版本节点数区域状态大小

91180998-7fe2-450c-b353-492d8abcddad 创建wordpress-redis redis 6 1 nyc1 db-s-1vcpu-1gb

接下来,您需要在Redis 数据库和Kubernetes 集群(DOKS) 之间设置真实来源。

首先,提取Kubernetes 集群ID。

doctl Kubernetes 集群列表

输出应如下所示:

输出

ID名称区域版本自动升级状态节点池

c278b4a3-19f0-4de6-b1b2-6d90d94faa3b k8s-cluster nyc1 1.21.10-do.0 false 运行基本

最后,限制传入连接。

doctl数据库防火墙添加2f0d0969-a8e1-4f94-8b73-2d43c68f8e72 –rule k8s:c278b4a3-19f0-4de6-b1b2-6d90d94faa3b

有关更多信息,请参阅如何保护Redis 托管数据库集群。

配置 Redis Helm 图表

在本部分中,您将使用Bitnami Redis Helm 图表在Kubernetes 集群上创建Redis 数据库。

首先,添加Helm 存储库并列出可用的图表。

将Bitnami https 添加到Helm 存储库

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

通过以下链接在你的 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 中国区独家战略合作伙伴卓普云。

#以上关于教程:在 Kubernetes 集群上部署 WordPress 网站的相关内容来源网络仅供参考,相关信息请以官方公告为准!

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92562.html

Like (0)
CSDN的头像CSDN
Previous 2024年6月27日
Next 2024年6月27日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注