Azure Service Broker の使い方　（１）

[Azure Service Broker](https://github.com/Azure/azure-service-broker) は、Azure のマネードサービスをHelm からプロビジョンするための仕組みです。今日はこれの使い方を調べて見ました。

# 1. install

Azure Service Broker で前提となっている、Service Calalog は残念ながら今の所 AKS では動かないらしく、ACS をデプロイする必要があります。

まずは、[Azure / helm-charts](https://github.com/Azure/helm-charts) をクローンしておきます。

```
$ git clone git@github.com:Azure/helm-charts.git
```

## 1.1. Install Service Catalog

まず、[Service Catalog](https://github.com/Azure/helm-charts/tree/master/service-catalog) の手順を見ます。これは、[Open Service Brokers](https://www.openservicebrokerapi.org)と統合されていて、データベース、オブジェクトストレージ、メッセージキューなどをアプリケーションと関連付けをしながらプロビジョンしてくれるものみたいです。

[ACS-engine / Release](https://github.com/Azure/acs-engine/releases)から、ACS Engine のバイナリを落として展開して見ましょう。私は、`/Users/ushio/bin` にぶち込んどきました。


先にリソースグループを作っときましょう。[リソース グループの作成](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/xplat-cli-azure-resource-manager)

```
$ az group create --name ACSResource --location "japaneast"
```

### 1.1.1. Install ACS by ACS-engine

このツールをデプロイしたい場合、Kubernetes の[Aggregated APIs](https://kubernetes.io/docs/concepts/api-extension/apiserver-aggregation/)　つまり、サードパーティのAPIを追加可能にするためのものを使用可能にする必要があります。

```
$ acs-engine version
Version: v0.9.4
GitCommit: 50709347
GitTreeState: clean

$ acs-engine deploy \
    --subscription-id YOUR_SUBSCRIPTION_ID \
    --location japaneast \
    --auto-suffix \
    --resource-group ACSResrouce \
    --api-model acs-engine-kubernetes-config.json 

```

上記のコマンドを自分の環境に合わせて実行しますが、その前に[Azure / helm-charts](https://github.com/Azure/helm-charts)にある、`acs-engine-kubernetes-config.json` の中身を変更しておきます。自分のパブリックキーや、dnsPrefix などはこちらの編集しておきます。ちなみに、中身は次の通り。

標準の、ACS-engine のテンプレートと見比べると、`enableAggregatedAPIs` `enableRbac` が true になっています。また、`gcHighThreshhold` `gcLowThreshold` がの数値が設定されています。これらはおそらく[Configuring kubelet Garbage Collection](https://kubernetes.io/docs/concepts/cluster-administration/kubelet-garbage-collection/)で説明されている不要になったイメージのガーベッジコレクションの設定で、ディスク容量が70% 使用されると、60% になるまで、もっとも使われていなイメージから削除します。デフォルトは、85%, 80% みたいですね。[const.go](https://github.com/Azure/acs-engine/blob/0ec78c790f7696e1864fbad68756ccc04a125e40/pkg/acsengine/const.go#L79-L81)参照

ここで設定しているパブリックキーは、master/agent にssh 接続するときに使われます。

_acs-engine-kubernetes-config.json_ 

```json
{
    "apiVersion": "vlabs",
    "properties": {
        "orchestratorProfile": {
            "orchestratorType": "Kubernetes",
            "kubernetesConfig": {
                "gcHighThreshold": 70,
                "gcLowThreshold": 60,
                "enableAggregatedAPIs": true,
                "enableRbac": true
            }
        },
        "masterProfile": {
            "count": 1,
            "dnsPrefix": "",
            "vmSize": "Standard_D2_v2"
        },
        "agentPoolProfiles": [
            {
                "name": "agentpool1",
                "count": 3,
                "vmSize": "Standard_D2_v2",
                "availabilityProfile": "AvailabilitySet"
            }
        ],
        "linuxProfile": {
            "adminUsername": "azureuser",
            "ssh": {
                "publicKeys": [
                    {
                        "keyData": ""
                    }
                ]
            }
        },
        "servicePrincipalProfile": {
            "clientId": "",
            "secret": ""
        }
    }
}
```

先ほどのオプションがわからないのが気持ちわるので調べておきます。

| Flags | 説明|
|:------------|:-------------------|
| --subscription-id | Azure の Subscription id |
| --location | Azure の Location (e.g. japaneast) |
| --auto-suffix | dnsPrefix に対して自動でタイムスタンプをつける設定 |
| --api-model | apimodel ファイルへのPath |

これで、Service Broker が動くACS-engine のクラスタが出来上がりました。

ちなみに、最初は`--resource-group` オプションが指定できたのにつけるの忘れていました。そしたら、`dnsPrefix` の名前でリソースグループが作られていましたw。もちろん作り直しました。

ちなみに、いきなりデプロイせず、生成される ARM テンプレートを愛でて見たい場合は、

```
acs-engine generate --api-model acs-engine-kubernetes-config.json
```

設定の通り、`--auto-suffix` によって、リソース名に数字が割り当てられています。

<img width="816" alt="Screen Shot 2017-11-18 at 8.28.00 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/5172421d-7b7c-4103-638c-0d7ec9e4d26c.png">

dnsPrefix が、sabrk にしたので、ドメイン名の命名は次のようです。

<img width="451" alt="Screen Shot 2017-11-18 at 8.28.20 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/545da56a-4a17-65e6-9e3e-537779d8e04c.png">



その（２）に続きます。

# Resource

* [Azure / helm-charts](https://github.com/Azure/helm-charts)
* [Azure Service Broker](https://github.com/Azure/azure-service-broker)
* [ACS-engine / Release](https://github.com/Azure/acs-engine/releases)
* [Configuring kubelet Garbage Collection](https://kubernetes.io/docs/concepts/cluster-administration/kubelet-garbage-collection/)