Nomad 简介
Nomad 一款功能强大、简单灵活的调度程序和集群编排器,可以轻松管理从单机到大规模集群的各种容器和非容器化应用程序。
Nomad 主要特点
- 作为单个二进制文件运行,资源占用少,
- 支持将资源管理和调度集成到一个单独的系统中,
- 支持多种驱动程序运行 job,包括 Windows、Java、VM、Docker 等,
- 支持分布式和高可用,
- 支持多数据中心,可以跨数据中心调度,
- 强大的可伸缩性,可在现实生产环境中扩展到10K+节点的集群(K8S v1.29 是 5k+ ),
- 支持插件功能,可与 Terraform、Consul、Vault 无缝集成,用于提供资源调配、服务发现和秘密管理。
Nomad 核心概念
- Job------作业,是由用户编写并提交的用于描述 Nomad 的工作负载的规范。一个作业由一个或多个任务组组成。
- Task Group------任务组,任务组是调度的基本单位,一个任务组是必须一起运行的一组任务。例如,Web 服务往往伴随着日志收集服务和进程监控服务一块运行。
- Driver------驱动,驱动指明任务是以何种方法执行的,比如 Docker、QEMU、Java 和静态二进制文件等。
- Task------任务,是 Nomad 中最小的工作单元,任务在作业定义规范中需要指定使用的运行时驱动、驱动的配置、任务约束和所需资源等。
- Client------客户端,是任务运行的设备节点,所有客户端都运行着 Nomad 代理。代理负责向 Nomad Server 注册、查看要分配的工作以及执行任务等。
- Allocation------分配,是指将任务组分配给某个客户端执行,单个作业中可以定义数百个任务组。分配由 Nomad 服务器创建,作为评估期间做出的调度决策的一部分。
- Evaluation------评估,是 Nomad 制定调度决策的机制。评估可能会导致分配发生变化,当作业的预期状态或客户端的实际状态发生变化时,Nomad 会新建评估用来确定是否迁移作业。
- Server------服务器,是整个集群的大脑。每个区域都有一组 Nomad 服务器,它们管理所有作业和客户端,运行评估并创建任务分配。服务器彼此之间同步数据并执行领导者(Leader)选举以确保高可用性。服务器跨区域联邦以使 Nomad 具有全局感知。
- Regions 和 DataCenters------区域和数据中心,一个区域可以包括多个数据中心。多个区域之间可以邦联在一起。区域之间发出的请求将转发到适当的 Nomad 服务器。数据不会在区域之间进行复制。区域内的 Nomad 服务器管理着该区域内的状态并进行调度决策。
- Bin Packing------装箱,是一种以最大程度地利用箱子的方式向箱子中填充物品的过程。具体到 Nomad,客户端是就是箱子,物品就是任务组,调度器尝试在不耗尽任何维度资源的情况下使用所有设备节点的资源。
Nomad 安装
选择项目目录 nomad-bootcamp,下载 Nomad 二进制文件,并选择适合你系统的安装包。
我们采用 Mac 环境和二进制文件的方式使用。其他安装方式见:developer.hashicorp.com/nomad/insta...
shell
# 项目目录
mkdir example_01 && cd example_01
# 下载安装包
curl -O 'https://releases.hashicorp.com/nomad/1.7.6/nomad_1.7.6_darwin_arm64.zip'
# 解压安装包
unzip nomad_1.7.6_darwin_arm64.zip && rm -rf nomad_1.7.6_darwin_arm64.zip
# 验证安装包
./nomad --version
# 输出版本信息
#
# Nomad v1.7.6
# BuildDate 2024-03-12T07:27:36Z
# Revision 594fedbfbc4f0e532b65e8a69b28ff9403eb822e
以上就是整个安装过程,终端看见 Nomad 的版本提示,即代表安装成功。
为啥选择二进制文件的方式运行呢?因为这种方式更便于和应用程序做集成。
大家也可以选择系统安装的方式,具体如下:
shell
# 解压安装包
unzip nomad_1.7.6_darwin_arm64.zip -d /usr/local/bin && rm -rf nomad_1.7.6_darwin_arm64.zip
# 权限设置
sudo chmod +x /usr/local/bin/nomad
# 验证安装包
nomad --version
# 输出版本信息
#
# Nomad v1.7.6
# BuildDate 2024-03-12T07:27:36Z
# Revision 594fedbfbc4f0e532b65e8a69b28ff9403eb822e
Nomad 使用
启动 Nomad agent
Nomad 官方支持以开发模式快速启动 Server 端和 Clinet 端,方便测试和学习 Nomad。
为了简单运行,我们也以开发模式的方式
运行 Nomad agent。
shell
# 运行开发模式
./nomad agent -dev
# ==> No configuration files loaded
# ==> Starting Nomad agent...
# ==> Nomad agent configuration:
# Advertise Addrs: HTTP: 127.0.0.1:4646; RPC: 127.0.0.1:4647; Serf: 127.0.0.1:4648
# Bind Addrs: HTTP: [127.0.0.1:4646]; RPC: 127.0.0.1:4647; Serf: 127.0.0.1:4648
# Client: true
# Log Level: DEBUG
# Node Id: 58d5ba19-0e0b-4e58-3a00-67bec90b2c36
# Region: global (DC: dc1)
# Server: true
# Version: 1.7.6
# ==> Nomad agent started! Log data will stream in below:
# ...
# 2024-03-16T23:10:42.857+0800 [DEBUG] client.plugin: finished plugin manager initial fingerprint: plugin-type=driver
# 2024-03-16T23:10:42.857+0800 [INFO] client: started client: node_id=9141d0a8-eee2-72c7-846e-262df4443971
# 2024-03-16T23:10:42.857+0800 [DEBUG] http: UI is enabled
# ...
# 2024-03-16T23:10:45.148+0800 [DEBUG] client: state changed, updating node and re-registering
# 2024-03-16T23:10:45.150+0800 [INFO] client: node registration complete
通过终端日志可以看到,Server 端和 Client 端都为 true,表示都已经启动成功。
查看节点状态
shell
./nomad node status
# ID Node Pool DC Name Class Drain Eligibility Status
# 9141d0a8 default dc1 YaoMac.local <none> false eligible ready
输出显示了我们的节点 ID,它是随机生成的 UUID。其他显示包括:数据中心、节点名称、节点类型等等。当然,通过 Status 参数我们可以看到我们的节点处于就绪状态。
查看集群对象
shell
./nomad server members
# Name Address Port Status Leader Raft Version Build Datacenter Region
# YaoMac.local.global 127.0.0.1 4648 alive true 3 1.7.6 dc1 global
输出显示了我们自己的 Server,运行的地址,端口,运行状况,是否 Leader,版本信息,数据中心和区域等信息。
停止 Nomad agent
针对这种启动方式,你可以使用 Ctrl-C 中断 agent,或者直接 Kill。当然也有官方 stop 命令,这个我们后续再讲。
《Hello World》任务
相信大家学习一门新技术都是从《hello world》开始
以下这个 Job 就是我们学习 Nomad 的《hello world》任务。
初始化 Job
首先,进入你的工作目录使用./nomad job init
命令。它会在当前目录生成一个example.nomad.hcl
,这是一个示例的 nomad job 配置文件,里面包含了 job 相关的所有配置。
shell
# 新建 jobs 文件夹,用来存放 Job
mkdir jobs
# 初始化默认任务
./nomad job init ./jobs/example.nomad.hcl
# Example job file written to ./jobs/example.nomad.hcl
运行 Job
如果想要运行这个 job,我们可以使用./nomad job run
命令。
shell
./nomad job run ./jobs/example.nomad.hcl
# ==> 2024-03-16T23:33:29+08:00: Monitoring evaluation "094a0f82"
# 2024-03-16T23:33:29+08:00: Evaluation triggered by job "example"
...
# ==> 2024-03-16T23:33:30+08:00: Monitoring deployment "3b61128e"
# ⠏ Deployment "3b61128e" in progress...
注意⚠️:Job 运行可能会卡住 ,这是因为官方 Job 是一个 redis docker 服务。任务初始化运行过程中,会先从 dockerhub.com 拉取 redis 镜像。由于国内网络问题,可能会拉取失败导致任务卡住。这时候可以进行手动拉取(docker pull redis:7)后再运行 Job。
查看 Job 状态
如果想要查看 job 状态,我们可以使用./nomad job status
命令
shell
./nomad job status example
# ID = example
# Name = example
# Submit Date = 2024-03-16T23:33:29+08:00
# Type = service
# Priority = 50
# Datacenters = *
# Namespace = default
# Node Pool = default
# Status = running
# Periodic = false
# Parameterized = false
# Summary
# Task Group Queued Starting Running Failed Complete Lost Unknown
# cache 0 0 1 0 0 0 0
# Latest Deployment
# ID = 3b61128e
# Status = running
# Description = Deployment is running
# Deployed
# Task Group Desired Placed Healthy Unhealthy Progress Deadline
# cache 1 1 0 1 2024-03-16T23:43:29+08:00
# Allocations
# ID Node ID Task Group Version Desired Status Created Modified
# 459f1b8e 9141d0a8 cache 0 run running 6m18s ago 3m13s ago
查看 Job 日志
查看 job 日志,我们可与使用./nomad logs <ID> redis
命令。注意 logs 后面的参数为 uuid 和task 名字。
uuid 可以通过nomad job status example
命令得到,task 名字在 example.nomad.hcl 配置文件中定义。
shell
./nomad logs 459f1b8e redis
# 1:C 16 Mar 2024 15:36:34.295 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
...
# 1:M 16 Mar 2024 15:36:34.297 * Running mode=standalone, port=6379.
# 1:M 16 Mar 2024 15:36:34.298 * Server initialized
# 1:M 16 Mar 2024 15:36:34.298 * Ready to accept connections tcp
修改 Job
修改 Job 可分为三步进行
首先,编辑 job 配置文件example.nomad.hcl
,比如以下我们需要将部署的任务数量从 1 变为 2。
shell
vim ./jobs/example.nomad.hcl
# 修改`count = 1`,改为`count = 2`
# 完成修改后,使用`./nomad plan ./jobs/example.nomad.hcl`命令
其次,运行./nomad plan <job>
加载修改后配置
shell
./nomad plan ./jobs/example.nomad.hcl
# +/- Job: "example"
# +/- Task Group: "cache" (1 create, 1 in-place update)
# +/- Count: "1" => "2" (forces create)
# Task: "redis"
# Scheduler dry-run:
# - All tasks successfully allocated.
# Job Modify Index: 35
# To submit the job with version verification run:
...
最后,使用更新命令去更新 job,使其生效。
shell
./nomad run -check-index 35 ./jobs/example.nomad.hcl
# ==> 2024-03-16T23:54:42+08:00: Monitoring evaluation "d9f745fd"
...
# ==> 2024-03-16T23:54:43+08:00: Monitoring deployment "d02f98a8"
# ✓ Deployment "d02f98a8" successful
# 2024-03-16T23:54:54+08:00
# ID = d02f98a8
# Job ID = example
# Job Version = 1
# Status = successful
# Description = Deployment completed successfully
# Deployed
# Task Group Desired Placed Healthy Unhealthy Progress Deadline
# cache 2 2 2 0 2024-03-17T00:04:52+08:00
停止 Job
我们可以使用./nomad job stop
命令。
shell
./nomad job stop example
# ==> 2024-03-17T23:48:33+08:00: Monitoring evaluation "edb6a058"
...
# ==> 2024-03-17T23:48:34+08:00: Monitoring deployment "f431adfc"
# ! Deployment "f431adfc" cancelled
# 2024-03-17T23:48:34+08:00
# ID = f431adfc
# Job ID = example
# Job Version = 0
# Status = cancelled
# Description = Cancelled because job is stopped
# Deployed
# Task Group Desired Placed Healthy Unhealthy Progress Deadline
# cache 2 2 0 0 2024-03-17T23:58:17+08:00
官方 UI
虽说我们这是一个《Hello World》项目,但是涉及了太多命令,也不知道大家记住了多少?
其实,没记住也没关系,因为还有一种比较简单的方式,那就是使用官方的 UI 界面,以上命令都可以通过 UI 进行点点点操作,具体 UI 如下:
这是一款界面简洁、功能很全面的 UI 工具,具体链接地址为:http://127.0.0.1:4646/ui
好了,以上就是本期的全部内容,笔者荒生
,一名资深的技术开发,谢谢大家的观看,点赞、评论、加关注
你的支持就是笔者的动力,有问题也可以私信笔者或留言询问
。
点击《Nomad 系列》 查看 Nomad 相关的所有发文,当前是更新的第 2 篇。