Netflix 的上线工具 Spinnaker

《Netflix 的上线工具 Spinnaker》要点:
本文介绍了Netflix 的上线工具 Spinnaker,希望对您有用。如果有疑问,可以联系我们。

Spinnaker 的介绍

Spinnaker

Spinnaker 是 Netflix 开源出来的持续交付工具,目的是为研发团队提供灵活的持续交付流水线,并且支持部署到测试/生产环境.Netflix 目前通过 Spinnaker 实现每天4000次的发布.它的优势在于:

  • 支持多种云平台.

    目前支持 AWS EC2(Netflix 的机器大部分都在亚马逊),谷歌云,Kubernetes,Azure,Openstack 等,目前正在支持甲骨文的物理机和 DC/OS.

  • 自动化发布.

    可以集成测试脚本进行测试,并且能够管理测试,线上环境的机器,实现动态扩容,和服务的下线.

  • 发布原子化.

    由于 Netflix 的平台已经实现微服务化,每个团队使用 Spinnaker 独立维护服务的发布,所以 Spinnaker 的设计特别适合于微服务持续交付的场景.

  • 预置了软件发布的最佳实践.

    通过脚本实现不可变基础设施,使得发布时候能够更容易的进行回滚,和扩容.当你的团队还在为每个应用写脚本支持蓝绿发布时,Spinnaker 已经提供了从界面上进行蓝绿发布,金丝雀发布等策略的配置.

  • 社区强大.

    Netflix,谷歌,微软等等都已经在社区贡献代码.

Spinnaker 的组成

查看 Spinnaker 的源码:https://github.com/spinnaker 可以发现,Spinnaker 的实现本身也是微服务架构,这样就意味着 Spinnaker 本身可以轻松的实现扩容和滚动升级.Spinnaker 的微服务数量也达到10个左右,目前比较核心的模块有以下几个:

  • Clouddriver

    顾名思义,是和底层 IaaS 打交道的模块,主要负责底层资源的读写,它对接了底层的云提供商: AWS,CloudFoundry 和 Azure 等等.

    以 Kubernetes 的对接为例,Clouddriver 通过 Cloud Provider Agent 实现了缓存,部署,实例,负载均衡,安全组和集群的对接,工作量还是很大的.

  • Deck

    Spinnaker 的 UI 层,使用 TypeScript + AngularJs 开发,支持扩展.

  • Gate

    Spinnaker 的 API 网关层,它为其他服务提供的 API 的接入,使用 Eureka 和 OKClient 实现.

  • Orca

    任务编排引擎,目的是为 Spinnaker 提供一个流水线,将构建包从一个 Stage 升级到另一个 Stage,并且和其他服务进行协同工作.

  • Igor

    Spinnaker 的 CI 工具,Igor 提供的是统一的 CI 工具接口(Jenkins,Travis 以及 Git 仓库),并且记录 Jenkins 的认证信息.在配置 Igor 项目时,需要将 Jenkins 的登录信息配置在 yml 文件里.

使用 Spinnaker 进行持续发布

持续发布

部署管理:

Spinnaker 提供了可视化的 CI 任务编排功能,类似于 Jenkins 的 Pipeline 功能.编排支持多种方式,包括:并行,串行,分支,人工决策点等等.在每个节点执行的操作都可以是一个 Jenkins 的任务,或者是脚本,定时任务.

一个通用的发布流程如下:

  1. 使用 Nebula (Netflix 打包工具)进行编译打包.
  2. 使用 Bake 将包打成一个镜像,或者 RPM 包.
  3. 并发测试这个包,集成测试,系统测试等等.
  4. 金丝雀发布,此阶段将包发布到集群里1%的节点,并且设置一个人工决策点.
  5. 1%的机器测试通过后,进行人工决策,将包发布到其他集群节点.

注:Netflix 的流程里大部分是没有人工决策点的.

集群管理:

Spinnaker 的集群管理组件能够管理以下资源:服务器组,集群,应用,安全组.用这些组件来屏蔽的底层 IaaS 资源的差异.

Spinnaker 部署策略

蓝绿部署:

部署

由于 Spinnaker 已经接管了底层的云平台资源,所以它能够实现软件部署的调度.从上图可以看到,在软件发布新版本时,我们可以为一个新集群上线新版本,将老版本的服务停掉.一旦新版本发现问题,我们可以通过 UI 上的 Rollback 按钮实现回滚.

金丝雀发布:

Netflix 进行大量的自动化金丝雀发布(ACA – Automatic-Canary-Analysis),目前并没有开源这个功能.但是 Google 和 Netflix 正在一起协同开发,计划把这部分代码开源出来.

Netflix

金丝雀发布如何实现自动化?难点在于自动化评估1%节点部署的结果.Spinnaker 在发布1%集群的节点之后,ACA 会进行一系列的监控,包括用户的行为是否异常,流量的访问是否存在较大波动,最好会为这次发布计算出一个分数,这个分数就成为继续发布到10% 集群机器的数据依据,只要分数大于这个值,就能继续发布到剩余的机器.

其他功能

即时通信工具集成 – Slack

 Slack

Netflix 最开始是用邮件通知构建发布的结果,后来发现邮件根本没人看,于是 Spinnaker 和 Slack 做了集成,任何发布消息都会推送到 Slack 的群聊里.好处是如果有人工的决策点需要审核,在 Slack 里可以得到及时的通知.

支持Chaos Monkey:

Netflix 的上线工具 Spinnaker

Chaos Monkey 之前文章有讲过,它负责在线上环境里随机的关掉某几台机器,从而进行服务高可用的测试,没有经历 Chaos Monkey 测试的服务不是好服务.

使用 Artifactory 进行软件包管理:

Netflix 是 Artifactory 的重度用户.Netflix 在部署包/镜像到生产环境时,不会重新构建,而是从测试环境找到包,复制到生产环境.这就需要包管理平台的支持,Netflix 使用 Artifactory 作为统一包管理平台,记录包的发布元数据,例如包经过了哪些测试,被部署到了哪些测试环境/生产环境.当服务需要扩容或者回滚时,根据AQL(Artifactory Query Language)进行元数据查询,找到需要扩容或回滚的包.

总结

Spinnaker 作为持续交付平台,已经被 Netflix 内部上百个团队使用,并且在生产环境里的进行了验证,同时社区也非常的活跃.

不过使用 Spinnaker 也有一些门槛,首先你需要有自动化构建,测试的流水线进行软件升级(Promotion),其次,需要让 Spinnaker 接管公司的云平台,用代码描述环境,并且已经用脚本/CMDB 实现软件在不同环境的部署,升级,回滚.如果你的公司内部有多个 Cloud Provider,并且希望实现可重复的持续交付流水线,可以考虑使用 Spinnaker 实现统一持续交付.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


起步 处理器架构,参考 x86是指intel的开发的一种32位指令集 intel和amd早期的cpu都支持这种指令集 AMD比Intel率先制造出了商用的兼容x86的CPU,AMD称之为AMD64 Intel选择了设计一种不兼容x86的全新64为指令集,称之为IA-64,后来支持AMD64的指令集,
pscp pscp -P 22 C:\work\test.txt root@192.168.1.5:/home/data pscp -P 22 root@192.168.1.5:/home/data/test.txt C://work// 检索 find / -name default.config
文件处理 ls -a # 显示所有文件 ls -l # 显示详细信息 ls -d # 显示路径 mkdir /目录名称 # 创建目录 cd /目录名称 # 切换目录 pwd # 显示当前路径 rmdir /目录名称 # 删除目录 cp -rp [目录名称] [目标目录] # 复制目录到目标目录 cp
准备一台电脑(我就用联想拯救者r7000演示) 参考博客制作启动盘 插上U盘,启动电脑,一直按F2 进入如下页面后,将U盘设置为第一启动项,点击exit,保存并退出 之后进入如下页面,选择第三项 进入如下页面,选择第四项 进入如下页面,选择第一项,选中后,先不要点Enter 按e键,将inst.st
认识 Linux系统是参考了UNIX系统作为模板开发的,但没有使用UNIX的代码;是UNIX的一种,但不是衍生版 在Linux内核的基础上开发是发行版 分区 逻辑分区永远从5开始 步骤 挂载:可理解为分配盘符,挂载点即是盘符名;不同之处:Linux中是以空目录名称作为盘符 Hda 第一块硬盘 Hda
文件处理命令 以 . 开头的文件是隐藏文件 以 - 开头表示这是一个文件 以 d 开头表示是一个目录 以 l 开头表示是一个软链接 第一个root是所有者,第二个root是所属组 ls -h 以文件默认大小后缀 显示 ls -i 查看i节点(唯一标识) 所有者:只能有一个,可变更 所属组:只能有一个
参考 01 02 03 前提环境 本地安装VirtualBox,并安装CentOS8,配置网络后,window系统上putty能连接到CentOS8服务器 配置步骤 右键服务器复制 启动复制后的服务器,查看ip和hostname发现和原来的服务器一样,需要修改 hostname # 查看主机名 vi
文件搜索命令 星号匹配任意字符,问号匹配任意单个字符 -iname 根据文件名查找且不区分大小写 -ok 命名会有一个询问的步骤 如果没有找到指定文件,可输入命令:updatedb 更新文件资料库;除tmp目录不在文件资料库收录范围之内 locate -i 文件名 # 检索时不区分大小写 which
安装环境 安装最新版的Virtual Box,点击安装 下载centos8镜像 创建虚拟机,可参考 选择下载到本地的镜像 设置启动顺序 点击启动 启动过程中报错:“FATAL:No bootable medium found!” 1.没有选择iso镜像 2.光驱没有排在第一位置 3.镜像只能选择x8
Linux严格区分大小写 所有内容文件形式保存,包括硬件 Linux不靠扩展名区分文件类型 挂载:将设备文件名和挂载点(盘符)连接的过程 Linux各个目录的作用 bin表示二进制 服务器注意事项 远程服务器不允许关机,只能重启 重启时应该关闭服务 不要在服务器访问高峰运行高负载命令 远程配置防火墙
IDE连接Linux,上传下载文件 参考1 参考2 连接Linux 上传下载文件 本地项目打包后上传 查看是否上传成功,右键下载 补充 后端项目开发完成后,需clean掉临时文件target文件夹,且只推送修改过的文件 前端项目开发的过程中,需要在每个子组件中使用scoped,确保每个子组件中的编码
起步 LTS与普通版本的区别 LTS版本的发布周期更长,更加稳定 安装jdk sudo mkdir /usr/lib/jvm # 在Ubuntu中创建目录 pscp D:\安装包\linux源码包\jdk-8u291-linux-x64.tar.gz chnq@192.168.0.102:/tmp
前言 最近在b站上看了兄弟连老师的Linux教程,非常适合入门:https://www.bilibili.com/video/BV1mW411i7Qf 看完后就自己来试着玩下,正好手上有台空闲的电脑就尝试不使用虚拟机的方式安装Linux系统 安装步骤 制作启动盘 下载ISO镜像,我这里下载的是Cen
新建虚拟电脑 设置内存和处理器 设置硬盘大小 完成 设置 查看光驱 设置启动顺序 点击启动 选择第1项 进入图形安装界面 选择安装位置,开始安装 设置root密码 重启 登录 查看本地文件夹 配置网络,点击设置 查看宿主机ip C:\Users\ychen λ ipconfig 无线局域网适配器 W
源码包安装需手动下载后安装 二进制包则在package目录下 rpm命令管理rpm包 若某个rpm包依赖于某个模块,需要到网站www.rpmfind.net查询该模块依赖的包,安装这个包后自动安装模块,之后就能安装rpm包了 安装升级时使用包全名 查询卸载时使用包名 虚拟机中的Linux系统安装rp
首先进入命令模式,再输入以下命令 命令模式用于输入命令 插入模式可对文件编写操作 编辑模式下的命令是在冒号后输入 :12, 15d # 删除指定范围的行,这里是删除12到15行 :n1,n2s/old/new/g ## 表示从n1行到n2行,old表示旧的字符串 vim使用小技巧:自定义快捷键,如快
使用源码包安装,需要自己指定安装位置,通常是 /usr/local/软件名/ linux中要想启动执行文件,应使用绝对路径 /绝对路径/rpm包名 start ## 执行方式一 service rpm包名 start ## 执行方式二 使用源码包安装后,由于自定义安装路径,就不能使用service命
网络命令 在收邮件的用户中,输入 mail 可查看邮件信息,输入序列号查看详细信息 在mail命令下,输入h 查看所有邮件的列表 输入:d 序列号 # 删除邮件 last # 统计所有用户登录或重启时间,用于日志查询 lastlog # 显示包括未登录用户的登录时间 lastlog -u 用户id
若要使用yum管理,必须能连接网络,首先配置网络IP 进入yum源文件中启动容器 使用yum源头安装rpm包不需要进入package路径,同时也不需要使用包全名,会有yum自动管理 安装软件组
简介 client即是本机安装的docker,相当于git Docker_host相当于centos系统 registry则是docker仓库,相当于GitHub 镜像用于创建docker容器,一个镜像可以创建多个docker容器 容器是由镜像创建的运行实例,(镜像相当于类,容器相当于类创建的对象)