【编者的话】这片文章在上一篇的基础上着重介绍了如何在 Minikube 环境下部署一个 Spinnaker,Spinnaker 的安装过程稍显曲折,主要是因为它的组件比较多,有自动化安装工具,但需要“科学上网”。笔者也是最近在一个非常偶然的情况下听说的这个东西,其实最开始是想做一个 MSP(cloud manage service provider)系统,后来发现这个正是我当时想要的。我认为随着国内外公有云的大行其道,很多中小规模的互联网公司已经不在考虑传统的运维模式了(我所谓的传统运维指的是:自己设置 IDC 机房,然后雇一票人从 LaaS 层开始,从准备机柜,物理机上线,安装 OS,然后装 OpenStack 或者 ESXi,再找个 DBA 去部署数据库等等……)Spinnaker 的目标在于让用户部署与实际的 LaaS 层解耦,把你的一套系统部署到多个 LaaS 提供商上去(例如 AWS,GCP 或者国内的阿里云、腾讯云),甚至在它们之前做一个负载均衡,如果你的应用同时部署在两个提供商的 LaaS 层上,除非你的应用本身不稳定,否则你服务 HA 的指标应该可以大大提高,因为两个 LaaS 同时挂掉的可能性实在太小了。

在上一片文章中, 我们介绍了如何让 Spinnaker 作为一个多云平台部署工具。这次我们将讲解如何在 Kubernetes 上创建一个 Spinnaker,并且通过它部署一个应用程序。

在这篇文章中,我将带你一起在 Minikube 上创建并配置一个 Spinnaker。一旦它运行起来,我们就会部署一个容器化的应用程序。

Spinnaker 经常被安装在以 Ubuntu 14.04LTS 为操作系统的虚拟机上。感谢 Helm 社区,让安装仅仅需要一条命令就可以完成。


安装并配置 Minikube


Spinnaker 是作为一个 Cloud-Native、微服务的架构。它有一组资源密集型的容器。典型的 Minikube 安装不提供足够的能力来运行 Spinnaker。我们会通过配置去 Minikube,让它能去支撑起 Spinnaker。

当然,你也可以在至少有4GB内存的 Kubernetes 集群节点上去安装 Spinnaker。谷歌的 Kubernetes 和 Azure 的 Kubernetes 容器托管服务是此配置的理想选择。因为 Minikube 免费并且简单,所以我们用它去配置 Spinnaker。当然这个环境不推荐用于生产。

在 MacOS 中运行如下命令去安装 Minikube:


在 Kubernetes 上部署 Spinnaker_java


我们还需要 Kubectl 的最新版去管理 Kubernetes 集群。你可以用下面的命令安装它:


在 Kubernetes 上部署 Spinnaker_java_02


当你把上面的完成了,下面就可以开始执行 Minikube了。

首先,我们得确定运行 Minikube 的虚拟机至少有 4GB 内存和4 Core CPU。可以用下面的命令设置:


在 Kubernetes 上部署 Spinnaker_java_03


如果你不想保存这个配置,你也可以用下面的命令启动 Minikube:


在 Kubernetes 上部署 Spinnaker_java_04


在 Kubernetes 上部署 Spinnaker_java_05


当一个单个节点的 Kubernetes 集群启动完毕,安装结束。你可以看到上面的信息。如果这是在你的电脑上第一次运行 Minikube,那么会在这个过程中下载 ISO 文件。


在 Kubernetes 上部署 Spinnaker_java_06


安装 Helm


Helm 让我们在 Kubernetes 上安装应用程序非常容易。每一个应用程序被打包成一个 Chart,它是 Helm 部署应用的最小单位。所以在安装 Spinnaker 之前,我们还需要在 Kubernetes 上部署 Helm。

下载最新版本的 Helm 并且把它放到 Bin 目录下:


在 Kubernetes 上部署 Spinnaker_java_07


在 Kubernetes 上部署 Spinnaker_java_08


在 Kubernetes 上部署 Spinnaker_java_09


我们现在初始化 Helm,并验证一下安装的正确性。


在 Kubernetes 上部署 Spinnaker_java_10


这个时候 Tiller(也就是 Helm 的服务器端)就已经安装在你的 Kubernetes 集群上了。


在 Kubernetes 上部署 Spinnaker_java_11


你可以运行上面那个命令去确认 Helm 和 Tiller 已经安装正确。这里,Tiller 是以 Kubernetes 中一个 Pod 的形式运行的,服务暴露在 Kube-System 这个 Namespace 里。


在 Kubernetes 上部署 Spinnaker_java_12


在 Kubernetes 上部署 Spinnaker_java_13


当你创建了一个新的负载均衡器,输入 Prod 作为堆栈的名字。80端口作为 Target Port,并且选择 NodePort 类型,点击 Create 按钮。

安装 Spinnaker


当你的 Minikube 和 Helm 已经能够正常运行的时候,我们就可以安装 Spinnaker 了。由于它在 Helm 的 Chart 里,我们可以通过下面的步骤来完成。

在我们部署 Spinnaker 之前,我们需要一个 YAML 格式的配置文件,它会包含了一些配置信息。可以从 Spinnaker Helm Chart Repository 获得这个文件。


在 Kubernetes 上部署 Spinnaker_java_14


现在我们可以安装 Spinnaker 了。用下面的命令可以把它部署在我们的 Kubernetes 集群里:


在 Kubernetes 上部署 Spinnaker_java_15


这里的 -f 参数的意思是指出安装的配置文件。--Timeout 会让 Helm 在遇到错误的时候等待至少300秒再退出。这片文章中我们用的是0.3.5的版本,是用 --Version 指定的。最后我们用 --Namespace 指定了安装 Spinnaker 的 Namespace。

过了一会儿,我们应该可以看到下面的输出。


在 Kubernetes 上部署 Spinnaker_java_16


如果你遇到错误超时退出,可以用 Helm Del --Purge Kubelive 命令去删除,并且重新运行安装命令。

所有的 Spinnaker 的相关组件都已经部署到了 Spinnaker 的 Namespace 里了,我们可以用下面的命令去确认。


在 Kubernetes 上部署 Spinnaker_java_17


在我们通过浏览器访问 Spinnaker 之前,我们需要用下面命令打开端口转发功能。也就是说这个命令将会把 Spinnaker Web UI 的端口映射到主机的端口上。


在 Kubernetes 上部署 Spinnaker_java_18


在 Kubernetes 上部署 Spinnaker_java_19


现在可以通过 http://localhost:9000 去访问 Spinnaker 了。


通过 Spinnaker 去部署一个容器化的应用


在 Kubernetes 上部署 Spinnaker_java_20


现在我们在这个 Application 里去创建一个负载均衡器。单击菜单顶部的"Load Balancer",并且点击“Create Load Balancer” 按钮。


在 Kubernetes 上部署 Spinnaker_java_21


 Clusters 里,选择 Create Server Group

在 Kubernetes 上部署 Spinnaker_java_22


在下拉框里选择 Nginx:Latest 作为容器。选择 Nginx-Prod 作为负载均衡器,输入10作为副本数。


在 Kubernetes 上部署 Spinnaker_java_23


在 Container 设置里,选择 Probes 去创建 Readiness Probe Liveness Probe。最后点击 Create 按钮。


在 Kubernetes 上部署 Spinnaker_java_24


当这个实例在 Server Group 里状态变成可用,如果是红色则代表这个实例还是不可能的状态。


在 Kubernetes 上部署 Spinnaker_java_25


在 Kubernetes 上部署 Spinnaker_java_26


切换到终端,并且运行下面命令可以得到服务的 NodePort。


在 Kubernetes 上部署 Spinnaker_java_27


这个负载均衡器已经被 Spinnaker 创建好,并且通过 Kubernetes 的 NodePort 对外提供访问。我们现在可以直接通过 Minikube 的命令访问了。


在 Kubernetes 上部署 Spinnaker_java_27


在 Kubernetes 上部署 Spinnaker_java_29


运行 Kubectl Get Pods 可以显示一共有10个 Nginx 的 Pod 被创建出来了


在 Kubernetes 上部署 Spinnaker_java_30


在 Spinnaker 的仪表板扩展服务组(Server Group)一样相同。


在 Kubernetes 上部署 Spinnaker_java_31


这篇文章涵盖了在开发环境中,使用和运行 Spinnaker 的所有步骤。在本系列的下一篇文章里,我们会用 Spinnaker 去建立一个 End-To-End 的 CI/CD Pipeline 环境,然后去发布一个应用的蓝绿部署。敬请关注!