1. 简介

在当今快速发展的技术环境中,企业需要可靠的解决方案来部署和管理跨多样化环境(包括本地基础设施和多云架构)的应用程序。

KubernetesApache MesosDocker Swarm 等复杂编排工具不同,Nomad 提供了轻量级、直接的方式来调度和运行应用程序。它无缝支持容器化和非容器化工作负载。

本文将深入探讨 Nomad 云平台,涵盖其安装、设置和功能特性,帮助您全面理解如何利用这个强大的平台。

2. 什么是 Nomad?

Nomad 云平台是由 HashiCorp 开发的开源工作负载编排解决方案。它支持在多云和本地基础设施等多样化计算环境中灵活部署和管理应用程序。

Nomad 通过其轻量级、厂商中立的设计简化了应用部署,为容器化和非容器化工作负载提供可扩展的解决方案。此外,其简洁的架构和强大的调度能力帮助企业简化部署流程、优化资源利用率并保持操作一致性。

3. 安装与设置

首先,使用 Homebrew 添加 HashiCorp 的仓库:

$ brew tap hashicorp/tap

然后从已添加的仓库安装 Nomad:

$ brew install hashicorp/tap/nomad

通过检查版本验证安装:

$ nomad -v

输出将显示版本、构建日期和修订哈希等详细信息:

Nomad v1.9.3
BuildDate 2024-11-11T16:35:41Z
Revision d92bf1014886c0ff9f882f4a2691d5ae8ad8131c

使用 agent 命令以 dev 模式启动集群,日志级别设为 INFO

$ nomad agent -dev -log-level=INFO

观察启动日志了解 Nomad 环境的默认配置:

==> 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: INFO
               Node Id: 1845c6b5-d670-6518-2ca1-a1a4ec8e2088
                Region: global (DC: dc1)
                Server: true
               Version: 1.9.3

==> Nomad agent started! Log data will stream in below:

    2024-11-30T16:36:20.046+0530 [INFO]  nomad.raft: initial configuration: index=1 servers="[{Suffrage:Voter ID:d54ce4e9-055c-8c54-bdc1-aeae88a7998f Address:127.0.0.1:4647}]"
    2024-11-30T16:36:20.046+0530 [INFO]  nomad.raft: entering follower state: follower="Node at 127.0.0.1:4647 [Follower]" leader-address= leader-id=
    2024-11-30T16:36:20.047+0530 [INFO]  nomad: serf: EventMemberJoin: global 127.0.0.1
    2024-11-30T16:36:20.047+0530 [INFO]  nomad: starting scheduling worker(s): num_workers=10 schedulers=["service", "batch", "system", "sysbatch", "_core"]
    2024-11-30T16:36:20.047+0530 [INFO]  nomad: started scheduling worker(s): num_workers=10 schedulers=["service", "batch", "system", "sysbatch", "_core"]
    2024-11-30T16:36:20.047+0530 [INFO]  nomad: adding server: server="anshulbansal.global (Addr: 127.0.0.1:4647) (DC: dc1)"
    2024-11-30T16:36:20.048+0530 [INFO]  agent: detected plugin: name=qemu type=driver plugin_version=0.1.0
    2024-11-30T16:36:20.048+0530 [INFO]  agent: detected plugin: name=java type=driver plugin_version=0.1.0
    2024-11-30T16:36:20.048+0530 [INFO]  agent: detected plugin: name=docker type=driver plugin_version=0.1.0
    2024-11-30T16:36:20.048+0530 [INFO]  agent: detected plugin: name=raw_exec type=driver plugin_version=0.1.0
    2024-11-30T16:36:20.048+0530 [INFO]  agent: detected plugin: name=exec type=driver plugin_version=0.1.0
    2024-11-30T16:36:20.049+0530 [INFO]  client: using state directory: state_dir=/private/var/folders/w2/cks0zhmn5yz94f3r3nmwkvc80000gp/T/NomadClient1998098531
    2024-11-30T16:36:20.049+0530 [INFO]  client: using alloc directory: alloc_dir=/private/var/folders/w2/cks0zhmn5yz94f3r3nmwkvc80000gp/T/NomadClient161152373
    2024-11-30T16:36:20.049+0530 [INFO]  client: using dynamic ports: min=20000 max=32000 reserved=""
    2024-11-30T16:36:20.149+0530 [INFO]  client.plugin: starting plugin manager: plugin-type=csi
    2024-11-30T16:36:20.149+0530 [INFO]  client.plugin: starting plugin manager: plugin-type=driver
    2024-11-30T16:36:20.149+0530 [INFO]  client.plugin: starting plugin manager: plugin-type=device
    2024-11-30T16:36:20.308+0530 [INFO]  client: started client: node_id=91e820d7-c1f3-c8cc-34dd-06db519f9182
    2024-11-30T16:36:21.143+0530 [WARN]  nomad.raft: heartbeat timeout reached, starting election: last-leader-addr= last-leader-id=
    2024-11-30T16:36:21.143+0530 [INFO]  nomad.raft: election won: term=2 tally=1
    2024-11-30T16:36:21.144+0530 [INFO]  nomad.raft: entering leader state: leader="Node at 127.0.0.1:4647 [Leader]"
    2024-11-30T16:36:21.145+0530 [INFO]  nomad: cluster leadership acquired
    2024-11-30T16:36:21.149+0530 [INFO]  nomad.core: established cluster id: cluster_id=76d038da-5f9c-eb03-497a-4f25836b2ee8 create_time=1732964781148928000
    2024-11-30T16:36:21.149+0530 [INFO]  nomad: eval broker status modified: paused=false
    2024-11-30T16:36:21.149+0530 [INFO]  nomad: blocked evals status modified: paused=false
    2024-11-30T16:36:21.219+0530 [INFO]  nomad.keyring: initialized keyring: id=23aa3075-c53e-77fa-daa2-a51217475658
    2024-11-30T16:36:21.348+0530 [INFO]  client: node registration complete

启动日志揭示了关键基础设施细节:

  • 单节点集群初始化:自动配置 localhost(端口 4646、4647 和 4648)
  • 任务驱动:Nomad 检测到 Docker、Java 和 QEMU 等多个驱动
  • 动态端口:在 20000-32000 范围内动态分配端口
  • 集群领导权:Nomad 快速建立领导权并启动调度工作器

集群启动后,可通过 http://localhost:4646 访问 Nomad UI:

nomadUI

Nomad UI 在 Jobs 部分集中管理作业,支持查看、搜索和过滤集群工作负载。通过简单的 Run Job 按钮即可创建和监控作业部署

左侧面板提供对 Clients、ServersTopology 等关键集群组件的快速访问,以及 StorageVariables 等管理工具。

Operations 部分的 Evaluations 子项提供作业评估过程及其在基础设施中进展的详细洞察。

4. 使用 Nomad 作业部署应用

为演示 Nomad 的能力,我们将逐步部署一个 PostgreSQL 容器

4.1. 创建 Nomad 作业文件

首先创建 postgres.nomad 文件:

job "postgres" {
  datacenters = ["dc1"]
  type        = "service"

  group "database" {
    network {
      port "postgres" {
        static = 5432
      }
    }

    task "postgres" {
      driver = "docker"

      config {
        image = "postgres:15"
        ports = ["postgres"]
      }

      env {
        POSTGRES_PASSWORD = "password"
        POSTGRES_DB       = "mydb"
      }

      resources {
        cpu    = 500
        memory = 512
      }
    }
  }
}

该文件定义了一个名为 postgres 的服务作业,运行在 dc1 数据中心。作业中包含 database 组的任务:

  • 使用 Docker 驱动部署 PostgreSQL 15
  • 暴露端口 5432
  • 设置数据库密码和名称的环境变量
  • 为任务分配 500 MHz CPU 和 512 MB 内存

4.2. 运行 Nomad 作业

使用 Nomad 的 run 命令执行作业:

$ nomad job run postgres.nomad

输出显示部署过程的关键信息:

==> 2024-11-30T17:11:28+05:30: Monitoring evaluation "ccb7b29c"
    2024-11-30T17:11:28+05:30: Evaluation triggered by job "postgres"
    2024-11-30T17:11:29+05:30: Evaluation within deployment: "c8172895"
    2024-11-30T17:11:29+05:30: Allocation "9085cb9c" created: node "91e820d7", group "database"
    2024-11-30T17:11:29+05:30: Evaluation status changed: "pending" -> "complete"
==> 2024-11-30T17:11:29+05:30: Evaluation "ccb7b29c" finished with status "complete"
==> 2024-11-30T17:11:29+05:30: Monitoring deployment "c8172895"
  ⠧ Deployment "c8172895" in progress...
    
    2024-11-30T17:15:03+05:30
    ID          = c8172895
    Job ID      = postgres
    Job Version = 0
    Status      = running
    Description = Deployment is running
    
    Deployed
    Task Group  Desired  Placed  Healthy  Unhealthy  Progress Deadline
    database    1        4       0        4          2024-11-30T17:21:28+05:30

关键信息解读:

  • 触发评估后,在特定节点为数据库任务组创建了分配(ID 9085cb9c
  • 作业评估标记为 complete,但部署仍在进行中
  • 部署尝试为 database 任务组放置 1 个实例,但显示 0 个健康实例和 4 个不健康实例

4.3. 检查 Nomad 作业状态

查看 postgres 作业状态:

$ nomad job status postgres

输出提供作业状态的详细摘要:

ID            = postgres
Name          = postgres
Submit Date   = 2024-11-30T17:32:11+05:30
Type          = service
Priority      = 50
Datacenters   = dc1
Namespace     = default
Node Pool     = default
Status        = running
Periodic      = false
Parameterized = false

Summary
Task Group  Queued  Starting  Running  Failed  Complete  Lost  Unknown
database    0       0         1        0       0         0     0

Latest Deployment
ID          = b1486482
Status      = successful
Description = Deployment completed successfully

Deployed
Task Group  Desired  Placed  Healthy  Unhealthy  Progress Deadline
database    1        1       1        0          2024-11-30T17:43:15+05:30

Allocations
ID        Node ID   Task Group  Version  Desired  Status   Created    Modified
95a0741c  f4834583  database    0        run      running  4m27s ago  3m24s ago

关键信息:

  • 服务类型作业 postgres 提交于指定时间
  • 作业在 dc1 数据中心状态为 running
  • 最新部署(b1486482)成功完成,1 个实例已放置且健康
  • database 任务组的分配详情显示状态为 running

4.4. 检查 Nomad 分配状态

最后查看 postgres 作业的分配状态:

$ nomad alloc status 95a0741c

输出揭示了 Nomad 编排和管理基础设施工作负载的细节:

ID                  = 95a0741c-aace-805c-c0b3-fedd8052db0b
Eval ID             = 69f38b58
Name                = postgres.database[0]
Node ID             = f4834583
Node Name           = anshulbansal
Job ID              = postgres
Client Status       = running
Client Description  = Tasks are running
Desired Status      = run
Created             = 5m14s ago
Modified            = 4m11s ago
Deployment ID       = b1486482
Deployment Health   = healthy

Allocation Addresses:
Label      Dynamic  Address
*postgres  yes      127.0.0.1:5432

Task "postgres" is "running"
Task Resources:
CPU        Memory       Disk     Addresses
0/500 MHz  0 B/512 MiB  300 MiB  

Task Events:
Started At     = 2024-11-30T12:03:05Z
Finished At    = N/A
Total Restarts = 0
Last Restart   = N/A

Recent Events:
Time                       Type        Description
2024-11-30T17:33:05+05:30  Started     Task started by client
2024-11-30T17:32:11+05:30  Driver      Downloading image
2024-11-30T17:32:11+05:30  Task Setup  Building Task Directory
2024-11-30T17:32:11+05:30  Received    Task received by client

关键洞察:

  • 分配状态包含唯一 ID(95a0741c)、关联节点(anshulbansal)和部署健康状态(healthy
  • 资源利用详情显示任务配置为 500 MHz CPU 和 512 MiB 内存,数据库动态映射到 localhost:5432
  • 最近事件展示任务完整生命周期——从镜像下载到运行状态

5. 功能特性与工具

作为高效的工作负载编排平台,Nomad 提供强大功能满足现代基础设施需求:

  • 多环境编排:厂商中立平台,支持跨云提供商、本地数据中心和边缘位置无缝部署和迁移应用
  • 工作负载调度:高效管理容器化到传统应用的多样化工作负载,支持服务、系统任务和批处理作业等多种类型
  • 资源管理:动态分配 CPU、内存、网络和存储资源,提供细粒度控制,可调度 GPU 等专用硬件
  • 高可用与容错:通过领导选举、自动故障转移和滚动更新/金丝雀部署等高级技术确保系统可靠性和零停机更新
  • 安全特性:基于角色的访问控制、HashiCorp Vault 密钥管理集成、端到端加密保护服务器-客户端通信
  • 原生集成:与 Consul、Terraform 等 HashiCorp 工具无缝集成,API 驱动架构支持工作流定制和自动化
  • 监控与可观测性:提供实时监控工具,集成 Prometheus 和 Grafana 等平台,实现全面性能跟踪和问题诊断
  • 轻量级与易用性:作为单一二进制文件运行,降低设置复杂性和运维开销,同时提供强大编排能力
  • 可扩展性:自定义插件使 Nomad 能适应独特基础设施和应用需求,为专用工作负载提供灵活性
  • 简化工具集:关键工具包括用于部署模板的 Nomad Pack、集群管理的 Nomad CLI 和基于 Web 的监控与作业管理 Nomad UI

6. 总结

本文深入探讨了 Nomad 云平台——一个轻量级开源工作负载编排解决方案,专为应对现代基础设施管理挑战而设计。

从简洁的安装到强大的调度和无缝集成,Nomad 赋能团队管理容器化微服务、传统应用及介于两者之间的所有工作负载。其多功能性和可靠性使其成为应对现代基础设施需求的宝贵工具

首先我们介绍了安装与设置步骤,接着在 Nomad 集群上部署了 PostgreSQL 数据库作业,最后熟悉了可用的功能特性与工具集。


原始标题:A Guide to Nomad Cloud Platform | Baeldung