Nomad 系列-快速上手

2023-09-06 12:02:09

系列文章

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 binariesJava 應用程式 和使用 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 中的 JobCronJob)。

  • 引數化 (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 中的 Deployment
  • group "ptc-redis": group 塊 ptc-redis
  • count = 1: 副本數為 1
  • to = 6379: 位於 network 塊中,指示連線到 (to) 容器中的 6379 埠 (host 或 bridge 埠隨機分派)
  • service {: service 塊,類似於 K8s 中的 Service
  • provider = "nomad": Nomad 從 1.3 版本及以後,新增 Nomad native service.