担当サービスがAWS移管したので、今まで使っていたNomadについて振り返る
はじめに
この記事は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を触らねば。。。
Discussion
ようこそk8sへ!
Nomadはシンプルだったけど、k8sには「「広く普及しているがゆえにドキュメントと事例がめっちゃ多い」という強みはありますね。ただまぁ、シンプルに運用しようと心に決めてかからないとすぐに複雑化するっていうか複雑化しやすいところが、Nomadに比べて欠点かもしれませんな