介绍
随着越来越多的开发人员在分布式环境中工作,Kubernetes 等工具已成为在动态构建和生产环境中保持应用程序组件标准化的核心。 随着应用程序生态系统的日益复杂和 Kuberbetes 的日益普及,帮助管理 Kubernetes 集群内资源的工具变得必不可少。
Helm 是 Kubernetes 的开源包管理器,它简化了在 Kubernetes 集群上部署和升级应用程序的过程,同时还提供了一种查找和共享打包为 [ X252X]Kubernetes 图表。
在本教程中,我们将使用 Helm 在 Kubernetes 集群上设置 WordPress,以创建高可用性网站。 除了利用 Kubernetes 的内在可扩展性和高可用性方面,此设置将通过 Helm 提供简化的升级和回滚工作流程来帮助保持 WordPress 的安全。
我们将使用外部 MySQL 服务器来抽象数据库组件,因为它可以是单独集群或托管服务的一部分以实现扩展可用性。 完成本教程中描述的步骤后,您将在由 Kubernetes 管理的容器化集群环境中安装功能齐全的 WordPress。
先决条件
为了完成本指南,您需要以下内容:
- 启用了 基于角色的访问控制 (RBAC) 的 Kubernetes 1.10+ 集群。
- 安装在本地机器或开发服务器上的
kubectl
命令行工具,配置为连接到您的集群。 请参阅 官方 Kubernetes 文档 以获取有关如何设置的说明。 - Helm 包管理器安装在本地机器或开发服务器上,Tiller 安装在集群上,如本教程所述:如何使用 Helm 包管理器在 Kubernetes 集群上安装软件 .
- 具有 SSH 访问权限的外部 MySQL 服务器和 root MySQL 密码。 要进行此设置,您可以按照我们的 MySQL 教程之一进行操作,例如:如何在 Ubuntu 18.04 上安装 MySQL。
在继续之前,请确保您能够登录到您的 MySQL 服务器,并且您可以连接到您的 Kubernetes 集群。 如果您在 kubectl
配置文件中设置了多个集群,则应通过从本地计算机或开发服务器运行以下命令来确保已连接到正确的集群:
kubectl config get-contexts
这是一个示例输出:
Output 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
首次安装软件时,系统会提示您提供为 root MySQL 帐户设置的密码。 登录后,MySQL 将为您提供一个命令提示符,您可以使用该命令提示符创建 WordPress 所需的数据库和用户。
注意: 在本教程中,我们将创建一个名为 wordpress
的数据库和一个名为 wordpress_user
的用户,由密码 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
您应该使用在使用 CREATE_USER
语句创建此 MySQL 用户时提供的相同密码。 要确认您的新用户有权访问 wordpress
数据库,您可以使用以下语句:
show databases;
预计会出现以下输出:
Output+--------------------+ | 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)。 为了接受来自外部主机的连接,我们需要将此值更改为 0.0.0.0
。 这就是您的 bind-address
配置的外观:
/etc/mysql/mysql.conf.d/mysqld.cnf
# 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 图表将 MariaDB 安装在集群内的单独 pod 上,并将其用作 WordPress 数据库。 我们希望禁用此行为并将 WordPress 配置为使用外部 MySQL 数据库。 可以在安装时通过命令行参数或单独的 YAML 配置文件设置此配置选项和其他配置选项(例如默认的 WordPress 管理员用户和密码)。
为了使事情井井有条并易于扩展,我们将使用配置文件。
从您的本地机器或开发服务器,为您的项目设置创建一个新目录并导航到它:
mkdir myblog-settings cd myblog-settings
接下来,使用您选择的文本编辑器创建一个名为 values.yaml
的文件:
nano values.yaml
在这个文件中,我们需要设置一些变量来定义 WordPress 如何连接到数据库,以及一些关于您的站点的基本信息和安装完成后登录 WordPress 的初始管理员用户。
我们的配置将基于 WordPress Helm 图表 中的默认 values.yaml
文件。 博客/站点信息 部分包含 WordPress 博客的常规选项,例如博客名称和初始用户凭据。 该文件的 Database Settings 部分包含连接到远程 MySQL 服务器的设置。 MariaDB 在最后一节被禁用。
将以下内容复制到您的 values.yaml
文件中,将突出显示的值替换为您的自定义值:
值.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:站点或博客的名称。
- host:MySQL 服务器 IP 地址或主机名。
- user:MySQL 用户。
- 密码:MySQL密码。
- database:MySQL 数据库名称。
完成编辑后,保存文件并退出编辑器。
现在我们已经完成了所有设置,是时候执行 helm
来安装 WordPress。 以下命令告诉 helm
以 myblog
的名称安装 WordPress 图表的最新稳定版本,使用 values.yaml
作为配置文件:
helm install --name myblog -f values.yaml stable/wordpress
您应该得到类似于以下内容的输出:
Output 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
您应该得到类似于以下内容的输出:
Output 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 安装在外部 IP 地址 203.0.113.110
上作为 myblog-wordpress
提供服务。
]注意: 如果您使用 minikube
来测试此设置,则需要运行 minikube service myblog-wordpress
以公开容器 Web 服务器,以便您可以访问它从您的浏览器。
您的 WordPress 安装现在可以运行了。 要访问管理界面,请使用从 kubectl get services
的输出中获取的公共 IP 地址,然后在 Web 浏览器中输入 /wp-admin
:
http://203.0.113.110/wp-admin
您应该使用 values.yaml
文件中定义的凭据登录并开始配置您的 WordPress 站点。
第 3 步 — 升级 WordPress
由于其受欢迎程度,WordPress 经常成为恶意利用的目标,因此保持更新非常重要。 我们可以使用命令 helm upgrade
升级 Helm 版本。
要列出所有当前版本,请从本地计算机或开发服务器运行以下命令:
helm list
你应该得到类似这样的输出:
OutputNAME 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
(app 版本),而图表版本是 5.1.2
。 如果你想将一个版本升级到更新版本的图表,首先更新你的 Helm 存储库:
helm repo update
您可以期待以下输出:
OutputHang 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
您应该会看到与此类似的输出:
OutputapiVersion: 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
,您应该会看到有关您的版本的更新信息:
Output 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 中的 commit,因为它创建了可以比较和还原的更改历史记录。 如果在升级过程中出现问题,您始终可以使用 helm rollback
命令回滚到给定 Helm 版本的先前版本:
helm rollback release-name revision-number
例如,如果我们想要撤消升级并将我们的 WordPress 版本回滚到其 first 版本,我们将使用:
helm rollback myblog 1
这会将 WordPress 安装回滚到其第一个版本。 您应该看到以下输出,表明回滚成功:
Output Rollback was a success! Happy Helming!
现在再次运行 helm list
应该表明 WordPress 已降级回 5.0.3,图表版本 5.1.2:
Output 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 版本现在的修订号为 three,它基于修订号 one。
结论
在本指南中,我们使用命令行工具 Helm 在 Kubernetes 集群上安装了带有外部 MySQL 服务器的 WordPress。 我们还学习了如何将 WordPress 版本升级到新的图表版本,以及在整个升级过程中出现问题时如何回滚版本。
作为附加步骤,您可能会考虑 使用 Cert-Manager 设置 Nginx Ingress,以便启用基于名称的虚拟主机并为您的 WordPress 站点配置 SSL 证书。 您还应该检查我们在本指南中使用的 WordPress 图表的 推荐生产设置 。
如果您想了解更多关于 Kubernetes 和 Helm 的信息,请查看我们社区页面的 Kubernetes 部分。