Run mackerel-agent as a Nomad job
最近ブログを動かしている環境を単一のサーバーから Nomad クラスターへと変更しました。
以前からサーバーの監視を Mackerel を用いて行なっており、今回もクラスターを構成するノード上で mackerel-agent を起動し、監視を行います。
ただし、 Nomad のジョブとして動かしてみます。
Nomad のジョブとして mackerel-agent を動かす
今までは単一の VPS を使っていたので mackerel-agent は普通にサーバーにインストールしていました。
今回 Nomad を使うにあたりどのように mackerel-agent をインストールするか考えていて、普通にサーバーにインストールしても良いのですが、サーバーには Nomad とその関連パッケージ以外は入れないのが筋が良いと思うので、Nomad ジョブとして mackerel-agent を動かすことにしました。
mackerel-agent の Docker イメージ
Nomad ジョブにおいて具体的に処理を実行する部分はタスクと呼ばれています。タスクの実行手段 (シェルスクリプトなのかバイナリファイルの実行なのか等) はドライバーと呼ばれています。
デフォルトで対応しているドライバーの一つに Docker があり、本ブログで使用している CMS の Ghost やウェブサーバーの Nginx は Docker コンテナで動かしています。
mackerel-agent は公式で Docker イメージが提供されているので、mackerel-agent についても Docker ドライバーで動作させることができそうです。
Nomad のジョブとして mackerel-agent を動かすために必要なこと
いくつか注意すべき点がありました。
1 つのノードに複数の mackerel-agent が動かないようにしたい
Nomad クラスターを構成する各ノードでは Nomad クライアントが動いています。各 Nomad クライアントへジョブを割り当てる作業は Nomad サーバーが行います。Nomad サーバーはリソースの状況を鑑みてジョブを自動的に適切な Nomad クライアントへ割り当てます。そのため、一つの Nomad クライアント上に複数の同じジョブが割り当てられることは起こり得ます。
このままではサーバーの監視をまともに行うことができないので困る。
そこで、Nomad の機能を使用して各クライアントに 1 つの mackerel-agent ジョブが割り当てられるようにします。Nomad ジョブの定義は複数の節 (stanza) から成り、その中にジョブに制約を与えることができる constraint 節があります。
constraint 節で定義することのできる制約の一つに distinct_hosts があります。distinct_hosts はスケジューラーに同じノード上にタスクグループを配置しないように指示することができます。
これを使うことで mackerel-agent を各ノードに 1 つづつ起動することができます。 🐟
コンテナの特権モードを有効にする
mackerel-agent コンテナからホストの情報を取得するために特権モードを使用できるようにします。
Docker ドライバーのプラグインの設定から行うことができます。
コンテナがホストのボリュームをマウントできるようにする
mackerel-agent コンテナはホストの /var/run/docker.sock
パスと /var/lib/mackerel-agent/
パスをマウントする必要があるので、Docker ドライバーのプラグインの設定から volumes を有効にします。でも今見たらデフォルトで有効になってた。
selinuxlabel
これなんで有効にしたんだっけ…?忘れた。
mackerel-agent の自動退役の設定をする
自動退役の設定は mackerel-agent を stop した際に退役させる設定です。
この設定が無いと何らかの理由でコンテナが停止した場合等にホストの情報が Mackerel 上に残ってしまい、Mackerel 破産してしまいます!環境変数で設定します。
ジョブの定義で環境変数を設定するには env 節を使用します。
mackerel-agent 起動時にロールを設定する
これは必須では無いのですが、楽なので mackerel-agent 起動時にロールを指定するようにします。
opts 環境変数で指定できます。
Assign a role
To assign a role, add -role=service:role to opts environment variable.
docker run -hhostname
-v /var/run/docker.sock:/var/run/docker.sock
-v /var/lib/mackerel-agent/:/var/lib/mackerel-agent/
-e 'apikey='
-e 'opts=-v -role=service:role'
--name mackerel-agent
-d
mackerel/mackerel-agent
Docker Hub - mackerel/mackerel-agent
感想
良い。
使いながらもっと良い方法や設定に調整してく。 🐟