Skip to content

nomadのチュートリアルアプリをデプロイ

Posted on:September 16, 2024 at 11:25 AM

概要

この記事ではhashicorp nomadをminipcにインストールし、dev環境で動かすこと目指す。

なぜkubeではない?

kubernetes環境が壊れて、その際につらいため。そもそものスタックがデカすぎてトラブルシューティングが厳しい。

時代は複雑からシンプルへと移行している

nomadって?

概ねkubernetesと同じであるが、アプリ間通信はconsul, シークレット管理はvaultがやるので機能が分割されている。

Nomad は、柔軟なスケジューラおよびワークロードオーケストレーターであり、オンプレミスおよびクラウドインフラストラクチャ上で任意のアプリケーションを大規模に展開および管理できるようにします。Nomad の主な機能には以下のものがあります。

セットアップ

nomadのインストール

sudo apt-get update && \
sudo apt-get install wget gpg coreutils

hashicorpのGPGキー追加

wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg

HashiCorp Linux repository追加

echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list

nomadインストール

sudo apt-get update && sudo apt-get install nomad

インストールの整合性チェック

nomad -v

クラスター作成

※事前にdockerのインストールが必要

チュートリアルリポジトリをCloneする

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

nomadを立ち上げる

IPアドレスの部分は、自分はnodeのプライベートIPである192.168.16.10にした

sudo nomad agent -dev \
  -bind 0.0.0.0 \
  -network-interface='{{ GetDefaultInterfaces | attr "name" }}'

別のターミナルセッションで、クラスターのアドレスを設定

export NOMAD_ADDR=http://localhost:4646

なお、ここでNICのバインドを0.0.0.0にしていない場合はそのIPを指定する

nomadへの接続を確認する

nomad node status

webuiもある

http://<nomad instanceのip|localhost>:4646/ui

ジョブをデプロイ・アップデート

以下翻訳+要約

Nomad クラスターをデプロイし、CLI の設定が完了したのであれば、次のステップはアプリケーションのデプロイです。

このチュートリアルでは、サンプルアプリケーションのデプロイと更新を実行します。この過程で、Nomad のジョブ仕様について学びます。

サンプルアプリケーションは Docker コンテナで実行され、データベースとデータベースから読み取る Web フロントエンドで構成されています。パラメータ化されたバッチ ジョブでデータベースを設定し、周期的なバッチ ジョブで追加の短期間のジョブを開始してデータベースにデータを書き込む設定を行います。

ジョブの種類

Nomad には、サービス、パラメータ化されたバッチ ジョブ、周期的なバッチ ジョブ、その他のシステム ジョブなどの複数のジョブ種類がサポートされています。このチュートリアルでは、サービス ジョブとパラメータ化されたバッチ ジョブ、周期的なバッチ ジョブについて取り上げます。

サポートされているジョブ種類

  • サービス ジョブ
    • 長時間稼働するサービス: 明示的に停止されるまで実行され続けます。
  • バッチ ジョブ
    • 短期間実行するジョブ: 成功して終了するまで実行され続けます。
  • 化ブロック(parameterized)
    • 必須または任意の入力をジョブに受けつけるように設定できます。
    • nomad job dispatch コマンドでジョブをトリガーすることができます。
  • periodicブロック
    • Nomad ジョブを特定の時間に実行するようにスケジュールできます。

サンプルアプリケーションをreviewする(reviewはnomad用語)

cd jobs

サンプルアプリのredisを起動

$ nomad job run pytechco-redis.nomad.hcl
==> 2024-09-15T23:41:22+09:00: Monitoring evaluation "3afb9d5e"
    2024-09-15T23:41:22+09:00: Evaluation triggered by job "pytechco-redis"
    2024-09-15T23:41:23+09:00: Evaluation within deployment: "4d56d0b5"
    2024-09-15T23:41:23+09:00: Allocation "14aa957f" created: node "11788a04", group "ptc-redis"
    2024-09-15T23:41:23+09:00: Evaluation status changed: "pending" -> "complete"
==> 2024-09-15T23:41:23+09:00: Evaluation "3afb9d5e" finished with status "complete"
==> 2024-09-15T23:41:23+09:00: Monitoring deployment "4d56d0b5"
   Deployment "4d56d0b5" successful

    2024-09-15T23:41:38+09:00
    ID          = 4d56d0b5
    Job ID      = pytechco-redis
    Job Version = 0
    Status      = successful
    Description = Deployment completed successfully

    Deployed
    Task Group  Desired  Placed  Healthy  Unhealthy  Progress Deadline
    ptc-redis   1        1       1        0          2024-09-15T23:51:36+09:00

サンプルアプリのweb画面をデプロイ

$ nomad job run pytechco-web.nomad.hcl
==> 2024-09-15T23:43:47+09:00: Monitoring evaluation "8a3d41d9"
    2024-09-15T23:43:47+09:00: Evaluation triggered by job "pytechco-web"
    2024-09-15T23:43:48+09:00: Evaluation within deployment: "9b74cc14"
    2024-09-15T23:43:48+09:00: Allocation "d0998833" created: node "11788a04", group "ptc-web"
    2024-09-15T23:43:48+09:00: Evaluation status changed: "pending" -> "complete"
==> 2024-09-15T23:43:48+09:00: Evaluation "8a3d41d9" finished with status "complete"
==> 2024-09-15T23:43:48+09:00: Monitoring deployment "9b74cc14"
   Deployment "9b74cc14" successful

    2024-09-15T23:44:03+09:00
    ID          = 9b74cc14
    Job ID      = pytechco-web
    Job Version = 0
    Status      = successful
    Description = Deployment completed successfully

    Deployed
    Task Group  Desired  Placed  Healthy  Unhealthy  Progress Deadline
    ptc-web     1        1       1        0          2024-09-15T23:54:01+09:00

web画面にアクセス 自分は192.168.16.10にサーバーがあるのでそこに接続

http://192.168.16.10:5000

pytecho-setupをセット

nomad job run pytechco-setup.nomad.hcl

pytecho-setupジョブを実行

nomad job dispatch -meta budget="200" pytechco-setup

employeeジョブを実行

nomad job run pytechco-employee.nomad.hcl
Job Warnings:
1 warning:

* cron is deprecated and may be removed in a future release. Use crons instead

Job registration successful
Approximate next launch time: 2024-09-15T15:38:27Z (3s from now)

employeeジョブの中身でcronの指定があったが3秒に一回とcronの60倍の分解能を持つ最強仕様

periodic {
  cron             = "0/3 * * * * * *"
  prohibit_overlap = false
}

なお、cronはdeprecatedされるらしく、今後はcronsを使った方が良いらしい

cronsで書く場合は以下の通りになる

periodic {
  crons             = ["0/3 * * * * * *"]
  prohibit_overlap = false
}

これで一旦nomadのクラスタ作成チュートリアル終了

サンプルアプリケーションを止める

nomad job stop -purge pytechco-employee
nomad job stop -purge pytechco-redis
nomad job stop -purge pytechco-setup