Nomod 学习之《Hello World》

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 篇。

相关推荐
老司机张师傅15 分钟前
【微服务实战之Docker容器】第七章-Dockerfile解析
容器·dockerfile·虚悬镜像·docker学习
微信-since8119222 分钟前
[ruby on rails] 安装docker
后端·docker·ruby on rails
登云时刻1 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(一)
redis·kubernetes·bootstrap
吴半杯2 小时前
gateway漏洞(CVE-2022-22947)
docker·kubernetes·gateway
今天我刷leetcode了吗2 小时前
docker 配置同宿主机共同网段的IP 同时通过通网段的另一个电脑实现远程连接docker
tcp/ip·docker·电脑
lwprain3 小时前
常用docker应用部署,wordpress、mysql、tomcat、nginx、redis
mysql·docker·tomcat
Code_Artist4 小时前
使用Portainer来管理并编排Docker容器
docker·云原生·容器
mengao12344 小时前
centos 服务器 docker 使用代理
服务器·docker·centos
Eternal-Student4 小时前
【docker 保存】将Docker镜像保存为一个离线的tar归档文件
运维·docker·容器
不是二师兄的八戒5 小时前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php