一、服务目录介绍
服务目录就是列出所有的服务的目录。用户可以浏览目录并自行设置目录中列出的服务实例,无须处理服务运行所需的pod、service、configmap和其他资源。这听起来和自定义网站资源很类似。
服务目录并不会为每种服务类型的api服务器添加自定义资源,而是讲一下四种通用API资源引入其中:
- 一个ClusterServiceBroker,描述一个可以提供服务的(外部)系统
- 一个ClusterServiceClass,描述一个可供应的服务类型
- 一个ServiceInstance,已配置服务的一个实例
- 一个ServiceBinding,表示一组客户端(pod)和ServiceInstance之间的绑定
集群管理员会为每个服务代理创建一个ClusterServiceBroker资源,而这些服务代理需要在集群中提供他们的服务。接着,kubernetes从服务代理获取他们可以提供的服务列表,并为他们中的每个服务创建一个ClusterServiceClass资源。当用户调配服务时,首先需要创建一个ServiceInstance资源,然后创建一个ServiceBinding以将该ServiceInstance绑定到他们的pod。下一步,泽泻pod会被注入一个Secret,该Secret包含连接到配置的ServiceInstance所需的凭证和其他数据。
二、服务目录API服务器与控制器管理器介绍
与核心kubernetes类似,服务目录也是有三个组件组成的分布式系统:
- 服务目录API服务器
- 作为存储的etcd
- 运行所有控制器的控制器管理器
之前所介绍的四个服务目录相关的资源数通过YAML/JSON清单发布到API服务器来创建的。随后,API服务器会将他们存储到自己的etcd实例中,或者使用主API服务器中的CRD作为替代存储机制(这种情况下不需要额外的etcd实例)
控制器本身不提供所请求的服务,而是将其留给外部服务代理,再由代理通过在服务目录API中创建ServiceBroker资源进行注册。
三、Service代理和OpenServiceBroker API
集群管理员可以在服务目录中注册一个或多个外部ServiceBroker。同时,每个代理都必须实施OpenServiceBroker API。
OpenServiceBroker API介绍
通过OpenServiceBroker API,服务目录可以通过API与broker进行通信,这个简单的REST API,能够提供以下功能:
使用GET/v2/catalog检索服务列表
配置服务实例(PUT/v2/service_instances/:id)
更新服务实例(PATH/v2/service_instaces/:id)
绑定服务实例(PUT/v2/service_instances/:id/service_bindings/:binding_id)
解除绑定实例(DELETE/v2/service_instances/:id/service_bindings/:binding_id)
取消服务实例配置(DELETE/v2/service_instances/:id)
在服务目录中注册代理
集群管理员可通过向服务目录API发布ServiceBroker资源清单来注册代理
一个ClusterServiceBroker清单:database-broker.yaml
apiVersion:servicecatalog.k8s.io/v1alpha1
metadata:
name:database-broker
spec:
url:http://database-osbapi.myorganizations.org
如上代码清单,描述了一个可以提供不同类型数据库的虚拟代理。在管理员创建ClusterServiceBroker资源后,Service Catalog Controller Manager中的控制器就会连接到资源中指定的URL,并且检索此代理可以提供的服务列表。
在检索服务列表后,就会为每个服务创建一个ClusterServiceClass资源。每个ClusterServiceClass资源都描述一个可供应的服务。每个ClusterServiceClass都有一个或多个与之关联的服务方案。用户可以根据他们需要的服务级别选择不同的方案。
罗列集群中的可用服务
$kubectl get serviceclasses
四、提供服务与使用服务
提供服务
想预分配数据库,需要做的是创建一个ServiceInstance资源
ServiceInstance列表:database-instance.yaml
apiVersion:servicecatalog.k8s.io/v1alpha1
kind:ServiceInstance
metadata:
name:my-postgres-db
spec:
clusterServiceClassName:postgres-database
clusterServicePlanName:free
parameters:
init-db-args:--data-checksums
如上创建一个名为my-postgres-db的ServiceInstance,并且指定ClusterServiceClass、选定方案。还需要指定一个明确的broker和ClusterServiceClass需要的参数。
一旦创建了这个资源,服务目录就要求ClusterServiceClass所属的代理来调配服务,它将传递你选择的ClusterServiceClass、计划名称以及指定的所有参数。
接下来,采取何种方法处理这些信息完全由代理决定。
检查创建的my-postgres-db ServiceInstance的status来检查是否已经成功提供服务。
$kubectl get instance my-postgres-db -o yaml
绑定服务实例
想要在pod中使用配制的ServiceInstance,可以创建绑定资源,如下为代码清单
ServiceBinding:my-postgres-db-binding.yaml
apiVersion:servicecatalog.k8s.io/v1alpha1
kind:ServiceBinding
metadata:
name:my-postgres-db-binding
spec:
instanceRef:
name:my-postgres-db
secretName:postgres-secret
如上代码,定义一个名为my-postgres-db-binding的ServiceBinding资源,其中引用了之前创建的my-postgres-db服务实例,挺尸也命名了一个secret。
在将ServiceBinding资源从先前的列表提交到服务目录API服务器时,控制器会再次联系数据库代理,并为之前配置的ServiceInstance创建一个绑定。作为响应,这时候代理会返回以链接到数据库中所需的凭证和其他数据。随后,服务目录会使用ServiceBinding资源中指定的名称创建一个新的Secret,并将所有数据存储在Secret中。
在客户端pod中使用新创建的Secret
服务目录系统创建的Secret可以装载到pod中,这样Secret就可以读取其中的内容并使用他们连接到配置好的服务实例。
一个持有连接到服务实例的凭证的Secret
$kubectl get secret postgres-secret -o yaml
apiVersion:v1
data:
host:<base64-encoded hostname of the database>
username:<base64-encoded username>
password:<base64-encoded password>
kind:Secret
metadata:
name:postgres-secret
namespace:default
...
type:Opaque
五、解除绑定与取消配置
不再需要服务绑定,可以按照删除其他资源的方式将其删除
$kubectl delete servicebinding my-postgres-db-binding
这时候,服务目录控制器将删除秘钥并通知代理解除绑定,而服务实例仍会运行。因此,你可以创建一个新的服务绑定。
如果不再需要数据库实例,就可以一并删除服务实例资源
$kubectl delete serviceinstance my-postgres-db
删除ServiceInstance资源后,服务目录就会在服务代理上执行取消配置的操作。同样,尽管取消配置带来的后果由代理决定,但你应该让代理关闭调配服务实例时创建的postgresSQL数据库实例
六、服务目录给我们带来了什么
服务提供者可以通过在任何kubernetes集群中注册代理,在该集群中暴露服务。