Azure で Nomad(Consul)のクラスターを作成する
Web サーバーとスケジュールジョブなら App Service と Logic App + Azure Container Instance が最初の選択肢だと考えていたが、他の選択肢を調べてみようと検証した。
Nomad 事情
Nomad は Hashicorp のプロダクト。
Nomad by HashiCorp
日本に馴染みがあるところでは Circle CI や trivago が使っている。
Who Uses Nomad - Nomad by HashiCorp
trivago の記事で Kubernetes と Nomad の違いについて触れている。
"(意訳)Kubernetes は自動車だとしたら Nomad はスクーターで、場合に応じて使い分けます"
Maybe You Don't Need Kubernetes | Matthias Endler
公式でも Kubernetes との違いについて触れている。
"(意訳)Kubernetes は Docker にフォーカスしてますが Nomad は一般的な利用を想定しています"
Nomad vs. Kubernetes - Nomad by HashiCorp
Nomad が Docker 特化ではないとはいえ k8s を使うべきシーンはそこまで多くないと考えていて、Nomad がそのときの代替案になるのではないかと考えている。
知るかぎり Nomad の as a Service はないため、下回りは自分で整える必要がある。
事前知識
- Nomad 公式の Getting Started を完了している
- Azure Virtual Machine やその周辺の知識を保持している
- Terraform は利用している
- Consul と Packer は触ったことがない
チュートリアル
Hashicorp が手順を用意してくれているので、それに沿って行う。
Nomad と Consul を同じクラスターにデプロイすることにし、"Deploy Nomad and Consul in the same cluster" の手順を追う。
手順の中で terraform-azurerm-nomad
を見ていたと思ったらリンク先が terraform-azurerm-consul
でいつの間にか違うリポジトリ、ということがあるのでそこは注意すること。
Consul と Nomad 入りの VM イメージ作成
Use the install-consul module from the Consul Azure Module and the install-nomad module from this Module in a Packer template to create an Azure Image with Consul and Nomad.
Packer 使って VM Image を作成してねということなので、リポジトリ内の以下を参考に作成する。
https://github.com/hashicorp/terraform-azurerm-nomad/tree/master/examples/nomad-consul-image
Packer 初めてだったのでよくわからずにそのまま packer build nomad-consul.json
したが、できていた。
環境変数として与える Service Principal のスコープを制限しようとしたところ、packer-XXX
というリソースグループを作成できる必要があり、そこだけハマった。
あー、Resource Group 適当に作る挙動なのか。対象の Resource Group のみの Service Principal がエラーになってたのこれが原因か。
— kheiakiyama (@kheiakiyama) 2019年10月26日
Consul と Nomad のサーバークラスター作成
Deploy a small number of server nodes (typically, 3) using the consul-cluster module. Execute the run-consul script and the run-nomad script on each node during boot, setting the
--server
flag in both scripts.
Terraform を使ってクラスターを作成する。
クラスターは Virtual Machine Scale Set で構成されている。
ドキュメントを読んで必要なパラメータを入れれば構成できる、はずなのだが Consul と Nomad が動いておらず、デプロイ後にミドルウェアのインストールを SSH で接続して行った。
ここは仮想マシンの起動スクリプトで完結できないと不便なので、実用するときはもう少し掘り下げる予定。
Consul と Nomad のクライアントクラスター作成
Deploy as many client nodes as you need using the nomad-cluster module. Execute the run-consul script and the run-nomad script on each node during boot, setting the
--client
flag in both scripts.
基本的にサーバークラスターと同じ要領で作業を進めるのみ。
自分の場合はサーバークラスターを作成した時点でコア数上限に引っかかり、別リージョンに作成した。
Consul と Nomad の datacenter
と region
の値は terraform テンプレートにリージョンとして書いてある値に準じるため接続できないエラーが出ていた。
デプロイ後に config を書き直すことで対応。
感想
Consul サーバークラスターのマネージドサービスが現在プライベートベータになっている。
Announcing HashiCorp Consul Service on Azure
Kubernetes も踏まえてこれを提供しているようだが、Nomad のマネージドサービスが欲しいなという印象。
そうはいっても現状はないので、Virtual Machine Scale Set をうまく使って仮想マシンを操作する必要がないように起動スクリプトを整備するのと、Consul と Nomad のアップデートなどの運用フローを整備できれば実用に耐えられるかなという印象。
Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス
- 作者: Kief Morris,宮下剛輔,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/03/18
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る