このエントリは「Microsoft Azure Advent Calendar 2016」の12日目です。
書いてあること
- Azure Container Service オープンソース化
- どうやって使うの?
- acs-engine がすぐ使えるコンテナを Docker Hub に上げました
Azure Container Service って?
Azure には、Azure Container Service(以下ACS) というコンテナ環境を簡単に作れるサービスがあります。
AWS でいうところの Amazon EC2 Container Service (ECS) ですね。
ただ、ちょっと違うところとしては、ECS がガッツリとコンテナ管理を含めてサービスを作りこんでいるのに対し、ACS は、オープンソースな製品を組み合わせて Azure 上にコンテナ基盤を作りますよ、管理は各製品に用意された方法でよろしくね、という点で、アプローチの違いがあります。
そして、このACS を使うと、Swarm・DC/OS・Kubernetes といった、Docker でよく聞くオーケストレーション製品がすぐに使えるようになります。
この辺りのサービス紹介は、公式のドキュメントをご参照ください。
Azure Container Service の概要
https://docs.microsoft.com/ja-jp/azure/container-service/container-service-intro
オープンソース化って?
そして、このACSが最近オープンソース化されました。
以下ニュースソース。
公式 : Azure Container Service: the cloud’s most open option for containers
TechCrunch Japan : MicrosoftがAzure Container Service Engineをオープンソース化、Kubernetesのネイティブインテグレーションも発表
Publickey : マイクロソフト、クラウドでコンテナサービスを実現する「Azure Container Service Engine」をオープンソースとして公開
サービスがオープンソース化ってどういうこと?というところが真っ先に疑問としてあるかと思いますが、要は、ACS をAzure へデプロイする時の ARM テンプレートを生成する部分が、オープンソース化したよ、という意味です。
ちなみに、今でもポータルからは ACS をデプロイすることはできるのですが、既存の仮想ネットワークへ所属させるというオプションが画面上無い為、現状これらのカスタマイズを行う為には、このオープンソース化された ACS エンジンを使う必要があります。
次では、実際に既存の仮想ネットワークに所属する ACS を作ってみます。
使ってみよう
ここからが本題。じゃーこのオープンソース化されたエンジンどうやって使うのか、というところを説明していきます。
必要なもの
- Golang が使える環境
- Azure のサブスクリプション(コンテナ環境のデプロイ時に使用。エンジンの使用のみでは不要)
使用方法
1. ACS エンジンを持ってくる
初めて知ったのですが、Golang には、Gitからライブラリを持ってくるという機能があります。
で、この機能を使って、GitHub で公開されている ACS エンジンをインストールします。
※Golang 詳しくないので間違ってたら教えてください。。
# ライブラリのダウンロードとインストール
go get github.com/Azure/acs-engine
# 依存関係もインストール
go get all
これで ACS エンジンが使えるようになりました。
ちなみに、ACS エンジンは、acs-engine というコマンドで使えます。
# acs-engine
usage: acs-engine [OPTIONS] ClusterDefinitionFile
read the ClusterDefinitionFile and output an arm template
options:
-artifacts string
directory where artifacts will be written
-classicMode
enable classic parameters and outputs
-noPrettyPrint
do not pretty print output
-parametersOnly
only output the parameters
2. クラスタ定義ファイルを作成する
acs-engine コマンドは、Cluster Definition File(クラスタ定義ファイル)から、ARM のテンプレートを生成します。
このクラスタ定義ファイルですが、ゼロから作るのはなかなか大変なので、サンプルを使いましょう。
サンプル
acs-engine/examples/vnet/swarmvnet.json
https://github.com/Azure/acs-engine/blob/master/examples/vnet/swarmvnet.json
ちなみに、クラスタ定義ファイルの詳細は以下をご参照ください。
ここに、必須のパラメーター等が記載されています。
Microsoft Azure Container Service Engine - Cluster Definition
https://github.com/Azure/acs-engine/blob/master/docs/clusterdefinition.md
このサンプルをベースに、次のような環境を作ってみます。
この環境は、ほとんど Azure Container Service の概要 に記載されているものと同じですが、仮想ネットワークを既存のものに含める、という点が違います。
以下、上の環境のクラスタ定義ファイルです。
※Swarmモードで作ります。
{
"apiVersion": "vlabs",
"properties": {
"orchestratorProfile": {
"orchestratorType": "Swarm"
},
"masterProfile": {
"count": 1,
"dnsPrefix": "tsunomuracs2",
"vmSize": "Standard_A2",
"vnetSubnetId": "/subscriptions/<サブスクリプションID>/resourceGroups/acsenginedemo/providers/Microsoft.Network/virtualNetworks/vnet/subnets/mastervnet",
"firstConsecutiveStaticIP": "172.19.3.21"
},
"agentPoolProfiles": [
{
"name": "agentpublic",
"count": 3,
"vmSize": "Standard_A2",
"dnsPrefix": "tsunomuracsagent",
"vnetSubnetId": "/subscriptions/<サブスクリプションID>/resourceGroups/acsenginedemo/providers/Microsoft.Network/virtualNetworks/vnet/subnets/agentvnet",
"ports": [
80,
443,
8080
]
}
],
"linuxProfile": {
"adminUsername": "tsunomur",
"ssh": {
"publicKeys": [
{
"keyData": "ssh-rsa AAAAB--略--npN root@alinsrv02"
}
]
}
}
}
}
見ての通りですが、count、dnsPrefix、vmSize、vnetSubnetID、ssh の publicKeys 等々は置き換えます。
この辺りは一度ポータルから ACS の環境を作ってみるとイメージがつくかと思います。
また、上の GitHub のサンプルは、エージェントノードとして、パブリックとプライベートの2つのスケールセットが定義されていますが、パブリックのみにしています。
※逆に、agentPoolProfiles に複数定義することで複数のスケールセットが出来上がります。
3. acs-engine コマンドを使って、ARMテンプレートを生成する
それではいよいよ acs-engine コマンドを使ってみましょう。
使い方は簡単、引数にクラスタ定義ファイルを指定してあげるだけです。
# acs-engine swarmvnet.json
wrote _output/Swarm-37618431/apimodel.json
wrote _output/Swarm-37618431/azuredeploy.json
wrote _output/Swarm-37618431/azuredeploy.parameters.json
acsengine took 233.693568ms
上のコマンドの結果の通り、_ouput
ディレクトリに ARM テンプレートが出力されます。
ちょっと出来上がったテンプレートを見てみましょう。
# ls -l _output/Swarm-37618431/
total 52
-rw------- 1 root root 1680 Dec 8 12:05 apimodel.json
-rw------- 1 root root 44329 Dec 8 12:05 azuredeploy.json
-rw------- 1 root root 1252 Dec 8 12:05 azuredeploy.parameters.json
# wc -l _output/Swarm-37618431/azuredeploy.json
1086 _output/Swarm-37618431/azuredeploy.json
#
という感じで、なかなかの量の JSON ファイルが出来上がりました。
ここまで見て頂いて分かったかと思いますが、ACS エンジンというのはぶっちゃけ、ARM テンプレートを生成する為のツールということですね。
4. デプロイする
ここまで来たらあとは azure
コマンドでデプロイしてあげれば完成です。
acsenginedemo という リソース グループ にデプロイします。
# azure group deployment create -g acsenginedemo -n acs-deploy -f azuredeploy.json -e azuredeploy.parameters.json -d All
デプロイできたらあとは SSH でつないで docker run が出来ます。
マスターノードには、2357番ポート で Swarm コンテナが動いているのでそこにつないであげます。
root@swarm-master-37618431-0:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a15e09e5a52e swarm:1.1.0 "/swarm manage --repl" 6 hours ago Up 6 hours 0.0.0.0:2375->2375/tcp containers_swarm_1
7835b6f7a6ba progrium/consul "/bin/start -server -" 6 hours ago Up 6 hours 0.0.0.0:8300-8302->8300-8302/tcp, 0.0.0.0:8400->8400/tcp, 53/tcp, 53/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8301-8302->8301-8302/udp containers_consul_1
root@swarm-master-37618431-0:~# export DOCKER_HOST=:2375
root@swarm-master-37618431-0:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@swarm-master-37618431-0:~# docker run -d -p 80:80 tsunomurdocker01-microsoft.azurecr.io/tsubasaxzzz/nginx
a1de10719317812c97eb4cb6c9e74f0104553838c84e147a356425ef37c74e73
root@swarm-master-37618431-0:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1de10719317 tsunomurdocker01-microsoft.azurecr.io/tsubasaxzzz/nginx "nginx -g 'daemon off" 4 seconds ago Up 2 seconds 172.19.3.7:80->80/tcp, 443/tcp swarm-agentpublic-37618431000003/nauseous_bhaskara
root@swarm-master-37618431-0:~#
そして、上の通り、残念ながら今のところは、Docker 1.12 で組み込まれた Swarm ではなく、以前のタイプの Swarm なので、少し使い方は独特です。
そのあたりは、Docker Swarm 入門ハンズオン が詳しそうです。
まとめ
ざっと ACS エンジンの概要がお分かり頂けたでしょうか。
基本的に出来ることというのは大きくは変わっていないのですが、acs-engine コマンドを他のツール、例えばCIツールと組み合わせることも出来たりするので、これまで以上に幅は広がったのではないでしょうか。
tsubasaxzzz/acs-engine を作りました
acs-engine コマンドがすぐに使えるイメージを作って、Docker Hub に登録しました。
宜しければお使いください。
参考までに、Dockerfile です。
FROM golang
RUN set -x && \
go get github.com/Azure/acs-engine && \
go get all && \
apt-get update && \
apt-get install -y vim
ちなみに、上で書いていた、Golang の環境や Azure CLI の環境、インストールめんどくさいなぁと思ったので Docker コンテナ使いました。コンテナ 最高。
参考リンク
Microsoft Azure Container Service Engine - Cluster Definition
https://github.com/Azure/acs-engine/blob/master/docs/clusterdefinition.md
Microsoft Azure Container Service Engine
https://github.com/Azure/acs-engine/blob/master/docs/acsengine.md
雑記
オートスケーリングの設定が無いけど、ARM テンプレートがりがり編集なのかな。。
クラスタ定義ファイルにスケーリングの設定も入ることを期待です。
さて、次回のアドベントカレンダーは…
Microsoft Azure Advent Calendar 2016
明日は @papeMK2 さんです!