Nomad雲端平台指南
一、簡介
在當今快速發展的技術環境中,組織需要可靠的解決方案來在不同環境(包括本地基礎設施和多雲設定)中部署和管理應用程式。
與 Kubernetes、Apache Mesos 和 Docker Swarm 等其他複雜編排工具不同,Nomad 提供了一種輕量級、簡單的方法來調度和運行應用程式。它無縫支援容器化和非容器化工作負載。
在本文中,我們將探討 Nomad 雲端平台,涵蓋其安裝、設定和功能,以全面了解如何利用這個強大的平台。
2. 什麼是Nomad?
Nomad 雲端平台是 HashiCorp 開發的開源工作負載編排解決方案。它支援跨不同運算環境(包括多雲和本地基礎架構)靈活部署和管理應用程式。
Nomad 透過其輕量級、與供應商無關的設計簡化了應用程式部署,為容器化和非容器化工作負載提供可擴展的解決方案。此外,其簡單的架構和強大的調度功能可協助組織簡化部署、最佳化資源利用率並保持營運一致性。
3. 安裝與設定
首先,讓我們使用 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
命令在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 快速建立領導並開始調度工人
此外,一旦 Nomad 叢集啟動,我們可以透過http://localhost:4646
存取 Nomad UI:
Nomad UI 將作業管理集中在其Jobs
部分,使我們能夠查看、搜尋和過濾叢集工作負載。此外,我們可以使用簡單的Run Job
按鈕來建立和監控作業部署。
同樣,左側面板提供對關鍵叢集元件(如Clients, Servers,
和Topology,
以及Storage
和Variables.
此外, 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 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
任務組放置一個所需的實例。然而,它也顯示了零個健康實例和四個不健康實例,並設定了進度截止日期。
4.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
以及提交日期和時間 -
postgres
作業在dc1
資料中心上的running
狀態 - 最新部署 (
b1486482
) 已成功完成,已放置1
所需實例且運作狀況良好 - 任務組
database
的分配詳細資訊以及running
狀態
4.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
- 最近的事件顯示了任務的完整生命週期 - 從圖像下載到運行狀態
5. 功能和工具
作為用於工作負載編排的多功能且高效的平台,Nomad 雲端平台提供了一組強大的功能和工具來滿足現代基礎設施需求:
- 多環境編排:Nomad 提供靈活的、與供應商無關的平台,用於跨雲端提供者、本地資料中心和邊緣位置無縫部署和遷移應用程序
- 工作負載調度:此平台有效管理各種工作負載 - 從容器化到傳統應用程序,並支援多種作業類型,例如服務、系統任務和批次作業
- 資源管理:Nomad 提供 CPU、記憶體、網路和儲存的動態資源分配。它提供細粒度的控制,並且可以調度需要 GPU 等專用硬體的工作負載
- 高可用性和容錯性:該平台透過領導者選舉、自動故障轉移以及滾動和金絲雀更新等複雜的部署技術確保系統可靠性和零停機更新
- 安全功能:Nomad 透過基於角色的存取控制、用於秘密管理的 HashiCorp Vault 整合以及用於保護伺服器客戶端通訊的端對端加密來增強安全性
- 本機整合:該平台與 Consul 和 Terraform 等 HashiCorp 工具順利集成,具有 API 驅動的架構,可促進工作流程客製化和自動化
- 監控和可觀察性:Nomad提供即時監控工具,並與Prometheus和Grafana等平台集成,實現全面的效能追蹤和問題診斷
- 輕量級且用戶友好:與複雜的編排器不同,Nomad 作為單一二進位檔案運行,降低了設定複雜性和操作開銷,同時提供強大的編排功能
- 可擴展性:自訂插件使 Nomad 能夠適應獨特的基礎設施和應用程式要求,為專門的工作負載提供靈活性
- 簡化工具:用於部署範本的 Nomad Pack、用於叢集管理的 Nomad CLI 以及用於基於 Web 的監控和作業管理的 Nomad UI 等關鍵工具
六、結論
在本文中,我們探討了 Nomad 雲端平台—一種輕量級開源工作負載編排解決方案,旨在應對現代基礎架構管理的挑戰。
從簡單的安裝到強大的調度和無縫集成,Nomad 使團隊能夠管理容器化微服務、遺留應用程式以及兩者之間的一切。此外,其多功能性和可靠性使其成為滿足現代化基礎設施需求的寶貴工具。
首先,我們探討了安裝和設定的步驟。然後,我們在Nomad叢集上部署了PostgreSQL資料庫作業。最後,我們熟悉了可用的功能和工具。