📜

担当サービスがAWS移管したので、今まで使っていたNomadについて振り返る

2024/12/19に公開1

はじめに

この記事はGMOメディア株式会社 Advent Calendar 2024の18日目の記事です。

初めまして、GMOメディア株式会社でWebエンジニアしているjunyamaです。

今回、自分が担当しているWebサービスのインフラをAWSへ移管したので今までdockerのオーケストレーションツールとして使用していたnomadについて記事にしてみようと思います。

Nomadとは

普通に「Nomad」と検索すると、ノマドワーカーなどに引っ張られるので、「Nomad hashicorp」で検索しましょう。

Nomadとは、様々なアプリケーションに対応しているワークロード・オーケストレーターです。

自分たちはDockerのオーケストレーションツールとして使用していましたが、コンテナ以外でもmacOS、Windows、Linux、Java、VM、バッチアプリケーションなど様々なアプリケーションに対応しています。

担当しているWebサービスでは、自分が新卒1年目の2020年からコンテナ化プロジェクトを開始していて、その際にNomadを採用しました。

Nomad vs. Kubernetes

dockerのオーケストレーションツールとして使うとなると、気になるのはKubernetesとの違いです。

やはりよく話題になるからか、公式に以下のページがあります。

ざっくりまとめると、Kubernetesはクラスタ管理とスケジューリングだけではなくservice discoveryやモニタリングなど、コンテナ運用に必要な機能が豊富にあります。

比べてNomadは、クラスタ管理とスケジューリングのみに焦点を当て、service discoveryにはConsul、secret管理にはVaultなどのツールを組み合わせて運用することを想定しています。

そのためNomadはKubernetesに比べてシンプルで軽量です。

自分たちのサービスでも、コンテナ化を行う際にNomadを採用した理由はそこで、シンプルゆえに学習コストが低くWevエンジニア側も把握しやすいのではないかと採用されていました。

Nomadの構成

Nomadには2つの実行モードがあり、Clientモード、Serverモードのどちらかで起動します。(調べたら一応両方のDevelopmentモードあるみたい👀)

ServerはNomadのクラスタを管理する役割を持ち、ClentにTaskを受け渡す役目があります。

Serverの数は決まりはなく、1台のLeaderと、必要であれば任意の数のFollowerを用意することも可能です。

ClientはServerからTaskを受け取り実行します。基本コンテナは、Clientが動いてるサーバーで動くのでコンテナの中に入りたい時はClientサーバーに入ります。

軽く動かす

Nomadを動かす際には、.nomad拡張子のJobファイルを作ります。

nomad job initコマンドを実行するとサンプルが作られるのでそのまま使ってテストします。

(テストする際、自分では残っている環境(serverとclientを立ち上げた環境)で実行してますが、試したい場合はDevelopmentモードでNomadを起動して上げると楽そう)

$ nomad job init
Example job file written to example.nomad

$ nomad job run example.nomad
==> Monitoring evaluation "86247039"
		Evaluation triggered by job "example"
    Evaluation within deployment: "c9601532"
    Evaluation status changed: "pending" -> "complete"
==> Evaluation "86247039 finished with status "complete"
略

起動はこれで完了です

statusを確認したい場合は以下のようにするとリストで表示されます。

$ nomad status
ID                                 Type     Priority  Status   Submit Date
example                            service  50        running  2024-12-19T04:02:49+09:00
local-app                          service  50        running  2024-09-26T15:06:49+09:00
local-daemons                      service  50        pending  2024-09-26T15:07:53+09:00

nomad statusの後ろにjob IDを入れると詳細を表示できます

$ nomad status example
ID            = example
Name          = example
Submit Date   = 2024-12-19T04:02:49+09:00
Type          = service
Priority      = 50
Datacenters   = dc1
Namespace     = default
Status        = running
Periodic      = false
Parameterized = false

Summary
Task Group  Queued  Starting  Running  Failed  Complete  Lost  Unknown
cache       0       0         1        0       0         0     0

まとめ

軽く起動とstatus確認だけではありましたが、Nomadについて紹介しました。

このほかにも、jobファイルの中身を弄りtaskごとにmemoryの割り当てを変えたり、ヘルスチェックを行い立ち上げに失敗すれば、再度立ち上げ直したり、rollbackさせたりもできます。

自分は学生時代には、あまりコンテナをゴリゴリやってないのもあって、Kubernetesの良さを何も知らずに、Nomadを用いてコンテナ化を進めていましたが、今振り返れば意外と覚えること少なかったなと感じます。

もちろんNomad特有の問題、インフラ側で考えないといけないことは色々ありましたが、サービス担当のWebエンジニアに関わる部分は学習コストが少なくすんだなと思います。

オーケストレーションツールは使いたいけど、Kubernetesを構築・運用するリソースはない方は一度Nomadを試してみるのもいいかもしれません🙇‍♂️

(自分はそろそろKubernetesを触らねば。。。

GMOメディアテックブログ

Discussion

はおりんはおりん

ようこそk8sへ!
Nomadはシンプルだったけど、k8sには「「広く普及しているがゆえにドキュメントと事例がめっちゃ多い」という強みはありますね。ただまぁ、シンプルに運用しようと心に決めてかからないとすぐに複雑化するっていうか複雑化しやすいところが、Nomadに比べて欠点かもしれませんな