K8S 实用| 献给初学者的 Spinnaker 指南
技术
作者:夏天
译者:
2018-01-15 06:48

无论是在 Kubeweekly 还是 The New Stack,Spinnaker 的“上镜率”越来越高。如果您最近经常看到 “Spinnaker” 这个词跳到眼前,想要一探究竟;如果您正计划进行多云部署或部署云原生应用程序,缺少得力工具;如果您很想在 Kubernetes 中开启 Spinnaker 之旅,那么不妨就从这篇文章开始吧!


关于 Spinnaker


1.蜕变自 Asgard

作为一家在线影片租赁提供商,Netflix 自然精于网络规模部署。自 2011 年创建 Chaos Monkey 开始,公司一直在为开源生态系统做贡献。2012 年,为了使 Amazon Web Services 的部署自动化,向 AWS 的内部团队公开一致性的部署经验,Netflix 开发了 Asgard 。Asgard 包括 Amazon Machine Images(AMI)、Elastic Cloud Compute(EC2)实例、自动扩展组、启动配置和弹性负载均衡器。


2015 年,Asgard 的开发人员开始将软件移到 AWS 之外,用来支持 Google Cloud 和 Microsoft Azure。Asgard 的 Multicloud 演变成一个全新的工具叫做 Spinnaker。在目前的版本中,Spinnaker 支持各种部署目标,包括主流云和容器平台,比如 OpenStack、DC / OS、Kubernetes 和 Cloud Foundry。


2.Spinnaker 功能

无论目标环境如何,Spinnaker 部署优势始终如一,它的功能如下:

  • 通过灵活和可配置 Pipelines,实现可重复的自动化部署;
  • 提供所有环境的全局视图,可随时查看应用程序在其部署 Pipeline 的状态;
  • 通过一致且可靠的 API ,提供可编程配置;
  • 易于配置、维护和扩展;
  • 具有操作伸缩性;
  • 兼容 Asgard 特性,原用户不用迁移。

作为一个持续交付平台,Spinnaker 支持自动化多种云部署,它还可以通过强大的 Pipeline 功能进行持续部署。Spinnaker 可以为每个目标环境打包应用程序,例如二进制文件和容器镜像。举例来说,它可以通过构建 AMI 在 EC2 中进行部署,同时将相同的应用程序打包为可在 Kubernetes 中运行的一组 Pod。它可以无缝集成其他持续集成(CI)流程,如 git、Jenkins、Travis CI、Docker registry、cron 调度器等,帮助运营团队在跨阶段和生产环境中管理部署方面,获得最终控制权。




Spinnaker 建议运营团队使用不可变的基础设施(Immutable Infrastructure),这样就可以永远不必使用 SSH 来管理那些通过 Spinnaker 部署的虚拟机。如果虚拟机的健康状况没有显示“绿色”,说明运行状况检查失败,这时 Spinnaker 会自动启动一个新的虚拟机,并停止将流量发送到不健康的虚拟机上。


使用 Spinnaker 最大的好处就是,团队永远不必管理每个目标环境中的个人资源。每个人都可以自主使用 Spinnaker 注册目标平台,并用界面来设定部署策略和 Pipeline Stages。相信不久的将来,各个组织在处理目前各种云原生应用程序时,都能发现 Spinnaker 对管理端到端的应用程序生命周期是非常有效的。


设置 Spinnaker 


Spinnaker 可以通过模板在 AWS,Azure 和 GCP 中轻松设置。它在 AWS 中可用作 CloudFormation 模板,在 Azure 中可作为 Azure 资源管理器模板以及 GCP 中充当 Deployment Manager 模板。



如果您不想使用现有模板,则可以使用名为 “Halyard” 的工具在 Ubuntu 14.04 上设置并配置 Spinnaker。Halyard 可以通过抽象安装 Spinnaker 所涉及的细节来简化安装。在目前的形式下,Spinnaker 的安全性还不够好,无法暴露在公共互联网上。另外,与 LDAP 的集成和对标准认证机制支持仍在探讨中。建议如果部署在公有云环境中时,最好通过基于 SSH 的端口转发或 VPN 进行访问。


由于 Spinnaker 是基于一组 Docker 容器构建的微服务应用程序,因此可以将其部署在 Docker Swarm 或 Kubernetes 集群中


Spinnaker 管理部署


您可以将 Spinnaker 视为在目标部署中部署应用程序工件的中间件。它是连接两个源代码和生产环境的工具。要想使用 Spinnaker, 您首先应该注册目标部署平台——虚拟机,PaaS 或容器编排引擎,然后设定多个阶段的 Pipeline,在一个或多个目标部署中部署应用程序。


一旦在 Spinnaker 注册了目标部署环境,您就可以创建以下资源(映射到副本)到目标环境中:

  • 负载均衡器:这是应用程序最终可用的端点。在 Kubernetes 世界中,它可以转化为一种服务。在 AWS 中,它应该是一个 Elastic Load Balancer。
  • 安全组:安全组是一组防火墙规则,可以定义网络访问权限。
  • 应用程序:应用程序是集群的逻辑组。
  • 集群:Spinnaker 集群是与部署关联的一组计算资源。它通常代表一个明确的、孤立的环境,如开发、测试或生产等。每个集群可能有一个或多个服务器组。集群可以根据每个服务器组的所需状态进行配置。
  • 服务器组:服务器组是一个弹性部署单元,由细粒度的计算资源(例如通过单个负载均衡器暴露的 VM 或 Pod)构成,并由安全组控制。每个服务器组都具有定义所需状态的最小和最大数量的计算资源。在 AWS 中,服务器组映射到 Auto Scaling Group(ASG)。在 Kubernetes 中,它转换为副本集。

尽管这些术语似乎受到 EC2 很深的影响,但与 EC2 不同,Spinnaker  用于配置 PaaS 环境(如Google App Engine 或 Cloud Foundry)以及容器编排工具(如 Kubernetes 和 DC / OS)。Spinnaker 使用上面定义的资源来管理应用程序部署。一旦注册和配置完成,就有可能实现各种模式部署,如蓝绿部署和 Canary 部署。



在配置目标环境后,DevOps 团队将创建 Pipeline ,把程序部署到这些环境中。

  • Pipelines:Pipelines 是在 Spinnaker 中定义部署策略的关键。它们是由被称为“Stage”的行动序列组成。用户可以沿着 Pipeline 从一个阶段到另一个阶段传递参数。Pipelines 是手动启动的,或者可以配置为通过自动触发事件启动,例如 Jenkins 作业完成后,注册表中会出现一个新的 Docker 镜像,一个 cron schedule 或者处在完成阶段的另一个 Pipelines。Pipelines 通过电子邮件,SMS 或 HipChat 在 Pipelines 执行期间的各个时间节点(例如 Pipelines 启动/完成/失败)向感兴趣的各方发送通知。



  • Stage:在 Spinnaker 中 Stage 是构成 Pipeline 基本构建块的动作。尽管某些 Stage 排序可能更常见,但是 DevOps 团队按任意顺序对 Pipeline 中的一系列 Stage 进行排序。Spinnaker 提供了如 Deploy、Resize、Disable、Manual Judgment 等多个 Stage。举例来说,一个部署 Stage 可以被配置到其中一个目标服务器组中去,同时可以使用另一个 Stage 手动触发生产集群中最新版本的滚动升级。


  • Strategies: Spinnaker 中 Strategies 就是如何进行特定的部署。Highlander 部署策略会将新版本推送到一个服务器组中,当它变得健康时,会自动终止运行以前版本的服务器组。Red/Black 策略提供了一种通过使两个版本同时运行,来执行蓝/绿部署的机制。滚动推送通过平稳地删除以前的版本,并用新版本替换它来执行滚动升级。

 开启 Spinnaker 之旅


从版本 1.3 开始,Kubernetes 提供了 Minikube 工具,让开发者和 Devops 工程师可以在本地主机上运行单节点的小型集群。接下来本文将引导您,在 Minikube 上设置和配置 Spinnaker


1.安装并配置 Minikube

Spinnaker 被设计为云本地微服务应用程序。它自带一组资源密集的容器。典型的 Minikube 安装不能支持 Spinnaker 在本地运行提供。必须自定义 Minikube 配置,才能让其足以支持 Spinnaker。或者,您可以将 Spinnaker 安装在节点至少具有 4GB RAM 的 Kubernetes 群集上。


用于托管 Kubernetes 的 Google Kubernetes Engine 或 Azure 容器服务都是此配置的理想选择。由于 Minikube 既免费又简单,我们乐于使用它来配置 Spinnaker。但是,不建议将此配置用于生产


运行以下命令在 macOS 上安装 Minikube:



我们还需要升级到最新版本的 Kubectl 来管理 Kubernetes 集群。安装步骤如下:



一切准备就绪,让我们开始运行 Minikube!首先,我们需要确保 Minikube 虚拟机配置至少有 4GB RAM 和 4 核 CPU 。



如果您不想永久保存配置,也可以使用以下参数启动 Minikube:




等待单节点 Kubernetes 集群启动,并验证安装。如果这是您第一次启动 Minikube,它将在启动集群之前下载 ISO 文件。



2.安装 Helm

有了 Helm,在 Kubernetes 中安装应用程序就变得非常简单。每个应用程序都可以打包成一个 Chart,一个可部署的 Helm 单元。在安装 Spinnaker Chart 之前,我们需要在 Kubernetes 上设置 Helm。首先,下载最新版本的 Helm 二进制文件并将其移动到 bin 文件夹中。





我们现在将安装 Helm 并验证。



Tiller(Helm 服务器端组件)已经被安装到你的 Kubernetes 集群中。



以上输出可以确认 Helm 的服务器端组件 Helm 和 Tiller 已正确安装。Tiller 作为 Kube-system Namespace 中的 Kubernetes Pod 和 Service 运行。


3.安装 Spinnaker

随着 Minikube 和 Helm 的安装和运行,是时候安装 Spinnaker 了。由于它可以作为 Helm Chart,我们将通过几个步骤来完成。

在部署 Spinnaker 之前,我们需要一个 YAML 格式的配置文件,它将提供一组初始配置值。从 Github Spinnaker Helm Chart  Repo 中 抓取这个文件。

https://github.com/kubernetes/charts/tree/master/stable/spinnaker



是时候安装 Spinnaker 了。运行以下命令将其部署到 Kubernetes 集群中。



该 -f 参数指向安装到保存在 values.yaml 的默认配置。该 -timeout 参数将强制 Helm 在出现超时错误而中止前,等待至少五分钟。本教程使用 -version 开关提到的版本 0.3.5 进行测试。最后,我们在通过 -namespace 开关配置的名为 spinnaker 的专用 Namespace 中安装 Helm Chart 。几分钟后,我们会看到下面的输出,确认 Spinnaker 的安装。



如果看到超时错误,使用 helm del -purge kubelive 命令删除图表,然后再次运行安装命令。与 Spinnaker 相关的所有资产都部署在 Kubernetes 集群的 spinnaker namespace 中。我们可以用下面的命令验证它:



在使用浏览器访问 Spinnaker dashboard 之前,我们需要通过运行以下命令启用端口转发。这将运行 Spinnaker Web UI 的 Pod 暴露给主机。



现在可以通过访问 http:// localhost:9000 来进入 Spinnaker。



3.Spinnaker 部署和实现容器应用的弹性伸缩

让我们通过部署一个简单的 Nginx Web 服务器来熟悉 Spinnaker 的概念和术语。首先在右上角的Actions 菜单下单击 Create Application 创建应用程序。这里的 Application 是各种资源(如负载平衡器,安全组,服务器组和群集)的逻辑集合。



我们来创建一个负载平衡器,通过它可以访问应用程序。点击顶部菜单栏上的 Load Balancer,然后点击Create Load Balancer 按钮。




创建新的负载均衡器时,输入 “prod” 作为 stack 名称,“80” 作为目标端口,然后选择 NodePort 作为类型。完成后点击 Create 按钮。



在 Clusters 下,单击 Create Server Group。



在创建新的服务器组时,键入 “prod” 作为 stack 名称。从下拉列表中选择 nginx:latest 作为容器。选择 nginx-prod 作为我们在上一步创建的 Load Balancer。输入 “10” 作为容量。



在 Container 设置下,选择 Probes 创建 “Readiness Probe” 和 “ Liveness Probe”。最后,点击 Create 按钮。



等待服务器组中的实例可用(红色块表示实例还没有准备好)。




切换到终端,执行以下命令获取服务的 NodePort。



在 Spinnaker 中创建的负载均衡器被转换为 Kubernetes 中的 NodePort 服务。我们现在通过 Minikube 命令直接访问它。




运行 kubectl get pods 会显示从 Nginx 容器创建的 10 个 Pod。



在 Spinnaker dashboard 中扩展服务器组也证实了这一点。



参考原文:https://thenewstack.io/getting-started-spinnaker-kubernetes/https://thenewstack.io/meet-spinnaker-ultimate-multi-cloud-deployment-tool/





END

977 comCount 0