はじめに
NomadはHashiCorpが開発するオーケストレーションツールです。Kubernetesの競合ですが、機能をConsul、Vaultなど他のプロダクションに分割し、Nomad自身は特定の機能に集中しているため、少ないリソースでの運用が可能です。
またPodmanは少ない設定でrootlessな環境を構築でき、それゆえにセキュリティに優れているコンテナ管理ツールです。
特に理由のない限り、DockerコンテナをKubernetesで運用する方がほとんどでしょう。ですが今回は敢えて王道を逸れた環境にチャレンジしたいと思います。建前としての理由は、AWSやGoogleCloudなどのIaaSは高価なのでスモールスタートするには敷居が高いですが、Nomadを使うことで安価なVPSを利用できサーバーのコストを下げられること(学習コストはかかります)。本音はアザラシ好きだからです。
構成
OSはDebian13(Trixie)です。私は普段AlpineLinuxを使うのですが、HashiCorp製品はAlpine向けパッケージを準備するのが大変なので、別の機会にしたいと思います。
実際にコンテナが稼働するクライアントノード1台と、それらを管理するサーバーノード1台で構成します。
インストール
クライアントノード・サーバーノード共にHashiCorpのインストールマニュアルに従ってNomadをインストールして、自動起動するように設定してください。
# systemctl enable nomad
# systemctl start nomad
上記に加えて、クライアントノードのみNomadのPodmanプラグインとPodman本体をインストールします。
# apt install nomad-driver-podman podman
設定
サーバーノード
サーバー側の設定は比較的シンプルです。
data_dir = "/opt/nomad/data"
bind_addr = "0.0.0.0"
datacenter = "dev"
name = "ServerNode"
log_file = "/var/log/nomad/nomad.log"
server {
enabled = true
bootstrap_expect = 1
}
client {
enabled = false
}
クライアントノード
クライアント側の設定は、プラグインに関する記述が必要です。
ここでは seal(UID:1000) という一般ユーザーでPodmanを動かす想定で設定します。
data_dir = "/opt/nomad/data"
plugin_dir = "/opt/nomad/data/plugins"
bind_addr = "0.0.0.0"
datacenter = "dev"
name = "ClientNode"
log_file = "/var/log/nomad/nomad.log"
server {
enabled = false
}
client {
enabled = true
servers = ["xxx.xxx.xxx.xxx"] # サーバーノードのIPアドレス
}
plugin "nomad-driver-podman" {
config {
socket {
name = "xxx"
socket_path = "unix:///run/user/1000/podman/podman.sock"
}
disable_log_collection = false
}
}
一般ユーザーsealで以下のコマンドを実行します。
$ systemctl --user enable --now podman.socket
今度はrootになって以下のコマンドを実行します。
# loginctl enable-linger seal
これで設定は完了です。
実行
では実行してみましょう。サーバーノードにログインして以下のコマンドを実行し、Jobファイルを作成してください。
$ nomad job init -short
コマンドが成功すると、example.nomad.hclというファイルが生成されます。これを修正します。
job "example" {
datacenters = ["dev"] # 追加:コンテナを実行するdatacenter名
group "cache" {
count = 1 # 追加:実行するコンテナグループの個数
network {
port "db" {
to = 6379
}
}
task "redis" {
driver = "podman" # 修正:Podmanを使うように修正
config {
image = "redis:7"
ports = ["db"]
auth_soft_fail = true
socket = "xxx" # 追加:nomad.hclで設定したsocket名
}
identity {
env = true
file = true
}
resources {
cpu = 500
memory = 256
}
}
}
}
では実行してみましょう。
$ nomad run example.nomad.hcl
クライアントノードにログインして、実際にコンテナが動いているかを確認してください。
最後に
いかがでしたでしょうか。たまにはデファクトスタンダードからはずれてみるのも楽しいのではないでしょうか。
ちなみにPodmanのキャラクターは純粋なアザラシではなくて、空想上のアザラシであるセルキーだそうです。