如何使用 Helm 在 Kubernetes 上配置 WordPress 和 MySQL
介绍
随着越来越多的开发者在分布式环境中工作,Kubernetes等工具已成为在动态构建和生产环境中保持应用程序组件标准化的核心。随着应用程序生态系统的日益复杂和 Kubernetes 的日益普及,能够帮助管理 Kubernetes 集群内资源的工具变得至关重要。
Helm是一个用于 Kubernetes 的开源包管理器,它简化了在 Kubernetes 集群上部署和升级应用程序的过程,同时还提供了一种查找和共享打包为Kubernetes Charts 的即用型应用程序的方法。
在本教程中,我们将使用 Helm 在 Kubernetes 集群上部署WordPress,以创建一个高可用性网站。除了利用 Kubernetes 固有的可扩展性和高可用性特性外,此设置还将通过 Helm 提供简化的升级和回滚工作流程,从而有助于确保 WordPress 的安全。
我们将使用外部 MySQL 服务器来抽象数据库组件,因为它可以作为独立集群或托管服务的一部分,从而提高可用性。完成本教程中描述的步骤后,您将在由 Kubernetes 管理的容器化集群环境中拥有一个功能齐全的 WordPress 安装。
先决条件
要完成本指南,您需要准备以下材料:
- 启用了基于角色的访问控制(RBAC) 的Kubernetes 1.10+ 集群。
kubectl您需要在本地计算机或开发服务器上安装一个命令行工具,并将其配置为连接到您的集群。有关如何进行设置的说明,请参阅Kubernetes 官方文档。- 在您的本地计算机或开发服务器上安装了Helm包管理器,并在您的集群上安装了 Tiller,如本教程中所述:如何使用 Helm 包管理器在 Kubernetes 集群上安装软件。
- 需要一台具有 SSH 访问权限的外部 MySQL 服务器,以及MySQL root 用户的密码。要进行此设置,您可以按照我们的 MySQL 教程之一进行操作,例如:如何在 Ubuntu 18.04 上安装 MySQL。
在继续操作之前,请确保您可以登录到 MySQL 服务器,并且能够连接到 Kubernetes 集群。如果您在kubectl配置文件中设置了多个集群,则应通过在本地计算机或开发服务器上运行以下命令来确保连接到正确的集群:
kubectl config get-contexts
以下是一个输出示例:
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* do-sfo2-wordpress-cluster do-sfo2-wordpress-cluster do-sfo2-wordpress-cluster-admin
minikube minikube minikube
星号 (*) 表示当前默认上下文是哪个集群。如果需要更改当前上下文,请运行:
kubectl config use-context context-name
现在你应该可以继续阅读本指南的其余部分了。
步骤 1 — 配置 MySQL
首先,我们将为 WordPress 创建一个专用的 MySQL 用户和一个数据库,允许来自外部主机的连接。这是必要的,因为我们的 WordPress 将安装在 Kubernetes 集群内的独立服务器上。如果您已经为 WordPress 设置了专用的 MySQL 用户和数据库,则可以跳到下一步。
从 MySQL 服务器,使用以下命令登录 MySQL:
mysql -u root -p
系统会提示您输入首次安装软件时为 MySQL root账户设置的密码。登录后,MySQL 会提供一个命令提示符,您可以使用该提示符创建 WordPress 所需的数据库和用户。
注意:在本教程中,我们将创建一个名为 `<database_name>` 的数据库wordpress和一个名为 `<user_name>` 的用户wordpress_user,密码为 `<password>` password。请注意,这些是不安全的示例值,您应该根据本指南的实际情况进行修改。
要创建数据库,可以使用以下语句:
CREATE DATABASE wordpress;
现在,让我们为这个数据库创建一个专用的 MySQL 用户:
CREATE USER wordpress_user IDENTIFIED BY 'password';
用户wordpress_user已创建,但尚未拥有任何访问权限。以下命令将授予该用户从本地和外部网络访问WordPress数据库的管理员权限(所有权限):
GRANT ALL PRIVILEGES ON wordpress.* TO wordpress_user@'%';
要更新管理访问权限的内部 MySQL 表,请使用以下语句:
FLUSH PRIVILEGES;
现在你可以使用以下命令退出 MySQL 客户端:
exit;
为了测试更改是否成功,您可以再次登录 MySQL 命令行客户端,这次使用新帐户wordpress_user进行身份验证:
mysql -u wordpress_user -p
您应该使用创建此 MySQL 用户时提供的相同密码CREATE_USER。要确认您的新用户拥有数据库访问权限wordpress,您可以使用以下语句:
show databases;
预期输出如下:
+--------------------+
| Database |
+--------------------+
| information_schema |
| wordpress |
+--------------------+
2 rows in set (0.03 sec)
确认wordpress数据库包含在结果中后,即可使用以下命令退出 MySQL 命令行客户端:
exit;
您现在拥有一个专用于 WordPress 的 MySQL 数据库,以及可用于访问该数据库的有效凭据。由于我们的 WordPress 安装将位于单独的服务器上,因此我们仍然需要编辑 MySQL 配置,以允许来自外部主机的连接。
仍然在 MySQL 服务器上,/etc/mysql/mysql.conf.d/mysqld.cnf使用您选择的命令行编辑器打开该文件:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
找到bind-address此文件中的设置。默认情况下,MySQL 仅监听127.0.0.1本地主机 (localhost)。为了接受来自外部主机的连接,我们需要将此值更改为 `--external` 。您的配置应0.0.0.0如下所示:bind-address
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 0.0.0.0
完成这些更改后,保存并关闭文件。您需要使用以下命令重启 MySQL:
sudo systemctl restart mysql
要测试是否可以远程连接,请在本地计算机或开发服务器上运行以下命令:
mysql -h mysql_server_ip -u wordpress_user -p
请记住将地址替换mysql_server_ip为您的 MySQL 服务器 IP 地址或主机名。如果连接成功且没有出现错误,您就可以进行下一步了。
步骤 2 — 安装 WordPress
现在我们已经有了连接 MySQL 数据库所需的信息,接下来就可以使用 Helm 安装 WordPress 了。
默认情况下,WordPress Chart 会在集群内部的一个独立 pod 中安装MariaDB,并将其用作 WordPress 数据库。我们希望禁用此行为,并将 WordPress 配置为使用外部 MySQL 数据库。此配置以及其他配置选项(例如默认的 WordPress 管理员用户名和密码)可以在安装时设置,既可以通过命令行参数设置,也可以通过单独的 YAML 配置文件设置。
为了保持条理清晰且易于扩展,我们将使用配置文件。
在本地计算机或开发服务器上,创建一个用于存放项目设置的新目录,并进入该目录:
mkdir myblog-settings
cd myblog-settings
接下来,values.yaml使用您选择的文本编辑器创建一个名为 的文件:
nano values.yaml
在这个文件中,我们需要设置一些变量来定义 WordPress 如何连接到数据库,以及一些关于您的网站的基本信息和安装完成后用于登录 WordPress 的初始管理员用户。
我们将基于WordPress Helm Chartvalues.yaml中的默认文件进行配置。“博客/站点信息”部分包含 WordPress 博客的常规选项,例如博客名称和初始用户凭据。该文件的“数据库设置”部分包含连接到远程 MySQL 服务器的设置。最后一部分禁用了 MariaDB。
将以下内容复制到您的values.yaml文件中,并将高亮显示的值替换为您的自定义值:
## Blog/Site Info
wordpressUsername: sammy
wordpressPassword: password
wordpressEmail: sammy@example.com
wordpressFirstName: Sammy
wordpressLastName: the Shark
wordpressBlogName: Sammy's Blog!
## Database Settings
externalDatabase:
host: mysql_server_ip
user: wordpress_user
password: password
database: wordpress
## Disabling MariaDB
mariadb:
enabled: false
我们刚刚配置了以下选项:
- wordpressUsername:WordPress 用户的登录名。
- wordpressPassword:WordPress 用户的密码。
- wordpressEmail:WordPress 用户的电子邮件地址。
- wordpressFirstName:WordPress 用户的名字。
- wordpressLastName:WordPress 用户的姓氏。
- wordpressBlogName:网站或博客的名称。
- 主机:MySQL 服务器 IP 地址或主机名。
- 用户:MySQL 用户。
- 密码:MySQL 密码。
- 数据库:MySQL 数据库名称。
编辑完成后,保存文件并退出编辑器。
现在所有设置都已就绪,是时候执行helmWordPress 安装命令了。以下命令指示helm安装 WordPress 最新稳定版本,名称为 `<chart_name>` myblog,配置values.yaml文件为 `<config_file>`:
helm install --name myblog -f values.yaml stable/wordpress
您应该会得到类似以下的输出:
NAME: myblog
LAST DEPLOYED: Fri Jan 25 20:24:10 2019
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Deployment
NAME READY UP-TO-DATE AVAILABLE AGE
myblog-wordpress 0/1 1 0 1s
==> v1/PersistentVolumeClaim
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myblog-wordpress Pending do-block-storage 1s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
myblog-wordpress-5965f49485-8zfl7 0/1 Pending 0 1s
==> v1/Secret
NAME TYPE DATA AGE
myblog-externaldb Opaque 1 1s
myblog-wordpress Opaque 1 1s
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myblog-wordpress LoadBalancer 10.245.144.79 <pending> 80:31403/TCP,443:30879/TCP 1s
(...)
安装完成后,Kubernetes 集群中会创建一个名为myblog-wordpress的服务,但容器可能需要几分钟才能准备就绪,并且相关External-IP信息才能生效。要检查此服务的状态并获取其外部 IP 地址,请运行:
kubectl get services
您应该会得到类似以下的输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 20h
myblog-wordpress LoadBalancer 10.245.144.79 203.0.113.110 80:31403/TCP,443:30879/TCP 3m40s
此命令会提供集群上运行的服务的详细信息,包括服务名称、服务类型以及这些服务使用的 IP 地址。从输出结果可以看出,WordPress 服务正在myblog-wordpress外部 IP 地址上运行203.0.113.110。
注意:如果您要使用minikube此设置进行测试,则需要运行命令minikube service myblog-wordpress以公开容器 Web 服务器,以便您可以从浏览器访问它。
您的 WordPress 安装现已正常运行。要访问管理界面,请使用从 `wp-config` 命令输出中获取的公网 IP 地址kubectl get services,然后/wp-admin在您的 Web 浏览器中输入:
http://203.0.113.110/wp-admin
您应该使用文件中定义的凭据values.yaml登录并开始配置您的 WordPress 站点。
步骤 3 — 升级 WordPress
由于 WordPress 的流行,它经常成为恶意攻击的目标,因此保持更新至关重要。我们可以使用命令来升级 Helm 版本helm upgrade。
要列出所有当前版本,请在本地计算机或开发服务器上运行以下命令:
helm list
你应该会看到类似这样的输出:
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
myblog 1 Fri Jan 25 20:24:10 2019 DEPLOYED wordpress-5.1.2 5.0.3 default
如输出所示,我们当前的 WordPress 版本是5.0.3(应用版本),而图表版本是5.1.2。如果您想将版本升级到更新的图表版本,请先使用以下命令更新您的 Helm 仓库:
helm repo update
您可以预期得到以下输出:
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈
现在您可以使用以下命令检查是否有更新版本的 WordPress 图表:
helm inspect chart stable/wordpress
你应该会看到类似这样的输出:
apiVersion: v1
appVersion: 5.1.1
description: Web publishing platform for building blogs and websites.
engine: gotpl
home: http://www.wordpress.com/
icon: https://bitnami.com/assets/stacks/wordpress/img/wordpress-stack-220x234.png
keywords:
- wordpress
- cms
- blog
- http
- web
- application
- php
maintainers:
- email: containers@bitnami.com
name: Bitnami
name: wordpress
sources:
- https://github.com/bitnami/bitnami-docker-wordpress
version: 5.9.0
从输出结果可以看出,WordPress 5.1.1 (应用版本)有一个新的图表版本(5.9.0)可用。如果您想将 WordPress 版本升级到最新的 WordPress 图表,请运行以下命令:
helm upgrade -f values.yaml myblog stable/wordpress
此命令将产生与 非常相似的输出helm install。务必提供我们首次安装 WordPress 图表时使用的相同配置文件,因为它包含我们为设置定义的自定义数据库设置。
现在,如果您helm list再次运行,应该会看到有关您发布的更新信息:
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
myblog 2 Fri May 3 14:51:20 2019 DEPLOYED wordpress-5.9.0 5.1.1 default
您已成功将 WordPress 升级到最新版本的 WordPress 图表。
回滚版本
每次升级版本时,Helm 都会创建一个新的版本修订版。修订版会设置一个固定的检查点,以便在出现问题时回滚到该检查点。它类似于Git 中的提交,因为它会创建变更历史记录,以便进行比较和回滚。如果在升级过程中出现问题,您可以随时使用以下命令回滚到给定 Helm 版本的先前修订版helm rollback:
helm rollback release-name revision-number
例如,如果我们想撤销升级并将 WordPress 版本回滚到第一个版本,我们可以使用:
helm rollback myblog 1
这将把 WordPress 安装回滚到第一个版本。您应该会看到以下输出,表明回滚成功:
Rollback was a success! Happy Helming!
再次运行helm list应该会显示 WordPress 已降级回 5.0.3 版本,图表版本为 5.1.2 版本:
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
myblog 3 Mon Jan 28 22:02:42 2019 DEPLOYED wordpress-5.1.2 5.0.3 default
请注意,回滚版本实际上会创建一个新的版本,该版本基于回滚的目标版本。我们myblog当前的 WordPress 版本号为3,它基于版本号1。
结论
在本指南中,我们使用命令行工具 Helm 在 Kubernetes 集群上安装了带有外部 MySQL 服务器的 WordPress。我们还学习了如何将 WordPress 版本升级到新的 Chart 版本,以及如果在升级过程中出现问题,如何回滚版本。
作为其他步骤,您可以考虑使用 Cert-Manager 设置 Nginx Ingress,以便启用基于名称的虚拟主机并为您的 WordPress 网站配置 SSL 证书。您还应该查看本指南中使用的 WordPress 图表的推荐生产环境设置。
如果您想了解更多关于 Kubernetes 和 Helm 的信息,请查看我们社区页面的Kubernetes部分。
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
文章来源:https://dev.to/digitalocean/how-to-set-up-wordpress-with-mysql-on-kubernetes-using-helm-50nc
