Azure Service Broker の使い方　（３）

# Azure Service Broker の使い方　（３）

今回から [Azure Service Broker](https://github.com/Azure/azure-service-broker) の使い方を探っていこう。
サンプルが入っているので最初にクローンしておこう。

# Instance のインストール

試しにサンプルの、postgres をインストールしてみる。

```
$ kubectl create -f contrib/k8s/examples/postgresql-instance.yaml 
serviceinstance "my-postgresql-instance" created
invincible:azure-service-broker ushio$ kubectl get serviceinstances
NAME                     AGE
my-postgresql-instance   2m
```
これでしばらく待つと、`demo` というリソースグループの中に、マネージドの PostgreSQL のリソースが作成される。

ここにスクリーンショット


```
$ kubectl get serviceinstance my-postgresql-instance -o yaml
```

このコマンドを叩くと、状態が出てくる。`status:conditions:` をみると、現在の状態がわかる。しばらく待つと、Success になった。

```
apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceInstance
metadata:
  creationTimestamp: 2017-11-19T12:07:54Z
  finalizers:
  - kubernetes-incubator/service-catalog
  generation: 1
  name: my-postgresql-instance
  namespace: default
  resourceVersion: "336"
  selfLink: /apis/servicecatalog.k8s.io/v1beta1/namespaces/default/serviceinstances/my-postgresql-instance
  uid: 4614210e-cd22-11e7-a0dd-0a580af40104
spec:
  clusterServiceClassExternalName: azure-postgresqldb
  clusterServiceClassRef:
    name: b43b4bba-5741-4d98-a10b-17dc5cee0175
  clusterServicePlanExternalName: basic50
  clusterServicePlanRef:
    name: b2ed210f-6a10-4593-a6c4-964e6b6fad62
  externalID: a2972880-181e-4bbf-8a2e-a92d0d165d58
  parameters:
    extensions:
    - uuid-ossp
    - postgis
    location: eastus
    resourceGroup: demo
  updateRequests: 0
status:
  asyncOpInProgress: false
  conditions:
  - lastTransitionTime: 2017-11-19T12:16:25Z
    message: The instance was provisioned successfully
    reason: ProvisionedSuccessfully
    status: "True"
    type: Ready
  deprovisionStatus: Required
  externalProperties:
    clusterServicePlanExternalID: b2ed210f-6a10-4593-a6c4-964e6b6fad62
    clusterServicePlanExternalName: basic50
    parameterChecksum: 99ba190fa88b80d79fc9d601c0fcb13e84bc2e72c38c1230e232a5eab95165a4
    parameters:
      extensions:
      - uuid-ossp
      - postgis
      location: eastus
      resourceGroup: demo
  orphanMitigationInProgress: false
  reconciledGeneration: 1

```

ちなみに、適用した yaml の中身はこんな感じ。Kubernetes の標準ではない`Serviceinstance` という種別でデプロイされている。


_postgresql-instance.yaml_

```
apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceInstance
metadata:
  name: my-postgresql-instance
  namespace: default
spec:
  clusterServiceClassExternalName: azure-postgresqldb
  clusterServicePlanExternalName: basic50
  parameters:
    location: eastus
    resourceGroup: demo
    extensions:
    - uuid-ossp
    - postgis

```

# Binding の実施

インスタンスができたら、Binding を実施しよう。


```
$ kubectl create -f contrib/k8s/examples/postgresql-binding.yaml
servicebinding "my-postgresql-binding" created
```

すぐ終わるとは限らないので確認。 動いているっぽい。

```
$ kubectl get servicebinding my-postgresql-binding -o yaml
apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceBinding
metadata:
  creationTimestamp: 2017-11-19T12:20:44Z
  finalizers:
  - kubernetes-incubator/service-catalog
  generation: 1
  name: my-postgresql-binding
  namespace: default
  resourceVersion: "340"
  selfLink: /apis/servicecatalog.k8s.io/v1beta1/namespaces/default/servicebindings/my-postgresql-binding
  uid: 10ee3219-cd24-11e7-a0dd-0a580af40104
spec:
  externalID: 7386578e-1b93-4d1d-8fc6-85e1cef77cdb
  instanceRef:
    name: my-postgresql-instance
  secretName: my-postgresql-secret
status:
  asyncOpInProgress: false
  conditions:
  - lastTransitionTime: 2017-11-19T12:20:48Z
    message: Injected bind result
    reason: InjectedBindResult
    status: "True"
    type: Ready
  externalProperties: {}
  orphanMitigationInProgress: false
  reconciledGeneration: 1
  unbindStatus: Required

```

バインディングのyaml をみると、ServicveBinding という種別のリソースを作っている。面白いのが、my-postgresql-secret というのができているところ。

_postgresql-binding.yaml_

```
apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceBinding
metadata:
  name: my-postgresql-binding
  namespace: default
spec:
  instanceRef:
    name: my-postgresql-instance
  secretName: my-postgresql-secret
```

Secret の中身はこのような感じ。

```
$ kubectl get servicebinding my-postgresql-binding -o yaml
apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceBinding
metadata:
  creationTimestamp: 2017-11-19T12:20:44Z
  finalizers:
  - kubernetes-incubator/service-catalog
  generation: 1
  name: my-postgresql-binding
  namespace: default
  resourceVersion: "340"
  selfLink: /apis/servicecatalog.k8s.io/v1beta1/namespaces/default/servicebindings/my-postgresql-binding
  uid: 10ee3219-cd24-11e7-a0dd-0a580af40104
spec:
  externalID: 7386578e-1b93-4d1d-8fc6-85e1cef77cdb
  instanceRef:
    name: my-postgresql-instance
  secretName: my-postgresql-secret
status:
  asyncOpInProgress: false
  conditions:
  - lastTransitionTime: 2017-11-19T12:20:48Z
    message: Injected bind result
    reason: InjectedBindResult
    status: "True"
    type: Ready
  externalProperties: {}
  orphanMitigationInProgress: false
  reconciledGeneration: 1
  unbindStatus: Required
invincible:azure-service-broker ushio$ kubectl get secret my-postgresql-secret -o yaml
apiVersion: v1
data:
  database: ZnI1ejlwNHMzNA==
  host: MWFlNzEzY2UtNDdhZC00N2YwLWEwZTctOWVmZWVhYzgwMWUyLnBvc3RncmVzLmRhdGFiYXNlLmF6dXJlLmNvbQ==
  password: SUtEd3dhbjZscVlDbzRSbQ==
  port: NTQzMg==
  username: YWJkMmNqNDVzMkAxYWU3MTNjZS00N2FkLTQ3ZjAtYTBlNy05ZWZlZWFjODAxZTI=
kind: Secret
metadata:
  creationTimestamp: 2017-11-19T12:20:47Z
  name: my-postgresql-secret
  namespace: default
  ownerReferences:
  - apiVersion: servicecatalog.k8s.io/v1beta1
    blockOwnerDeletion: true
    controller: true
    kind: ServiceBinding
    name: my-postgresql-binding
    uid: 10ee3219-cd24-11e7-a0dd-0a580af40104
  resourceVersion: "119949"
  selfLink: /api/v1/namespaces/default/secrets/my-postgresql-secret
  uid: 12fd2879-cd24-11e7-a22d-000d3a5183f5
type: Opaque

```

# Pod からサービスを利用する

さて、Pod からサービスが利用できるか調べてみる。
Secret があれば、環境変数、もしくは、ボリュームマウントでサービスへの情報が取れる。

[Kubernetes Secrets の紹介 – データベースのパスワードやその他秘密情報をどこに保存するか？](https://ubiteku.oinker.me/2017/03/01/kubernetes-secrets/)


例えばこんなyaml を作って試してみる。

_nginx-secret.yaml_

```
apiVersion: apps/v1beta1 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /tmp
          name : my-postgresql-secret
          readOnly: true
      volumes:
      - name: my-postgresql-secret
        secret:
          secretName: my-postgresql-secret
```

デプロイする。

```
$ kubectl create -f nginx-secret.yaml 
```

出来たPod に入って、値を調べる。うむ。ちゃんと出来ている。これでフロントのアプリを作れば完璧なはず。

```
$ kubectl exec nginx-deployment-2278088344-4f26h -it /bin/bash
root@nginx-deployment-2278088344-4f26h:/# cd /tmp                                                                                    
root@nginx-deployment-2278088344-4f26h:/tmp# ls
database  host	password  port	username
root@nginx-deployment-2278088344-4f26h:/tmp# cat database 
fr5z9p4s34
root@nginx-deployment-2278088344-4f26h:/tmp# cat host 
1ae713ce-47ad-47f0-a0e7-9efeeac801e2.postgres.database.azure.com
root@nginx-deployment-2278088344-4f26h:/tmp# 
```
# unbinding

Binding を削除すると、Secret も削除される。

```
$ kubectl delete servicebinding my-postgresql-binding
servicebinding "my-postgresql-binding" deleted
$ kubectl get secret my-postgresql-secret
Error from server (NotFound): secrets "my-postgresql-secret" not found

```

# Deprovisioning

ServiceInstance を削除すると Azure 側のリソースも削除される。

```
$ kubectl delete serviceinstance my-postgresql-instance
serviceinstance "my-postgresql-instance" deleted
$ kubectl get serviceinstance my-postgresql-instance -o yaml
Error from server (NotFound): serviceinstances.servicecatalog.k8s.io "my-postgresql-instance" not found
```

これは便利そうだわ。次はサンプルアプリを作ってみる。せっかくなので、Cosmos あたりでやってみよう。