系列文章
- Nomad 系列文章
Nomad 重要术语
Nomad 装置设置相干术语
agent
– 代理。Agent 是在 Server(服务器)或 Client(客户端)模式下运行的 Nomad 过程。client
– 客户端。Nomad 客户端负责运行调配给它的工作。它还向服务器注册本人,并监督要调配的任何工作。当运行代理时,客户端能够被称为节点 (Node)。server
– 服务器端。Nomad 服务器治理所有作业和客户端,监督工作,并管制哪些工作被搁置在哪些客户端节点上。服务器之间互相复制数据以确保高可用性。dev_agent
– 开发(模式)代理是一种代理配置,它为运行 Nomad 的单节点集群提供了有用的默认值。它在服务器和客户端模式下运行,并且不会将其群集状态长久化到磁盘,这容许代理从可反复的洁净状态启动,而不用在运行之间删除基于磁盘的状态。
Nomad 集群通常由三到五个服务器代理和许多客户端代理组成。
Nomad 应用的相干术语
在 Nomad 调度和运行工作负载的过程中,您将遇到以下术语。
task
– 工作是 Nomad 中最小的工作单元(相似 K8s 中的 Pod)。工作由task drivers
执行,drivers 包含 docker 和 exec 等,这使得 Nomad 能够灵便地反对工作类型。工作指定其所需的工作驱动程序、驱动程序的配置、束缚 (constraints) 和所需的资源。group
– 组是在同一 Nomad 客户端上运行的一系列工作。(我集体认为相似于 K8s 中的 Deployment/Statefulset/Daemonset/Job)job
– 作业是 Nomad 的外围管制单元,它定义了应用程序及其配置。它能够蕴含一个或多个工作。(我集体认为 job 相似于 K8s 中的多个资源 yaml manifest 汇合。包含:SVC/Ingress/ConfigMap/Deploy/PVC…)job specification
– 作业标准,也称为 jobspec,定义了 Nomad 作业的模式。它形容了作业的类型、作业运行所需的工作和资源、作业信息(如作业能够在哪些客户端上运行)等。allocation
– 调配是作业中的工作组与客户端节点之间的映射。当运行作业时,Nomad 将抉择可能运行它的客户端,并在机器上为作业中定义的工作组中的任务分配资源。(我认为相似于 K8s 中曾经在运行的 pod.)
应用程序在 jobspec 中定义为具备 jobspec
的工作组 (groups
of tasks
),并且一旦提交给 Nomad,就会创立一个作业 (job
) 沿着该 jobspec 中定义的每个组的调配 (allocation
)。
Nomad 上的利用工作流
典型的应用程序工作流程波及几个步骤,并从 Nomad 内部开始。
在 Nomad 上运行的任何应用程序的先决条件是具备工作负载工件。Nomad 反对各种工件,包含 Docker 镜像、原始二进制文件 raw binaries、Java 应用程序 和应用 QEMU 的虚拟机映像。
Nomad 不会创立这些应用程序工件,但能够应用 CircleCI,GitHub Actions 或本地构建等 CI 工具来创立工件,而后将其推送到存储库,Nomad 能够在调度作业时从中检索它们。
创立应用程序后,工作流将持续应用 Nomad。
- 创立 job spec – 作业标准蕴含应用程序所需的工作,包含工件驻留的地位、网络配置(如端口和服务定义)、所需实例数量等等。
- 部署 job – 作业标准将提交给 Nomad,并依据作业配置在一个或多个客户端上为作业安顿调配。
- 更新和重新部署 job – 更新利用程序代码或作业标准,而后从新提交给 Nomad 进行调度。
疾速入门
接下来咱们疾速上手 Nomad, 次要展现如何部署示例应用程序。
前提
- Docker 已装置
- Nomad 二进制(包含 CLI)已装置
- (可选)CNI 插件已装置
- Nomad 集群已创立并运行(至多包含 1 个 Server 和 1 个 Client)
部署示例应用程序 Job
这里咱们间接应用 git clone
Nomad 官网提供的 Demo:
git clone https://github.com/hashicorp-education/learn-nomad-getting-started.git
cd learn-nomad-getting-started
git checkout -b nomad-getting-started v1.1
示例应用程序在 Docker 容器中运行,由一个数据库和一个从数据库读取数据的 Web 前端组成。您将应用 参数化批处理作业 parameterized batch job 设置数据库,而后应用 定期批处理作业 periodic batch job 启动其余将数据写入数据库的短期作业。
Job 类型
Service(服务)作业用于长期运行的服务(相似于 K8s 中的 Deployment),这些服务始终运行到显式进行。
Batch 作业是指在胜利退出之前始终运行的短期作业(相似于 K8s 中的 Job
和 CronJob
)。
- 参数化 (parameterized) 块容许您配置批处理作业以承受必须或可选的输出。您能够应用
nomad job dispatch
命令触发作业。 - 周期性 (periodic) 块容许您安顿 Nomad 作业在设置的工夫运行。这些也被称为 Nomad cron jobs(相似于 K8s 中的
CronJob
)。
示例应用程序 Pytechco 概述
示例应用程序 pytechco
模仿在一家技术公司工作的员工。他们联机,实现工作,而后登记。
跳转到本地计算机上示例 repo 的 jobs
目录:
cd jobs
上面每个组成应用程序的 jobspec 文件都将 driver
属性设置为 docker
,并应用 image
属性指定存储在 GHCR 中 config
块中的镜像。而 Redis 作业应用了 Docker Hub 上托管的官网 Redis 镜像。
Redis 服务
jobs/pytechco-redis.nomad.hcl
内容如下:
task "redis-task" {
driver = "docker"
config {image = "redis:7.0.7-alpine"}
}
pytechco-redis.nomad.hcl
- 此服务作业运行并将 Redis 数据库裸露为 Nomad 服务,以供其余应用程序组件连贯。jobspec
将类型设置为 service
,配置 Nomad service
块(相似于 K8s 中的 Service
) 以应用 Nomad 原生服务发现 (Nomad native service discovery),并创立名为 redis-svc
的服务。具体如下:
job "pytechco-redis" {
type = "service"
group "ptc-redis" {
count = 1
network {
port "redis" {to = 6379}
}
service {
name = "redis-svc"
port = "redis"
provider = "nomad"
}
task "redis-task" {
driver = "docker"
config {
image = "redis:7.0.7-alpine"
ports = ["redis"]
}
}
}
}
以上代码阐明如下:
type = "service"
:service
type 的 job, 相似于 K8s 中的 Deploymentgroup "ptc-redis"
: group 块ptc-redis
count = 1
: 正本数为 1to = 6379
: 位于network
块中,批示连贯到 (to) 容器中的 6379 端口 (host 或 bridge 端口随机分派)service {
: service 块,相似于 K8s 中的Service
provider = "nomad"
: Nomad 从 1.3 版本及当前,新增 Nomad native service. 🐾留神:如果不指定,默认应用 consul service.(前提是须要装置 consul)task "redis-task" {
: task 块,相似于 K8s 中的 Pod.driver = "docker"
: Nomad 不同于 K8s. K8s 默认只反对一种运行时,即容器运行时;Nomad 默认就反对多种运行时 (nomad 的术语是driver
), 典型如:docker, java, raw binarier, QEMU 等,这里指定应用 docker driver.config {
: 这里是特定于 docker 的driver
的配置,包含:image
和ports
image = "redis:7.0.7-alpine"
: Docker Hub 的redis:7.0.7-alpine"
镜像ports = ["redis"]
: 对外裸露的端口列表,这里是redis
, 即在network
中定义的to = 6379
Web 服务
pytechco-web.nomad.hcl
- 此服务作业运行 Web 应用程序前端,显示存储在数据库中的值和流动员工。jobspec 将类型设置为 service
,并为应用程序应用 动态 端口 5000
。它还应用 nomadService
内置函数来获取 Redis 数据库服务的地址和端口信息。
job "pytechco-web" {
type = "service"
group "ptc-web" {
count = 1
network {
port "web" {static = 5000}
}
service {
name = "ptc-web-svc"
port = "web"
provider = "nomad"
}
task "ptc-web-task" {
template {
data = <<EOH
{{range nomadService "redis-svc"}}
REDIS_HOST={{.Address}}
REDIS_PORT={{.Port}}
FLASK_HOST=0.0.0.0
REFRESH_INTERVAL=500
{{end}}
EOH
destination = "local/env.txt"
env = true
}
driver = "docker"
config {
image = "ghcr.io/hashicorp-education/learn-nomad-getting-started/ptc-web:1.0"
ports = ["web"]
}
}
}
}
具体阐明如下(大部分和 redis 相似,这里不反复介绍了):
static = 5000
: 位于network
块中,指定 动态 端口为 5000. 与to
不一样在于,to
指定外部端口,内部端口随机分派;static
内外部端口都雷同,这里是5000
端口。template {
: template 块。作用相似于 K8s 中的 ConfigMap.-
data = <<EOH
: 具体配置内容,这里是援用nomadService
内置函数来获取 Redis 数据库服务的地址和端口信息。配置内容为EOH
包裹的内容。REDIS_HOST={{.Address}}
: 即运行后的分派 (alloc) 的内部(通常是 host) 地址REDIS_PORT={{.Port}}
: 即运行后分派的 内部 端口(不是 6379), 是一个 20000-30000 之间的随机端口。
destination = "local/env.txt
: 配置文件在分派后的地位。env = true
: 同时也将REDIS_HOST
REDIS_PORT
等设置为调配 (alloc) 容器中的环境变量。
Setup Parameterized Batch
pytechco-setup.nomad.hcl
- 此参数化批处理作业 (parameterized batch job) 应用默认值设置数据库。您能够屡次调度它来重置数据库。jobspec 将类型设置为 batch
,并有一个带有 meta_required
属性的 parameterized
块,在分派时须要 budget
的值。
job "pytechco-setup" {
type = "batch"
parameterized {meta_required = ["budget"]
}
group "ptc-setup" {
count = 1
task "ptc-setup-task" {
template {
data = <<EOH
{{range nomadService "redis-svc"}}
REDIS_HOST={{.Address}}
REDIS_PORT={{.Port}}
{{end}}
PTC_BUDGET={{env "NOMAD_META_budget"}}
EOH
destination = "local/env.txt"
env = true
}
driver = "docker"
config {image = "ghcr.io/hashicorp-education/learn-nomad-getting-started/ptc-setup:1.0"}
}
}
}
具体阐明如下:
type = "batch"
Job 类型为batch
, 相似于 K8s 中的Job
或CronJob
parameterized {
: 该 Job 有一个带有meta_required
属性的parameterized
块,在分派时须要budget
的值PTC_BUDGET={{env "NOMAD_META_budget}}
获取环境变量NOMAD_META_budget
的值并赋给PTC_BUDGET
Employee Periodic Batch
pytechco-employee.nomad.hcl
- 此定期批处理作业使员工联机。它随机化了员工的工作类型和其余变量,如他们工作的工夫和他们实现工作的速度。jobspec 将类型设置为 batch
,并有一个 periodic
块将 cron
属性设置为容许它每 3 秒启动一个新作业的值。
job "pytechco-employee" {
type = "batch"
periodic {
cron = "0/3 * * * * * *"
prohibit_overlap = false
}
group "ptc-employee" {
count = 1
task "ptc-employee-task" {
restart {
attempts = 2
delay = "15s"
interval = "10s"
mode = "fail"
}
template {
data = <<EOH
{{range nomadService "redis-svc"}}
REDIS_HOST={{.Address}}
REDIS_PORT={{.Port}}
PTC_EMPLOYEE_ID={{env "NOMAD_SHORT_ALLOC_ID"}}
{{end}}
EOH
destination = "local/env.txt"
env = true
}
driver = "docker"
config {
image = "ghcr.io/hashicorp-education/learn-nomad-getting-started/ptc-employee:1.0"
// args = [
// "--employee-type", "sales_engineer"
// ]
}
}
}
}
具体阐明如下:
periodic {
:type = "batch"
再加上periodic
, 就相似于 K8s 中的CronJob
restart {
: Batch 执行过程中的异样重启机制配置。PTC_EMPLOYEE_ID={{env "NOMAD_SHORT_ALLOC_ID"}}
: 将环境变量NOMAD_SHORT_ALLOC_ID
(该环境变量由 Nomad 生成,相似于 K8s 的 pod name) 赋值给PTC_EMPLOYEE_ID
// args = [
://
HCL 中的正文,此行不起作用。args
是docker
driverconfig
中的args
配置。
从 Nomad 1.5.0 开始,datacenter
属性默认为集群中所有可用的数据中心("*"
)。因而,本教程的作业标准将省略该属性,因为默认值已足够。如果您运行的是较早版本的 Nomad CLI 和集群二进制文件,则须要蕴含并设置该属性。
部署应用程序
具体命令如下:
提交数据库 Job:
$ nomad job run pytechco-redis.nomad.hcl
==> 2023-03-10T12:16:09-05:00: Monitoring evaluation "d44af37b"
2023-03-10T12:16:09-05:00: Evaluation triggered by job "pytechco-redis"
2023-03-10T12:16:10-05:00: Evaluation within deployment: "0ea05651"
2023-03-10T12:16:10-05:00: Allocation "be0bda79" created: node "2c9f4b7e", group "ptc-redis"
2023-03-10T12:16:10-05:00: Evaluation status changed: "pending" -> "complete"
==> 2023-03-10T12:16:10-05:00: Evaluation "d44af37b" finished with status "complete"
==> 2023-03-10T12:16:10-05:00: Monitoring deployment "0ea05651"
✓ Deployment "0ea05651" successful
2023-03-10T12:16:24-05:00
ID = 0ea05651
Job ID = pytechco-redis
Job Version = 0
Status = successful
Description = Deployment completed successfully
Deployed
Task Group Desired Placed Healthy Unhealthy Progress Deadline
ptc-redis 1 1 1 0 2023-03-10T17:26:23Z
提交 web Job:
nomad job run pytechco-web.nomad.hcl
获取 webapp 的 IP 地址。以下命令获取 Web 作业的调配 ID,并应用该 ID 获取调配的状态。而后,它在调配状态输入中搜寻 IP 地址,并将 IP 地址格式化为与 webapp 端口的链接。在浏览器中关上输入中的 URL 以查看 webapp 前端。
nomad node status -verbose \
$(nomad job allocs pytechco-web | grep -i running | awk '{print $2}') | \
grep -i ip-address | awk -F "=" '{print $2}' | xargs | \
awk '{print"http://"$1":5000"}'
提交 Setup Job:
nomad job run pytechco-setup.nomad.hcl
通过提供 budget 值分派该 setup job:
$ nomad job dispatch -meta budget="200" pytechco-setup
Dispatched Job ID = pytechco-setup/dispatch-1678468734-396cfa83
Evaluation ID = 53a77034
==> 2023-03-10T12:18:54-05:00: Monitoring evaluation "53a77034"
2023-03-10T12:18:54-05:00: Evaluation triggered by job "pytechco-setup/dispatch-1678468734-396cfa83"
2023-03-10T12:18:54-05:00: Allocation "d6c60ffd" created: node "2c9f4b7e", group "ptc-setup"
2023-03-10T12:18:54-05:00: Evaluation status changed: "pending" -> "complete"
==> 2023-03-10T12:18:54-05:00: Evaluation "53a77034" finished with status "complete"
提交 Employee Job:
nomad job run pytechco-employee.nomad.hcl
跳转到 Nomad UI,单击 “Jobs” 页面,而后单击 pytechco-employee
job。因为这是一个 cron batch job,您能够看到它每 3 秒创立一个新作业。
跳转回 webapp URL。成果如下:
更新应用程序
首先,进行 employee job:
nomad job stop -purge pytechco-employee
通过应用新 budget 500
再次分派 setup job 来重置数据库:
$ nomad job dispatch -meta budget="500" pytechco-setup
Dispatched Job ID = pytechco-setup/dispatch-1678469008-6ffe1c0c
Evaluation ID = e8e420f0
==> 2023-03-10T12:23:28-05:00: Monitoring evaluation "e8e420f0"
2023-03-10T12:23:28-05:00: Evaluation triggered by job "pytechco-setup/dispatch-1678469008-6ffe1c0c"
2023-03-10T12:23:28-05:00: Allocation "74acf63e" created: node "2c9f4b7e", group "ptc-setup"
2023-03-10T12:23:28-05:00: Evaluation status changed: "pending" -> "complete"
==> 2023-03-10T12:23:28-05:00: Evaluation "e8e420f0" finished with status "complete"
关上 pytechco-employee.nomad.hcl
文件并勾销正文工作配置的 args
块,使作业仅创立类型为 sales_engineer
的员工。而后将 cron
更新为 0/1 * * * * * *
,使作业每秒运行一次。保留文件。
...
cron = "0/1 * * * * * *"
...
args = ["--employee-type", "sales_engineer"]
...
再次提交 employee job 并跳转到 Web 应用程序。请留神,所有在线员工当初都只是销售工程师 (sales_enginee
)(之前是有多个不同的员工类型),而且他们中的更多人在任何给定工夫都在线。
$ nomad job run pytechco-employee.nomad.hcl
Job registration successful
Approximate next launch time: 2023-03-10T17:24:18Z (1s from now)
清理应用程序
进行并清理所有 Jobs:
nomad job stop -purge pytechco-employee
nomad job stop -purge pytechco-web
nomad job stop -purge pytechco-redis
nomad job stop -purge pytechco-setup
总结
本文中,咱们一起理解了 Nomad 的术语,并依据官网 Demo, 部署和更新了 Nomad Job。同时交叉理解了 Nomad 和 K8s 的一些类比和比照。
前面就正式进入具体实战环节,包含:Nomad 与 Traefik 和 Tailscale 的集成等独家内容。敬请期待。💪💪💪
📚️参考文档
- Introduction to Nomad Nomad
- Deploy and Update a Job
三人行, 必有我师; 常识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.