0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NomadとPodmanが奏でるOrchestration

Posted at

はじめに

NomadはHashiCorpが開発するオーケストレーションツールです。Kubernetesの競合ですが、機能をConsulVaultなど他のプロダクションに分割し、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

設定

サーバーノード

サーバー側の設定は比較的シンプルです。

/etc/nomad.d/nomad.hcl
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を動かす想定で設定します。

/etc/nomad.d/nomad.hcl
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というファイルが生成されます。これを修正します。

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のキャラクターは純粋なアザラシではなくて、空想上のアザラシであるセルキーだそうです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?