将应用程序部署到 Kubernetes 时,有很多选择。像 Helm 和 Ksonnet 这样的工具使得打包应用程序并将其部署到多个 Kubernetes 环境变得非常简单。但是,这些工具只能解决部分问题。部署到生产很少像 helm install my-chart 一样如此简单。他们可以涉及多个步骤,并保证所涉及的应用程序正常运行。我从 Kubernetes 用户那里听到的一个最常见的问题是“如何部署我的数据库变更?”。这是我一遍又一遍地问自己的问题。在 Skuid ,我们花了很多时间试图找出最安全和高可用的方式来执行这些数据库迁移,作为我们部署 Pipeline 的一部分。我们写的代码来做到这一小步在我们的 Pipeline 步骤是很复杂的。


使用 Spinnaker ,我们能够使这一步骤可重复,安全和可靠。在本教程中,我将解释如何设置一个简单的部署 Pipeline 来运行我们的迁移,并部署我们的应用程序,而不写任何复杂的代码。


本教程的目标是展示使用 Spinnaker 为 Kubernetes 构建整体部署 Pipeline 是多么容易。这个例子虽然是个简单的 Demo,但是却演示了如何在部署过程中执行多个步骤,而无需为生产中运行的每个应用程序重复"造轮子"。


安装程序


对于本教程,我们将使用 Go 编写的示例应用程序。此示例应用程序包含一个简单的 API 服务器以及一个用于上下迁移数据库的命令。我们将设置一个简单的持续部署 Pipeline ,将新的 Docker 镜像推送到镜像注册中心(Quay)时执行两项操作:


1. 使用新镜像运行数据库迁移

2. 部署新的 API 服务器


这个示例证明使用 Spinnaker 可以轻松实现整个部署流程的自动化,并确保我们以安全可重复的方式进行部署。


作为参考,我们将要部署的镜像是通过 Server 命令在3000端口上发布一个 API 服务器。要执行数据库迁移,我们将使用相同的 Docker 镜像,但不是执行该 Server 命令,而是使用该 Migrate 命令。以下是我们示例应用程序的 --help 输出:


用法:


  • golang-sample-service [command]


可用命令:


  • Help 有关任何命令

  • Migrate 帮助执行数据库迁移

  • Server 启动应用程序服务器


部署 API 服务器


首先,我们将使用 Spinnaker 建立一个简单的部署流程。这个 Pipeline 将把一个新的镜像推送到注册中心。


首先,我们需要配置触发器:


如何使用 Spinnaker 和 Kubernetes 进行数据库变更发布_java


然后,我们将通过单击“添加阶段”并选择“部署”来配置部署阶段。


如何使用 Spinnaker 和 Kubernetes 进行数据库变更发布_java_02


从那里,我们可以添加一个新的服务器组,使用触发镜像,并在“容器”部分下配置它的端口:


如何使用 Spinnaker 和 Kubernetes 进行数据库变更发布_java_03


如何使用 Spinnaker 和 Kubernetes 进行数据库变更发布_java_04


现在这些步骤已经完成,我们可以通过导航返回到“Pipeline”选项卡并执行 Pipeline 来测试我们的 Pipeline。这将把我们服务的第一个实例部署到我们的目标 Kubernetes 帐户。


如何使用 Spinnaker 和 Kubernetes 进行数据库变更发布_java_05


然后,我们可以通过导航到“Clusters”选项卡并查看我们的服务是否健康(由服务器组下的绿色实例表示)来验证我们的服务是否正在运行。


如何使用 Spinnaker 和 Kubernetes 进行数据库变更发布_java_06


数据库升级


我们教程的下一步将是将我们的数据库变更发布添加到我们的 Pipeline 中。为此,我们将利用 Run Job 阶段,并将其作为部署我们的应用程序的先决条件。这个阶段将通过 Docker 镜像触发我们的 Pipeline,并运行一个 Kubernetes Pod 来执行数据库迁移。如果 Pod 成功退出,该阶段将被视为成功,并进入我们现有的部署阶段。


首先,我们将添加 Run Job 阶段并对其进行配置。我们不需要为这个工作公开任何端口,但是我们需要添加一些额外的环境变量,以便我们的迁移框架知道如何连接到我们的数据库。对于本教程,我简单地连接到集群内 Postgres 数据库,但是您的应用程序可以轻松连接到 AWS 或其他数据库解决方案中的 RDS 实例。


我们将通过添加一个 Run Job 阶段开始,就像我们添加部署阶段一样:


如何使用 Spinnaker 和 Kubernetes 进行数据库变更发布_java_07


然后,我们将通过选择触发镜像来配置我们的工作,覆盖“参数”并在“容器”部分下添加我们的环境变量:


注意:迁移数据库的命令是 migrate up --dir={migrations-directory}


如何使用 Spinnaker 和 Kubernetes 进行数据库变更发布_java_08


如何使用 Spinnaker 和 Kubernetes 进行数据库变更发布_java_09


一旦我们的作业配置好了,我们所要做的就是配置部署阶段,依靠 Run Job 阶段的成功,通过导航到部署阶段并从 “depends on” 部分选择 “Run Database Migrations”:


如何使用 Spinnaker 和 Kubernetes 进行数据库变更发布_java_10


再次,我们可以执行我们的 Pipeline,现在,在部署阶段之前,我们将运行数据库迁移作为部署 Pipeline 的一部分。


如何使用 Spinnaker 和 Kubernetes 进行数据库变更发布_java_11


结论


以安全可靠的方式将软件交付给生产是一个难题。更糟糕的是,今天可用的工具只能解决一小部分问题。 Spinnaker 是一种减轻这种负担的方法,而不必像 Jenkins 一样将多个脚本和系统与 CI 平台粘合在一起。通过使用 Spinnaker Pipeline,我们可以使用现成的普通阶段来构建简单或复杂的部署,以满足您的公司的需求。