介绍
随着越来越多的开发人员在分布式环境中工作, Kubernetes等工具已成为在动态构建和生产环境中保持应用程序组件标准化的核心。 由于开发人员更广泛地采用Kubernetes来大规模地编排大量容器,因此越来越有必要利用有助于管理Kubernetes集群内资源的工具。 Helm是Kubernetes的开源软件包管理器,可以在您定义,安装和升级Kubernetes应用程序时为您提供帮助。
在本教程中,我们将使用Helm在Kubernetes集群之上设置WordPress站点。 我们将使用外部MySQL服务器来抽象数据库组件,因为它可以是单独的集群或托管服务的一部分,以实现扩展可用性。 完成本教程中描述的步骤后,您将在由Kubernetes管理的容器化集群环境中安装全功能的WordPress。
先决条件
要完成本指南,您需要以下内容:
- 启用了基于角色的访问控制 (RBAC)的Kubernetes 1.10+集群。
-
kubectl
命令行工具安装在本地计算机或开发服务器上,配置为连接到您的群集。 有关如何进行此设置的说明,请参阅官方Kubernetes文档 。 - Helm软件包管理器安装在本地计算机或开发服务器上,并在集群上安装Tiller,如本教程中所述: 如何使用Helm软件包管理器在Kubernetes集群上安装软件 。
- 具有SSH访问权限的外部MySQL服务器和根 MySQL密码。 要进行此设置,您可以按照我们的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帐户设置的密码。 登录后,MySQL将为您提供一个命令提示符,您可以使用它来创建WordPress所需的数据库和用户。
注意:在本教程中,我们将创建一个名为wordpress
的数据库和一个名为wordpress_user
的用户,由密码password
标识。 请注意,这些是不安全的示例值,您应该在本指南中相应地修改它们。
要创建数据库,可以使用以下语句:
CREATE DATABASE wordpress;
现在,让我们为这个数据库创建一个专用的MySQL用户:
CREATE USER wordpress_user IDENTIFIED BY 'password';
用户wordpress_user
已创建,但它还没有任何访问权限。 以下命令将为此用户提供来自本地和外部网络的wordpress数据库的admin访问权限(所有权限):
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;
预期以下输出:
+--------------------+| 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
配置的外观:
# 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-settingscd myblog-settings
接下来,使用您选择的文本编辑器创建名为values.yaml
的文件:
nano values.yaml
在此文件中,我们需要设置一些变量来定义WordPress如何连接到数据库,以及有关您的站点的一些基本信息以及安装完成后登录WordPress的初始管理员用户。
我们将配置基于WordPress Helm图表中的默认值values.yaml
文件。 “ 博客/网站信息”部分包含WordPress博客的常规选项,例如博客名称和初始用户凭据。 此文件的“ 数据库设置”部分包含用于连接到远程MySQL服务器的设置。 MariaDB在最后一节中被禁用。
将以下内容复制到values.yaml
文件中,将突出显示的值替换为您的自定义值:
## Blog/Site InfowordpressUsername: sammywordpressPassword: passwordwordpressEmail: [email protected].comwordpressFirstName: SammywordpressLastName: the SharkwordpressBlogName: Sammy's Blog!## Database SettingsexternalDatabase: host: mysql_server_ip user: wordpress_user password: password database: wordpress## Disabling MariaDBmariadb: enabled: false
我们刚刚配置了以下选项:
- wordpressUsername :WordPress用户的登录信息。
- wordpressPassword :WordPress用户的密码。
- wordpressEmail :WordPress用户的电子邮件。
- wordpressFirstName :Wordpress用户的名字。
- wordpressLastName :Wordpress用户的姓氏。
- wordpressBlogName :站点或博客的名称。
- host :MySQL服务器的IP地址或主机名。
- 用户 :MySQL用户。
- 密码 :MySQL密码。
- 数据库 :MySQL数据库名称。
完成编辑后,保存文件并退出编辑器。
现在我们已经完成了所有设置,现在是时候执行helm
来安装WordPress了。 以下命令告诉helm
使用values.yaml
作为配置文件,以名称myblog
安装WordPress图表的最新稳定版本:
helm install --name myblog -f values.yaml stable/wordpress
您应该获得类似于以下内容的输出:
NAME: myblogLAST DEPLOYED: Fri Jan 25 20:24:10 2019NAMESPACE: defaultSTATUS: DEPLOYEDRESOURCES:==> v1/DeploymentNAME READY UP-TO-DATE AVAILABLE AGEmyblog-wordpress 0/1 1 0 1s==> v1/PersistentVolumeClaimNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEmyblog-wordpress Pending do-block-storage 1s==> v1/Pod(related)NAME READY STATUS RESTARTS AGEmyblog-wordpress-5965f49485-8zfl7 0/1 Pending 0 1s==> v1/SecretNAME TYPE DATA AGEmyblog-externaldb Opaque 1 1smyblog-wordpress Opaque 1 1s==> v1/ServiceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEmyblog-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) AGEkubernetes ClusterIP 10.245.0.1 <none> 443/TCP 20hmyblog-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
输出中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
您应该获得类似于此的输出:
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACEmyblog 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 repositoryUpdate Complete. ⎈ Happy Helming!⎈
现在,您可以检查是否有更新版本的WordPress图表:
helm inspect chart stable/wordpress
您应该看到与此类似的输出:
apiVersion: v1appVersion: 5.1.1description: Web publishing platform for building blogs and websites.engine: gotplhome: http://www.wordpress.com/icon: https://www.howtoing.com/wp-content/uploads/assets/stacks/wordpress/img/wordpress-stack-220x234.pngkeywords:- wordpress- cms- blog- http- web- application- phpmaintainers:- email: [email protected].com name: Bitnaminame: wordpresssources:- https://github.com/bitnami/bitnami-docker-wordpressversion: 5.9.0
从输出中可以看出,有一个新的图表(版本5.9.0)与WordPress 5.1.1 (应用程序版本)。 每当您想将WordPress版本升级到最新的WordPress图表时,您应该运行:
helm upgrade -f values.yaml myblog stable/wordpress
此命令将生成与helm install
生成的输出非常相似的输出。 提供我们在第一次安装WordPress图表时使用的相同配置文件非常重要,因为它包含我们为设置定义的自定义数据库设置。
现在,如果再次运行helm list
,您应该会看到有关您的版本的更新信息:
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACEmyblog 2 Fri May 3 14:51:20 2019 DEPLOYED wordpress-5.9.0 5.1.1 default
您已成功将WordPress升级到最新版本的WordPress图表。
回滚版本
每次升级版本时,Helm都会创建该版本的新版本 。 如果事情无法按预期工作,则修订会将固定检查点设置为您可以返回的位置。 它类似于Git中的提交 ,因为它创建了可以进行比较和还原的更改历史记录。 如果在升级过程中出现问题,您可以使用helm rollback
命令始终回滚到给定Helm版本的先前版本:
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 NAMESPACEmyblog 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版本升级到新的图表版本,以及如何在整个升级过程中出现问题时回滚版本。
作为附加步骤,您可以考虑使用Cert-Manager设置Nginx Ingress,以启用基于名称的虚拟主机并为您的WordPress站点配置SSL证书。 您还应该检查我们在本指南中使用的WordPress图表的建议生产设置 。
如果您想了解更多关于Kubernetes和Helm的信息,请查看我们社区页面的Kubernetes部分。