介绍
随着越来越多的开发人员在分布式环境中工作,像 Kubernetes这样的工具已成为保持应用程序组件在动态构建和生产环境中标准化的关键。
Helm是Kubernetes的开源包管理器,它简化了在Kubernetes群集上部署和升级应用程序的过程,同时还提供了找到和共享包装为 _Kubernetes 图表_的准备安装的应用程序的方法。
在本教程中,我们将使用Helm在Kubernetes集群上设置 WordPress,以创建一个高度可用的网站。
我们将使用外部MySQL服务器来抽象数据库组件,因为它可以是单独的集群或管理服务的一部分,以实现扩展可用性。
如果您正在寻找一个管理的Kubernetes托管服务,请查看我们的简单的,用于增长的管理的Kubernetes服务(https://www.digitalocean.com/products/kubernetes)。
前提条件
为了完成本指南,您将需要以下为您提供:
- 一个基于角色访问控制的 Kubernetes 1.10+ 集群(https://kubernetes.io/docs/reference/access-authn-authz/rbac/) (RBAC)启用
- 在本地机器或开发服务器上安装的
kubectl
命令行工具,配置以连接到您的集群。请参阅 官方 Kubernetes 文档 有关如何设置此设置的说明 - 在本地机器或开发服务器上安装的 Helm 包管理器,以及在您的集群上安装的 Tiller,如本教程所解释的那样: 如何使用 Helmage Package Manager 安装 Kubernetes 上的软件。 使用 SSH 的外部 MySQL 服务器,
在继续之前,请确保您能够登录到您的MySQL服务器,并且您可以连接到您的Kubernetes集群。如果您在您的kubectl
配置文件中设置了多个集群,您应该通过从本地机器或开发服务器运行以下命令来确保您已连接到正确的集群:
1[environment local]
2kubectl config get-contexts
这是一个例子产出:
1[secondary_label Output]
2
3CURRENT NAME CLUSTER AUTHINFO NAMESPACE
4* do-sfo2-wordpress-cluster do-sfo2-wordpress-cluster do-sfo2-wordpress-cluster-admin
5 minikube minikube minikube
星座标志 (*) 表示哪个集群当前是 default context. 如果您需要更改当前的背景,请运行:
1[environment local]
2kubectl config use-context context-name
现在你应该准备好遵循其余的指南。
步骤 1 - 配置 MySQL
首先,我们将创建一个专用MySQL用户和WordPress数据库,允许来自外部主机的连接,这是必要的,因为我们的WordPress安装将生活在Kubernetes群集内的单独服务器上。
从MySQL服务器登录到MySQL,使用以下命令:
1[environment second]
2mysql -u root -p
您将被要求提供您在首次安装软件时为 root MySQL 帐户设置的密码。登录后,MySQL 将为您提供一个命令提示,您可以使用它来创建我们为 WordPress 所需的数据库和用户。
注意:对于本教程,我们将创建一个名为WordPress
的数据库和一个名为WordPress_user
的用户,由密码密码
识别。
要创建数据库,您可以使用以下语句:
1[environment second]
2CREATE DATABASE wordpress;
现在,让我们为这个数据库创建一个专用MySQL用户:
1[environment second]
2CREATE USER wordpress_user IDENTIFIED BY 'password';
用户 wordpress_user
创建了,但它尚未获得任何访问权限. 以下命令将给这个用户管理员从本地和外部网络访问 wordpress 数据库(所有权限):
1[environment second]
2GRANT ALL PRIVILEGES ON wordpress.* TO wordpress_user@'%';
若要更新管理访问权限的内部 MySQL 表,请使用以下语句:
1[environment second]
2FLUSH PRIVILEGES;
现在您可以退出 MySQL 客户端:
1[environment second]
2exit;
要测试这些更改是否成功,您可以再次登录MySQL命令行客户端,这一次使用新的帐户wordpress_user
来验证:
1[environment second]
2mysql -u wordpress_user -p
您应该使用您在创建此 MySQL 用户时提供的相同的密码与CREATE_USER
声明. 为了确认您的新用户可以访问WordPress
数据库,您可以使用以下声明:
1[environment second]
2show databases;
预计产出如下:
1[secondary_label Output]
2+--------------------+
3| Database |
4+--------------------+
5| information_schema |
6| wordpress |
7+--------------------+
82 rows in set (0.03 sec)
在确认WordPress
数据库被包含在结果中后,您可以通过以下方式退出MySQL命令行客户端:
1[environment second]
2exit;
因为我们的 WordPress 安装将生活在一个单独的服务器上,我们仍然需要编辑我们的 MySQL 配置以允许来自外部主机的连接。
在您的MySQL服务器上,请使用您所选择的命令行编辑器打开文件 /etc/mysql/mysql.conf.d/mysqld.cnf
:
1[environment second]
2sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
默认情况下,MySQL只会听到127.0.0.1
(localhost)。为了接受来自外部主机的连接,我们需要将此值更改为0.0.0.0
。
1[label /etc/mysql/mysql.conf.d/mysqld.cnf]
2
3# Instead of skip-networking the default is now to listen only on
4# localhost which is more compatible and is not less secure.
5bind-address = 0.0.0.0
完成这些更改后,保存并关闭文件,您需要使用以下命令重新启动 MySQL:
1[environment second]
2sudo systemctl restart mysql
若要测试是否可以远程连接,请从本地机器或开发服务器执行以下命令:
1[environment local]
2mysql -h mysql_server_ip -u wordpress_user -p
請記住將「mysql_server_ip」更改為您的 MySQL 伺服器 IP 地址或主機名稱. 如果您能夠在沒有錯誤的情況下連接,您現在已經準備好進行下一步。
第2步:安装WordPress
现在我们有必要的信息连接到MySQL数据库,我们可以继续使用Helm来安装WordPress。
默认情况下,WordPress 图表将安装 MariaDB在集群内部的单独插件上,并将其用作WordPress数据库。我们希望禁用此行为并配置WordPress以使用外部MySQL数据库。此和其他配置选项(如默认WordPress管理员用户和密码)可以在安装时设置,通过命令行参数或通过单独的YAML配置文件。
为了保持事情有组织和易于扩展,我们将使用配置文件。
从本地机器或开发服务器创建一个新的目录为您的项目设置,并导航到它:
1[environment local]
2mkdir myblog-settings
3cd myblog-settings
接下来,创建一个名为values.yaml
的文件,使用您所选择的文本编辑器:
1[environment local]
2nano values.yaml
在此文件中,我们需要设置一些变量,这些变量将定义WordPress如何连接到数据库,以及有关您的网站和初始管理员用户的一些基本信息,以便在安装完成后登录WordPress。
我们的配置将基于 [WordPress Helm 图表] 的默认 values.yaml
文件(https://github.com/bitnami/charts/blob/master/upstreamed/wordpress/values.yaml)。 Blog/Site Info 部分包含您的 WordPress 博客的通用选项,如博客名称和最初的用户凭证。本文件的 Database Settings 部分包含连接到远程 MySQL 服务器的设置。
将以下内容复制到您的 values.yaml
文件中,以自定义值取代所突出的值:
1[label values.yaml]
2
3## Blog/Site Info
4wordpressUsername: sammy
5wordpressPassword: password
6wordpressEmail: [email protected]
7wordpressFirstName: Sammy
8wordpressLastName: the Shark
9wordpressBlogName: Sammy's Blog!
10
11## Database Settings
12externalDatabase:
13 host: mysql_server_ip
14 user: wordpress_user
15 password: password
16 database: wordpress
17
18## Disabling MariaDB
19mariadb:
20 enabled: false
我们刚刚配置了以下选项:
WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress 用户名:WordPress
当你完成编辑时,保存文件并离开编辑器。
现在我们已经有了所有设置,现在是执行头盔
来安装WordPress的时候了。下面的命令告诉头盔
在名称myblog
下安装WordPress图表的最新稳定版本,使用values.yaml
作为配置文件:
1[environment local]
2helm install --name myblog -f values.yaml stable/wordpress
你应该得到类似于以下的输出:
1[secondary_label Output]
2
3NAME: myblog
4LAST DEPLOYED: Fri Jan 25 20:24:10 2019
5NAMESPACE: default
6STATUS: DEPLOYED
7
8RESOURCES:
9==> v1/Deployment
10NAME READY UP-TO-DATE AVAILABLE AGE
11myblog-wordpress 0/1 1 0 1s
12
13==> v1/PersistentVolumeClaim
14NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
15myblog-wordpress Pending do-block-storage 1s
16
17==> v1/Pod(related)
18NAME READY STATUS RESTARTS AGE
19myblog-wordpress-5965f49485-8zfl7 0/1 Pending 0 1s
20
21==> v1/Secret
22NAME TYPE DATA AGE
23myblog-externaldb Opaque 1 1s
24myblog-wordpress Opaque 1 1s
25
26==> v1/Service
27NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
28myblog-wordpress LoadBalancer 10.245.144.79 <pending> 80:31403/TCP,443:30879/TCP 1s
29
30(...)
安装完成后,在您的 Kubernetes 集群中创建一个名为 myblog-wordpress 的服务,但可能需要几分钟才能完成集装箱的安装,并提供外部 IP
信息。
1[environment local]
2kubectl get services
你应该得到类似于以下的输出:
1[secondary_label Output]
2
3NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
4kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 20h
5myblog-wordpress LoadBalancer 10.245.144.79 203.0.113.110 80:31403/TCP,443:30879/TCP 3m40s
此命令为您提供有关在您的集群上运行的服务的详细信息,包括服务的名称和类型,以及这些服务所使用的IP地址。
注意:如果您正在使用minikube
来测试此设置,则需要运行minikube服务 myblog-wordpress
,以便暴露容器 Web 服务器,以便您可以从浏览器中访问它。
您的WordPress安装现在已启动。 要访问管理界面,请使用从您的Web浏览器中的kubectl get services
输出中获得的公共IP地址,然后是/wp-admin
:
1http://203.0.113.110/wp-admin
您应该使用values.yaml
文件中定义的凭证来登录并开始配置您的WordPress网站。
步骤三:升级WordPress
由于其受欢迎性,WordPress往往是恶意剥削的目标,因此保持更新很重要,我们可以使用命令升级头盔
来升级头盔版本。
若要列出所有当前版本,请从本地机器或开发服务器执行以下命令:
1[environment local]
2helm list
你应该得到类似于此的输出:
1[secondary_label Output]
2NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
3myblog 1 Fri Jan 25 20:24:10 2019 DEPLOYED wordpress-5.1.2 5.0.3 default
正如你可以从输出中看到的那样,我们目前的WordPress版本是5.0.3
(应用版本),而图表版本是5.1.2
。
1[environment local]
2helm repo update
您可以期待以下结果:
1[secondary_label Output]
2Hang tight while we grab the latest from your chart repositories...
3...Skip local chart repository
4...Successfully got an update from the "stable" chart repository
5Update Complete. ⎈ Happy Helming!⎈
现在你可以检查是否有新的版本的WordPress图表可用:
1[environment local]
2helm inspect chart stable/wordpress
你应该看到类似于此的输出:
1[secondary_label Output]
2apiVersion: v1
3appVersion: 5.1.1
4description: Web publishing platform for building blogs and websites.
5engine: gotpl
6home: http://www.wordpress.com/
7icon: https://bitnami.com/assets/stacks/wordpress/img/wordpress-stack-220x234.png
8keywords:
9- wordpress
10- cms
11- blog
12- http
13- web
14- application
15- php
16maintainers:
17- email: [email protected]
18 name: Bitnami
19name: wordpress
20sources:
21- https://github.com/bitnami/bitnami-docker-wordpress
22version: 5.9.0
正如你可以从输出中看到的,有一个新的图表(版本 5.9.0)与WordPress ** 5.1.1**(应用程序版本)可用。 每当你想要升级你的WordPress版本到最新的WordPress图表,你应该运行:
1[environment local]
2helm upgrade -f values.yaml myblog stable/wordpress
这个命令将产生类似于helm install
产生的输出,重要的是提供我们第一次安装WordPress图表时使用的相同配置文件,因为它包含我们为我们的设置定义的自定义数据库设置。
现在,如果您再次运行头盔列表
,您应该看到有关您的发布的最新信息:
1[secondary_label Output]
2
3NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
4myblog 2 Fri May 3 14:51:20 2019 DEPLOYED wordpress-5.9.0 5.1.1 default
您已成功升级您的 WordPress 到最新版本的 WordPress 图表。
滚动返回一个释放
每次你升级版本,Helm 会创建一个新的版本 revision。 一个版本会设置一个固定的 checkpoint,如果情况不按预期运行,你可以返回这个位置。 它与 Git 中的 commit 类似,因为它会创建一个可以比较和逆转的更改历史。
1[environment local]
2helm rollback release-name revision-number
例如,如果我们想取消升级并将我们的WordPress版本重回其第一个版本,我们会使用:
1[environment local]
2helm rollback myblog 1
这会将WordPress安装回归到其第一个版本,您应该看到以下输出,表明回归成功:
1[secondary_label Output]
2
3Rollback was a success! Happy Helming!
再次运行头盔列表
现在应该表明 WordPress 已降级至 5.0.3,图表版本 5.1.2:
1[secondary_label Output]
2
3NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
4myblog 3 Mon Jan 28 22:02:42 2019 DEPLOYED wordpress-5.1.2 5.0.3 default
请注意,回滚一个版本实际上将创建一个新的修订,基于回滚的目标修订. 我们的WordPress版本名为myblog
现在在修订号 三,这是基于修订号 一。
结论
在本指南中,我们使用命令行工具Helm在Kubernetes集群上安装了WordPress与外部MySQL服务器,我们还了解了如何将WordPress版本升级到新的图表版本,以及如何在升级过程中发生错误时将版本重新发布。
作为额外的步骤,您可能会考虑 设置 Nginx Ingress with Cert-Manager以启用基于名称的虚拟托管,并为您的WordPress网站配置SSL证书。
如果您想了解更多关于 Kubernetes 和 Helm 的信息,请参阅我们社区页面的 Kubernetes部分。