Check! Azure Container Service (ACS) のエージェントVMを、増やしたりスケールアップしたり

こんばんは、オークファンの @dz_ こと大平かづみです。

Prologue - はじめに
====
[Azure Container Service](https://azure.microsoft.com/ja-jp/services/container-service/ "Azure Container Service | Microsoft Azure") が、思いのほかすんなりとコンテナのクラスタ環境を作ってくれるので、面白くていろいろ試しています。

Azure Container Service とは？
----
Azure 上に、コンテナを配置できるクラスタを構築してくれるサービスです。いくつかの初期設定を行うだけで、 Azure のリソースを適切に構成してくれます。

クラスタのオーケストレーションツールには、 [DC/OS](https://dcos.io/ "The Definitive Platform for Modern Apps | DC/OS") か [Docker Swarm](https://docs.docker.com/swarm/ "Docker Swarm") を選ぶことができます。

両方触ってみたんですが、Web UI がある DC/OS が便利そうで、いろいろ試しています。また、DC/OS 版には、 [Marathon](https://mesosphere.github.io/marathon/ "Marathon: A container orchestration platform for Mesos and DCOS") というコンテナを管理するプラットフォームも付随しています。

詳しくは、ドキュメント「[Azure Container Service の概要 | Microsoft Azure](https://azure.microsoft.com/ja-jp/documentation/articles/container-service-intro/ "Azure Container Service の概要 | Microsoft Azure")」がご参考になると思います。

知りたいこと
====
Azure Container Service は、マスター群は [仮想マシン](https://azure.microsoft.com/ja-jp/services/virtual-machines/ "Virtual Machines - Linux & Windows VM | Microsoft Azure") と [可用性セット](https://azure.microsoft.com/ja-jp/documentation/articles/virtual-machines-linux-manage-availability/#configure-multiple-virtual-machines-in-an-availability-set-for-redundancy "Linux VM の可用性管理 | Microsoft Azure") で構成されています。

一方、エージェント群は [仮想マシン スケール セット](https://azure.microsoft.com/ja-jp/documentation/articles/virtual-machine-scale-sets-overview/ "仮想マシン スケール セットの概要 | Microsoft Azure") で構成されています。

コンテナは、このエージェントの仮想マシンスケールセット上に展開されるわけです。

そこで、このエージェント群の仮想マシンスケールセットに変更を加えたときに、稼働しているコンテナがどうなるのか確認してみました！（DC/OS構成のみ、確認しました。）

結果 (DC/OS)
====
仮想マシンスケールセットの仮想マシン台数増減や、インスタンスタイプの上げ下げをして、稼働中のコンテナがどうなるか確認しました。

なお、検証した環境は DC/OS、仮想マシンスケールセットの更新ポリシーは「自動」で確認しました。また、コンテナは Marathon によってヘルスチェックを行っています。

仮想マシンスケールセットのスケールアウト/イン
----
仮想マシンスケールセットの仮想マシン数の設定を、増減した結果はこちらです。

|操作|コンテナの動き|
|----|-------------|
|仮想マシンを増やす|待機中のコンテナが、新しい領域上に展開される。|
|仮想マシンを減らす|単純に数を減らすと、コンテナが稼働中か否かに関わらず仮想マシンが落とされる。十分にコンテナが冗長化されていれば、サービスは継続する。(影響を出したくなければ、手動で仮想マシンを減らすとよさそう）|

なお、仮想マシンスケールセットの仮想マシンが増減した場合、Load Balancer がどう対応するかは別途確認する予定です。

仮想マシンスケールセットのスケールアップ/ダウン
----
スケールアップ/ダウンでは、仮想マシンを立ち上げ直すことになるので、コンテナの稼働は一時的に止まります。しかし、仮想マシンが立ち上がってから順次コンテナが復帰します。

|操作|コンテナの動き|
|----|-------------|
|仮想マシンのメモリを増やす|仮想マシンが立ち上がるまでコンテナが不通になるが、起動後に自動で再配置される。|
|仮想マシンのCPU数を増やす|仮想マシンが立ち上がるまでコンテナが不通になるが、起動後に自動で再配置される。CPUの個数によって、１つの仮想マシン上で稼働できるコンテナの数が決まる。|
|仮想マシンのメモリ・CPUを下げる|稼働できなくなったコンテナは、再配置される。余裕がない場合は、待機状態となる。|

仮想マシンスケールセットを操作する方法
====
さて、この仮想マシンスケールセットは、ポータルからはまだ操作できませんが、以下の方法で操作できます。

Azure CLI を使う
----
私は Windows も Mac も使うので、Node.js で作られた Azure CLI で仮想マシンスケールセットを操作しました。

### スケールする場合
```bash
$ vmss scale [options] <resource-group> <name> <new-capacity>
```

### インスタンスタイプなどを変更する場合

```bash
# VMスケールセットの設定を取得する
$ azure vmss get -g <resource-group-name> -n <resource-name> --json > data.json

# 設定を書きだした json ファイルに対して、変更を加える（例: 台数を3台に、インスタンスタイプを Standard_A2 に変更）
$ azure vmss config sku set --capacity 3 --name Standard_A2 --parameter-file data.json

# 設定を書きだした json ファイルに対して、変更を加える（例: 変更の反映を自動で行う）
$ azure vmss config update-policy set --mode Automatic --parameter-file data.json

# 設定を反映する
$ azure vmss create-or-update -g <resource-group-name> -n <resource-name> --parameter-file data.json
```

なお、Azure CLI のインストールについては、こちら「[Azure CLI のインストール](https://azure.microsoft.com/ja-jp/documentation/articles/xplat-cli-install/ "Azure コマンド ライン インターフェイスのインストール | Microsoft Azure")」をご参照下さいませ。

また、 `azure vmss` のコマンドは、ARM(Azure Resource Manager) モードで利用できます。モードの切替について下記にまとめました。ご参考になれば幸いです。

- [Check! Azure CLI のモードを切替える (ARM/ASMモードによって使えるコマンドが異なる)](http://qiita.com/dz_/items/972c64849dd9b174edc2 "Check! Azure CLI のモードを切替える (ARM/ASMモードによって使えるコマンドが異なる)")

その他
----
Azure のリソースは、PowerShell や REST API による操作が可能です。環境に合わせてご利用くださいませ。

- [Azure PowerShell のインストールおよび構成方法](https://azure.microsoft.com/ja-jp/documentation/articles/powershell-install-configure/ "Azure PowerShell のインストールおよび構成方法")
- [Azure Resource (ARM) の REST API による管理](https://blogs.msdn.microsoft.com/tsmatsuz/2015/09/08/azure-resource-arm-rest-api/ "Azure Resource (ARM) の REST API による管理 | 松崎 剛 Blog")

Epilogue - おわりに
====
コンテナのクラスタを構築・運用するのはなかなか大変かと思いますが、 Azure Container Service なら比較的柔軟に利用できそうです。引き続き調査を進めます！