Nomad开源云平台指南

在本文中,我们探讨了 Nomad Cloud Platform——一种轻量级开源工作负载编排解决方案,旨在应对现代基础设施管理的挑战。
从简单的安装到强大的调度和无缝集成,Nomad 使团队能够管理容器化微服务、遗留应用程序以及介于两者之间的一切。此外,它的多功能性和可靠性使其成为满足现代基础设施需求的宝贵工具。
首先,我们探索了安装和设置的步骤。然后,我们在 Nomad 集群上部署了 PostgreSQL 数据库作业。最后,我们熟悉了可用的功能和工具。

在当今快速发展的技术环境中,组织需要可靠的解决方案来跨不同环境(包括内部部署基础设施和多云设置)部署和管理应用程序。

Kubernetes、Apache Mesos和Docker Swarm等其他复杂的编排工具不同,Nomad 提供了一种轻量级、直接的方法来调度和运行应用程序。它无缝支持容器化和非容器化的工作负载。

在本文中,我们将探索 Nomad 云平台,涵盖其安装、设置和功能,以全面了解如何利用这个强大的平台。

什么是Nomad?
Nomad Cloud Platform 是HashiCorp 开发的开源工作负载编排解决方案。它支持跨多种计算环境(包括多云和本地基础设施)灵活部署和管理应用程序。

Nomad 通过其轻量级、与供应商无关的设计简化了应用程序部署,为容器化和非容器化工作负载提供了可扩展的解决方案。此外,其简单的架构和强大的调度功能可帮助组织简化部署、优化资源利用率并保持运营一致性。

作为一个多功能、高效的工作负载编排平台,Nomad Cloud Platform 提供了一套强大的功能和工具来满足现代基础设施需求:

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

什么是云编排
云编排是管理现代软件及其架构的关键要素。它能够自动管理基础设施、资源监控、可扩展性和弹性。此外,编排使组织能够更有效地利用资源,最大限度地降低云环境的成本,并简化管理。

云编排连接三个主要运营领域:

  • DevOps:整合开发和运营团队,实现流程自动化并更快地交付软件
  • ITOps:管理IT基础设施,确保系统的稳定性和安全性
  • CloudOps:管理云资源和运营,包括扩展和成本优化

安装和设置
首先,让我们使用Homebrew来利用 HashiCorp 的存储库:

$ brew tap hashicorp/tap

然后,我们将从 Hashicorp 存储库安装 Nomad:

$ brew install hashicorp/tap/nomad

接下来,我们可以通过检查版本来验证安装:

$ nomad -v

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

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


让我们使用agent命令以开发模式启动一个集群,并将日志设置为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:


启动日志揭示了关键基础设施的详细信息,包括服务器配置、节点初始化、可用的任务驱动程序和网络设置:

  • 单节点集群初始化:自动localhost配置(端口 4646、4647 和 4648)
  • 任务驱动程序:Nomad 检测多个驱动程序,如Docker、Java 和QEMU
  • 动态端口:在 20000-32000 范围内动态分配端口
  • 集群领导:Nomad 迅速建立领导地位并开始调度工人
此外,一旦 Nomad 集群启动,我们就可以通过http://localhost:4646访问 Nomad UI :

Nomad UI 将作业管理集中在其作业部分,使我们能够查看、搜索和过滤集群工作负载。
此外,我们还可以使用简单的“运行作业”按钮创建和监控作业部署。
类似地,左侧面板提供对关键集群组件(如客户端、服务器和拓扑)的快速访问,以及存储和变量的基本管理工具。
此外,“运营”部分,特别是“评估”,提供了有关工作评估流程及其在整个基础设施中的进展的详细见解。

使用Nomad Jobs部署应用程序
为了展示Nomad的功能,让我们逐步部署PostgreSQL容器。

1. 创建Nomad Job文件
首先,我们将创建一个简单的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
      }
    }
  }
}

该文件指定了在dc1数据中心运行的名为postgres的服务作业。此作业中有一个数据库组中的任务。

具体来说,它使用 Docker 驱动程序部署 PostgreSQL 15,公开端口5432,并为数据库密码和名称设置环境变量。

此外,它还为该任务分配特定资源,例如500 MHz 的 CPU 和512 MB 的内存。

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 )。尽管作业的评估已标记为完成,但部署仍在进行中。

最后,由于部署正在运行,它正在尝试为数据库任务组放置一个所需的实例。但是,它还显示零个健康实例和四个不健康实例,并设置了进度期限。

3. 作业状态
接下来,我们将检查postgres作业的状态:

$ nomad job status postgres

输出提供了Nomad集群中作业状态的详细摘要:

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数据中心上具有运行状态的postgres作业
  • 最新部署 ( b1486482 ) 已成功完成,其中1 个所需实例已放置且运行状况良好
  • 任务组数据库的分配详细信息及其运行状态

4. 分配状况
最后,我们可以检查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

这里,PostgreSQL 数据库的具体分配展示了 Nomad 动态分配资源、管理网络和提供部署生命周期透明可见性的能力:

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