LoginSignup
5

More than 5 years have passed since last update.

Azure Container Service エンジン入門

Last updated at Posted at 2016-12-11

このエントリは「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 詳しくないので間違ってたら教えてください。。

ACSエンジンのインストール
# ライブラリのダウンロードとインストール
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

このサンプルをベースに、次のような環境を作ってみます。

ACS

この環境は、ほとんど Azure Container Service の概要 に記載されているものと同じですが、仮想ネットワークを既存のものに含める、という点が違います。

以下、上の環境のクラスタ定義ファイルです。
※Swarmモードで作ります。

クラスタ定義ファイル(swarmvnet.json)
{
  "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 コマンドを使ってみましょう。

使い方は簡単、引数にクラスタ定義ファイルを指定してあげるだけです。

ARMテンプレートを生成する
# 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 さんです!

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
5