Nomad 产品调研

1,299 阅读7分钟

1. 写在最前面

「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!

上周做了一次公司内部的分享,发现大家对于现有的部署方法上吐槽很多,「凡是有不和平的地方,我们都要为和平努力」。所以作为一只勤勤恳恳的打工人,打算试水使用开源平台发布的方式,但是 k8s 的学习曲线真的有点高,打工人真的是太难了。

在笔者 google 的过程中, Nomad 脱颖而出,还支持 二进制和多平台部署,没错就是你了。

2. 介绍

一个简单而灵活的工作负载编排工具,用于跨本地和云大规模部署和管理容器和非容器化应用程序。优势:

  • 简单轻便:集成到现有基础架构中的单个二进制文件。易于在本地或云端操作,开销最小。
  • 灵活的工作负载支持:编排任何类型的应用程序,不仅仅是容器。对 Docker、Windows、Java、VM 等都可支持。
  • 无需重写即可现代化遗留应用程序:为现有服务带来编排优势。无需容器化即可实现零停机部署、更高的弹性、更高的资源利用率等。
  • 大规模轻松联合:用于多区域、多云联合的单一命令。使用 Nomad 作为单个统一的控制平面,将应用程序全局部署到任何区域。
  • 轻松部署和扩展:像在云环境中一样轻松地部署到裸机。无需复杂即可在全球范围内扩展。参考 the 2 Million Container Challenge.
  • 与 Terraform、Consul 和 Vault 原生集成:Nomad 与 Terraform、Consul 和 Vault 无缝集成,提供服务网络和密钥管理。

注:以上摘自 Nomad 官网。灵活部署多种类型的程序以及多平台,可以说是 Nomad 的绝对优势了。

3. 内部介绍

3.1 基本概念

工作负载编排本质上解决的问题是「用户需要什么平台操作,将什么类型的服务部署到什么地区」。

Nomad 概念介绍.png

3.1.1 平台

Nomad 平台,由两部分组成。

  • Client:以 agent 的形式部署在等待分配服务运行的机器上,用于统计机上已使用和待使用的资源信息,需要注册到 Nomad Server

  • Server:以集群的方式部署,管理所有运行的服务信息,集群节点之间通过 raft 一致性算法来同步信息,确保可用性, 集群部署建议网络延迟在 10 millisecond

注:服务端部署机器的参数限制

3.1.2 服务

Nomad 对于服务的抽象很有趣,个人觉得因为 docker 已经先入为主,占领了大部分的市场,所以这里在抽象的时候很多概念都会借鉴 Docker 上已经存在的概念。

注:此处的服务可以指单个的服务,也可以指一组相互关联的服务。

  • Job:一组待运行的服务的逻辑单元,可以指定需要部署的 Regions 和 DataCenters 属性等。
  • Task Group:一组有关联性的服务,将会部署到一台 Client 机器上。
  • Task:真实的待运行的服务,可以指定部署的服务类型包括 Docker、QEMU、Java 和 Static binaries。
    • 注:部署的类型通过 Driver 的配置指定。

3.1.3 地区

Nomad 支持跨本地和云平台,所以在地区的抽象上,使用了 Regions 和 Datacenters 的概念。

  • Regions:一个 Region 包含多个数据中心,一组 Nomad Server 联合在一起代表一个 Region。
  • Datacenters:Nomad 的 Client 不需要与服务部署在同一个数据中心,但是需要部署在同一个 Region。Datacenters 可以理解成划分集群的一种方式。

3.1.4 其他的抽象概念

  • Allocation:Allocation 可以理解成一种映射,将 Job 中的 Task Group 分配到 Client 的节点上。单个 Job 可能具有数百或者数千的 Task Group,这意味着必须存在同等数量的分配才能将 job 映射到 Client。Allocation 是由 Nomad 服务器创建的,作为评估期间作出决策调度的一部分。
  • Evaluation:Evaluation 是 Nomad 做出调度决策的机制。当期望状态(作业)或实际状态(客户端)发生变化是,Nomad 创建一个新的 Evaluation 来确定是否需要采取操作。如果需要,Evaluation 可能会导致 Allocation 发生。
  • Bin Packing:Bin Packing 是将物品装满箱子的过程,以最大限度地提高箱子的利用率。这扩展到 Nomad,其中 Client 是 「Bin」,Task Group 可以理解成物品。Nomad 通过有效的装箱算法,将 Job 发送到 Client 上。

3.2 调度策略

调度是 Nomad 的核心功能。它指的是将 Job 分配到 Client 的过程。它的设计和实现是受到 Google 的 Omega 和 Nomad 鼓励。

核心的调度图参考下面(ps 如果理解清楚上面的概念,理解上应该会更好上手。

调度策略.png

3.2.1 抢占式调度

用户在创建 Job 的时候,可以指定 Priority 参数来配置该 Job 的优先级。抢占允许 Nomad kill 掉现有的 Job,以便为更高优先级的 Job 提供运行资源。抢占允许在整个集群资源竞争的情况下也运行高优先级的任务。

详细见:Preeption

3.2.2 可用性

Nomad 使用了两种一致性协议。

  • Raft Protocol:用于在单 Region 的集群模式下,节点之间信息的同步。
  • Gossip Protocol:用于在多 Region 的集群模式下,允许服务器执行跨Region Job 部署请求、处理整个 Region 失联失联的情况

详细见:

注:靠不靠谱单纯从官网的介绍上来看肯定是无法得出结论的,毕竟一般提供服务的人不会说自己的服务不好用

4. 实践

借用 Linux 创始人的一句话 「talk is cheap show me the code」,好不好用的,自己部署一下试试不就知道。部署的是使用了基于 Consul 自动服务发现的方式,不得不说 Hashicorp 的自家生态集成的是真的很香。

4.1 优势的点

  • 清晰的版本变更流程,支持快速回滚

版本变更.png

  • 可视化的部署日志,方便简洁

部署日志.png

  • client 和 job 级别的资源水位监控

client 资源.png

job 资源.png

  • 快捷的容器登陆

容器登陆.png

  • 整体资源用量的拓扑展示

资源用量拓扑.png

4.2 劣势

因为使用的不多,中文大部分也都是一个搭建 ,所以真实业务部署太难了

  • 私有仓库怎么连接?
  • 怎么跟 consul 集成?
  • 怎么部署其他 agent 的节点?
  • 怎么用 volume 挂载的方式?
  • 怎么跟 docker 一样使用 host 的网络?
  • ……

别说了,这里都是我留下的眼泪啊!

4. 碎碎念

已经决定下一篇就写部署它的时候的各种吐槽。这一周还是可以完结撒花的,一丢丢开心。

  • 在被生活完全击垮之前,我都愿意一直一直保持乐观。政治课本上说:‘事物的发展是螺旋式上升的,波浪式前进的。’我也要转个圈圈、蹦蹦跳跳,让自己快乐起来。
  • 我没有天赋,但我想试试,一个普通人怀有梦想会是什么样。
  • 要不安的 不欢的 都是云烟 要喜欢的 情愿的 都试一遍。(ps:还是很贪心,哈哈

5. 参考资料