agent
- 代理。Agent 是在 Server(伺服器) 或 Client(使用者端) 模式下執行的 Nomad 程序。client
- 使用者端。Nomad 使用者端負責執行分配給它的任務。它還向伺服器註冊自己,並監視要分配的任何工作。當執行代理時,使用者端可以被稱為節點 (Node)。server
- 伺服器端。Nomad 伺服器管理所有作業和使用者端,監視任務,並控制哪些任務被放置在哪些使用者端節點上。伺服器之間相互複製資料以確保高可用性。dev_agent
- 開發(模式)代理是一種代理設定,它為執行 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 支援各種工件,包括 Docker 映象、原始二進位制檔案 raw binaries、Java 應用程式 和使用 QEMU 的虛擬機器器映像。
Nomad 不會建立這些應用程式工件,但可以使用 CircleCI,GitHub Actions 或本地構建等 CI 工具來建立工件,然後將其推播到儲存庫,Nomad 可以在排程作業時從中檢索它們。
建立應用程式後,工作流將繼續使用 Nomad。
接下來我們快速上手 Nomad, 主要展示如何部署範例應用程式。
這裡我們直接使用 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 啟動其他將資料寫入資料庫的短期作業。
Service(服務) 作業用於長期執行的服務(類似於 K8s 中的 Deployment),這些服務一直執行到顯式停止。
Batch 作業是指在成功退出之前一直執行的短期作業(類似於 K8s 中的 Job
和 CronJob
)。
nomad job dispatch
命令觸發作業。CronJob
)。範例應用程式 pytechco
模擬在一家技術公司工作的員工。他們聯機,完成任務,然後登出。
跳轉到本地計算機上範例 repo 的 jobs
目錄:
cd jobs
下面每個組成應用程式的 jobspec 檔案都將 driver
屬性設定為 docker
,並使用 image
屬性指定儲存在 GHCR 中 config
塊中的映象。而 Redis 作業使用了 Docker Hub 上託管的官方 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.