Azure 服务经纪人的使用方式(3)

Azure服务经纪人的使用方法(3)

这次开始探索 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:,可以知道当前的状态。稍等片刻,将变成成功。

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

执行绑定

当创建实例后,执行绑定操作。

$ 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 的含义是 PostgreSQL 绑定文件。

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秘密物件介绍 – 如何储存数据库密码和其他机密信息?

试着创建以下这样的YAML文件来验证一下。

nginx-secret.yaml 的翻译选项:
– Nginx秘密配置文件
– Nginx的密钥文件
– Nginx保密文件
– Nginx私密配置
– Nginx隐秘配置文件

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# 

解绑

删除绑定将导致秘钥也被删除。

$ 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

撤销许可

删除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 上试试吧。

bannerAds