Azure Service Broker の使い方（２）

# Azure Service Broker の使い方　（２）

前回の続きから

# 前提条件

[前回](https://qiita.com/TsuyoshiUshio@github/items/ed4a8b8c1c2ead799128)は ACS-engine を使って、Service Catalog をインストール可能なクラスタを作成しました。他の前提条件を満たしていきます。

[Installing Service Catalog](https://github.com/kubernetes-incubator/service-catalog/blob/master/docs/install.md)の内容を実施します。

## Helm

Helm のインストールは簡単です。

```
$ brew install kubernetes-helm
$ helm init
```

ちなみに、ローカルキャッシュとして、`~/.helm` が作成され、`kubectl` のコンテキストに`tiller` というサーバーが作られます。

## Helm Charts

Service Catalog の Helm repository をローカル環境に足して見ます。

```
helm repo add svc-cat https://svc-catalog-charts.storage.googleapis.com
```

これを実施すると、ローカルの `~/.helm/repository/repositories.yaml` にエントリが追加されています。

```
- caFile: ""
  cache: /Users/ushio/.helm/repository/cache/svc-cat-index.yaml
  certFile: ""
  keyFile: ""
  name: svc-cat
  url: https://svc-catalog-charts.storage.googleapis.com
```

ちゃんとリポジトリが参照されている様子。

```
$ helm search service-catalog
NAME           	VERSION	DESCRIPTION                                       
svc-cat/catalog	0.1.3  	service-catalog API server and controller-manag...
```

# RBAC

Tillter が、`cluster-admin` のアクセス権を持つように設定します。

```
kubectl create clusterrolebinding tiller-cluster-admin \
    --clusterrole=cluster-admin \
    --serviceaccount=kube-system:default
```
上記の設定は、クラスターワイドで、tiller-culster-admin という名前のロールバインディングを、cluster-admin(管理者)の権限を`kube-system:default` のネームスペースに与えている。

* [Using RBAC Authorization](https://kubernetes.io/docs/admin/authorization/rbac/)

```
$ kubectl create clusterrolebinding tiller-cluster-admin \
>     --clusterrole=cluster-admin \
>     --serviceaccount=kube-system:default
clusterrolebinding "tiller-cluster-admin" created
```
# kubectl

`1.7` 以上必要らしいが問題なし。

```
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.2", GitCommit:"bdaeafa71f6c7c04636251031f93464384d54963", GitTreeState:"clean", BuildDate:"2017-10-24T19:48:57Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.9", GitCommit:"19fe91923d584c30bd6db5c5a21e9f0d5f742de8", GitTreeState:"clean", BuildDate:"2017-10-19T16:55:06Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}
```

＃ Step2 - Install Service Catalog

インストラクションにこのリポジトリのトップでと書いてあったが、そのまま実行

```
$ helm install svc-cat/catalog \
>     --name catalog --namespace catalog
NAME:   catalog
LAST DEPLOYED: Sun Nov 19 01:07:02 2017
NAMESPACE: catalog
STATUS: DEPLOYED

RESOURCES:
==> v1/Pod(related)
NAME                                                 READY  STATUS             RESTARTS  AGE
catalog-catalog-apiserver-133269258-68wfp            0/2    ContainerCreating  0         8s
catalog-catalog-controller-manager-3024858573-xfvl7  0/1    ContainerCreating  0         8s

==> v1beta1/Deployment
NAME                                DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
catalog-catalog-apiserver           1        1        1           0          10s
catalog-catalog-controller-manager  1        1        1           0          10s

==> v1beta1/APIService
NAME                           AGE
v1beta1.servicecatalog.k8s.io  10s

==> v1beta1/ClusterRoleBinding
NAME                                            AGE
servicecatalog.k8s.io:apiserver                 10s
servicecatalog.k8s.io:apiserver-auth-delegator  10s
servicecatalog.k8s.io:controller-manager        9s

==> v1beta1/RoleBinding
NAME                                                   AGE
servicecatalog.k8s.io:apiserver-authentication-reader  10s
service-catalog-controller-manager                     9s

==> v1/ServiceAccount
NAME                                SECRETS  AGE
service-catalog-apiserver           1        9s
service-catalog-controller-manager  1        9s

==> v1/Secret
NAME                            TYPE    DATA  AGE
catalog-catalog-apiserver-cert  Opaque  2     10s

==> v1/Service
NAME                       TYPE      CLUSTER-IP    EXTERNAL-IP  PORT(S)        AGE
catalog-catalog-apiserver  NodePort  10.0.123.144  <none>       443:30443/TCP  10s

==> v1beta1/ClusterRole
NAME                                      AGE
servicecatalog.k8s.io:apiserver           10s
servicecatalog.k8s.io:controller-manager  9s

==> v1beta1/Role
servicecatalog.k8s.io:leader-locking-controller-manager  9s


```

# Azure Service Broker のインストール

[Azure Service Broker](https://github.com/Azure/helm-charts/blob/master/azure-service-broker/README.md) にしたがってインストールしてみる。



下記のコマンドで、環境変数に、`SUBSCTIPTION_ID` をセットする。`az account show --query id` で現在使用されているSubscriptionID が取得できる。 `sed s/\"//g` は、文字列置換でダブルクオートを空文字に変換。マッチするものを全て置換の意味。　[【 sed 】コマンド（基礎編その4）――文字列を置き換える／置換した行を出力する](http://www.atmarkit.co.jp/ait/articles/1610/17/news015.html)

正規表現系は、やんわりと避けてきたけど、便利そうなのでどこかでがっつりやったほうがいいかも。

```
export AZURE_SUBSCRIPTION_ID=$(az account show --query id | sed s/\"//g)
```

Azure Service Broker 用のサービスプリンシパルを作成しておく。

```
$ az ad sp create-for-rbac -n "ARB-ushio"
```

手順通り、Service Principal を環境変数に入れておく。

```
$ export AZURE_TENANT_ID=<tenant>
$ export AZURE_CLIENT_ID=<appId>
$ export AZURE_CLIENT_SECRET=<password>
```

次に、Helm の Azure のリポジトリが追加されているか？を確認。

```
$ helm search wordpress
NAME            	VERSION	DESCRIPTION                                       
stable/wordpress	0.7.1  	Web publishing platform for building blogs and ...
```

なさげ。インストールする。

手順はこちら。[Installing Charts](https://github.com/Azure/helm-charts/blob/master/README.md#installing-charts)

```
$ helm repo add azure https://kubernetescharts.blob.core.windows.net/azure
"azure" has been added to your repositories
invincible:ACSResource ushio$ helm search wordpress
NAME            	VERSION	DESCRIPTION                                       
azure/wordpress 	0.6.12 	Web publishing platform for building blogs and ...
stable/wordpress	0.7.1  	Web publishing platform for building blogs and ...
```

helm チャートで、インストールを実施する。

実行前にデフォルト値の値と設定可能なパラメータを見てみる。

```
helm inspect values azure/azure-service-broker 
```

ドキュメントはこちら。

[Configuration](https://github.com/Azure/helm-charts/blob/master/azure-service-broker/README.md#configuration)

そのままで実行。

```
helm install azure/azure-service-broker --name asb --namespace asb \
  --set azure.subscriptionId=$AZURE_SUBSCRIPTION_ID \
  --set azure.tenantId=$AZURE_TENANT_ID \
  --set azure.clientId=$AZURE_CLIENT_ID \
  --set azure.clientSecret=$AZURE_CLIENT_SECRET
```

最初は、redis が　`PersistentVolumeClaim is not bound: "asb-redis"` が出て何回かやり直してるみたいで焦ったけど、待っていると無事終了。多分コンテナへのマウントの部分で、時間がかかって何回かやり直している雰囲気。

動作確認。
カタログからデータが取れている様子。

```
$  kubectl get clusterservicebroker -o yaml

apiVersion: v1
items:
- apiVersion: servicecatalog.k8s.io/v1beta1
  kind: ClusterServiceBroker
  metadata:
    creationTimestamp: 2017-11-19T01:55:21Z
    finalizers:
    - kubernetes-incubator/service-catalog
    generation: 1
    name: asb
    namespace: ""
    resourceVersion: "172"
    selfLink: /apis/servicecatalog.k8s.io/v1beta1/clusterservicebrokers/asb
    uid: b3c67b65-cccc-11e7-a0dd-0a580af40104
  spec:
    authInfo:
      basic:
        secretRef:
          name: asb-azure-service-broker-auth
          namespace: asb
    relistBehavior: Duration
    relistDuration: 15m0s
    relistRequests: 0
    url: http://asb-azure-service-broker.asb.svc.cluster.local
  status:
    conditions:
    - lastTransitionTime: 2017-11-19T01:57:31Z
      message: Successfully fetched catalog entries from broker.
      reason: FetchedCatalog
      status: "True"
      type: Ready
    lastCatalogRetrievalTime: 2017-11-19T01:57:31Z
    reconciledGeneration: 1
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""
```

登録されているサービスのクラス。え、こんな使えるの？

```
$ kubectl get clusterserviceclasses -o=custom-columns=NAME:.metadata.name,EXTERNAL\ NAME:.spec.externalName
NAME                                   EXTERNAL NAME
0346088a-d4b2-4478-aa32-f18e295ec1d9   azure-rediscache
2e2fc314-37b6-4587-8127-8f9ee8b33fea   azure-storage
451d5d19-4575-4d4a-9474-116f705ecc95   azure-aci
6330de6f-a561-43ea-a15e-b99f44d183e6   azure-cosmos-document-db
6dc44338-2f13-4bc5-9247-5b1b3c5462d3   azure-servicebus
7bade660-32f1-4fd7-b9e6-d416d975170b   azure-eventhub
8797a079-5346-4e84-8018-b7d5ea5c0e3a   azure-cosmos-mongo-db
997b8372-8dac-40ac-ae65-758b4a5075a5   azure-mysqldb
b43b4bba-5741-4d98-a10b-17dc5cee0175   azure-postgresqldb
c54902aa-3027-4c5c-8e96-5b3d3b452f7f   azuresearch
d90c881e-c9bb-4e07-a87b-fcfe87e03276   azure-keyvault
fb9bc99e-0aa9-11e6-8a8a-000d3a002ed5   azure-sqldb
```

使えるプランはこれで確認

```
$ kubectl get clusterserviceplans -o=custom-columns=NAME:.metadata.name,EXTERNAL\ NAME:.spec.externalName,SERVICE\ CLASS:.spec.clusterServiceClassRef.name --sort-by=.spec.clusterServiceClassRef.name
NAME                                   EXTERNAL NAME                     SERVICE CLASS
800a17e1-f20a-463d-a290-20516052f647   blob-storage-account              2e2fc314-37b6-4587-8127-8f9ee8b33fea
189d3b8f-8307-4b3f-8c74-03d069237f70   blob-container                    2e2fc314-37b6-4587-8127-8f9ee8b33fea
6ddf6b41-fb60-4b70-af99-8ecc4896b3cf   general-purpose-storage-account   2e2fc314-37b6-4587-8127-8f9ee8b33fea
13c6da8f-128c-48c0-a3a9-659d1b6d3920   basic                             6dc44338-2f13-4bc5-9247-5b1b3c5462d3
6be0d8b5-381f-4d68-bdfd-a131425d3835   standard                          6dc44338-2f13-4bc5-9247-5b1b3c5462d3
e359cbbe-d52b-47cc-8243-5bb9651c86c7   premium                           6dc44338-2f13-4bc5-9247-5b1b3c5462d3
264ab981-9e37-44ba-b6bb-2d0fe3e80565   standard                          7bade660-32f1-4fd7-b9e6-d416d975170b
80756db5-a20c-495d-ae70-62cf7d196a3c   basic                             7bade660-32f1-4fd7-b9e6-d416d975170b
d48798e2-21db-405b-abc7-aa6f0ff08f6c   aci                               451d5d19-4575-4d4a-9474-116f705ecc95
08e4b43a-36bc-447e-a81f-8202b13e339c   standard800                       997b8372-8dac-40ac-ae65-758b4a5075a5
427559f1-bf2a-45d3-8844-32374a3e58aa   basic50                           997b8372-8dac-40ac-ae65-758b4a5075a5
1a538e06-9bcc-4077-8480-966cbf85bf36   basic100                          997b8372-8dac-40ac-ae65-758b4a5075a5
edc2badc-d93b-4d9c-9d8e-da2f1c8c3e1c   standard100                       997b8372-8dac-40ac-ae65-758b4a5075a5
ae3cd3dd-9818-48c0-9cd0-62c3b130944e   standard400                       997b8372-8dac-40ac-ae65-758b4a5075a5
9995c891-48ba-46cc-8dae-83595c1f443f   standard200                       997b8372-8dac-40ac-ae65-758b4a5075a5
71168d1a-c704-49ff-8c79-214dd3d6f8eb   document-db                       6330de6f-a561-43ea-a15e-b99f44d183e6
86fdda05-78d7-4026-a443-1325928e7b02   mongo-db                          8797a079-5346-4e84-8018-b7d5ea5c0e3a
4af8bbd1-962d-4e26-84f1-f72d1d959d87   standard                          0346088a-d4b2-4478-aa32-f18e295ec1d9
b1057a8f-9a01-423a-bc35-e168d5c04cf0   premium                           0346088a-d4b2-4478-aa32-f18e295ec1d9
362b3d1b-5b57-4289-80ad-4a15a760c29c   basic                             0346088a-d4b2-4478-aa32-f18e295ec1d9
b2ed210f-6a10-4593-a6c4-964e6b6fad62   basic50                           b43b4bba-5741-4d98-a10b-17dc5cee0175
843d7d03-9306-447e-8c19-25ccc4ac30d7   basic100                          b43b4bba-5741-4d98-a10b-17dc5cee0175
35bd6e80-5ff5-487e-be0e-338aee9321e4   free                              c54902aa-3027-4c5c-8e96-5b3d3b452f7f
65e89af2-8da2-4559-b103-8dd2dd8fdd40   standard-s1                       c54902aa-3027-4c5c-8e96-5b3d3b452f7f
4a50e008-5513-42d3-8b2f-d8b3ad43f7eb   basic                             c54902aa-3027-4c5c-8e96-5b3d3b452f7f
3577ee4a-75fc-44b3-b354-9d33d52ef486   standard                          d90c881e-c9bb-4e07-a87b-fcfe87e03276
6893b1de-0a7b-42bb-b28d-1636c4b81f75   premium                           d90c881e-c9bb-4e07-a87b-fcfe87e03276
85d54d69-55ee-4fe8-a207-66bc96ecf9e7   premium-p4                        fb9bc99e-0aa9-11e6-8a8a-000d3a002ed5
470a869b-1b02-474b-b5e5-10ca0ea488df   data-warehouse-1200               fb9bc99e-0aa9-11e6-8a8a-000d3a002ed5
a5537f8e-d816-4b0e-9546-a13811944bdd   standard-s2                       fb9bc99e-0aa9-11e6-8a8a-000d3a002ed5
408f5f35-5f5e-48f3-98cf-9e10c1abc4e5   premium-p11                       fb9bc99e-0aa9-11e6-8a8a-000d3a002ed5
af3dc76f-5b31-4cad-8adc-a9e756640a57   premium-p6                        fb9bc99e-0aa9-11e6-8a8a-000d3a002ed5
3819fdfa-0aaa-11e6-86f4-000d3a002ed5   basic                             fb9bc99e-0aa9-11e6-8a8a-000d3a002ed5
2bbbcc59-a0e0-4153-841b-2833cb417d43   premium-p2                        fb9bc99e-0aa9-11e6-8a8a-000d3a002ed5
b69af389-7af5-47bd-9ccf-c1ffdc2620d9   data-warehouse-100                fb9bc99e-0aa9-11e6-8a8a-000d3a002ed5
26cf84bf-f700-4e65-8048-cbfa9c319d5f   standard-s3                       fb9bc99e-0aa9-11e6-8a8a-000d3a002ed5
2497b7f3-341b-4ac6-82fb-d4a48c005e19   standard-s0                       fb9bc99e-0aa9-11e6-8a8a-000d3a002ed5
17725188-76a2-4d6c-8e86-49f146766eeb   standard-s1                       fb9bc99e-0aa9-11e6-8a8a-000d3a002ed5
f9a3cc8e-a6e2-474d-b032-9837ea3dfcaa   premium-p1                        fb9bc99e-0aa9-11e6-8a8a-000d3a002ed5
```

おー、これは面白い。k8s の上で動くhelm から、これらのサービスをプロビジョンできるわけね！

次回は使ってなんかやってみる。