PaaS平台的服务目录(二): Service Catalog

作者: 小白_18M | 来源:发表于2018-01-05 17:28 被阅读980次

    Service Catalog(服务目录)是Kubernetes社区的孵化项目Kubernetes Service Catalog Project,旨在接入和管理第三方提供的Service Broker,使kubernetes上托管的应用可以使用service broker所代理的外部服务。

    本文将介绍Service Catalog的架构以及如何在OpenShift Origin环境中部署和使用Service Catalog。


    Service Catalog技术原理

    Service Catalog项目是基于k8s的OSB API实现,为k8s提供了如下功能:

    - 注册第三方提供的Service Broker到k8s

    - 将Service Broker所代理的服务(或者服务的变体),提供给k8s的用户

    - k8s用户可以发现可用的服务

    - k8s用户可以请求创建新的服务实例

    - k8s用户可以将服务实例绑定到一组pod上面

    Service Catalog的架构如下所示:

    图1

    Service Catalog由API Server和Controller这两个基本的组件构成,设计上与K8S的其它组件是类似的:

    - API Server,API Server是用于存储组件的HTTP RESTFul前端,用户与Controller通过与API Server交互来完成对Service Catalog资源的GRUD操作;例如,用户在命令行执行kubectl get clusterservicebroker时,就是通过Service Catalog API server来获取ClusterServiceBroker资源的列表;API Server后端的存储目前只支持etcd,但是在设计上是完全解耦的,API Server的rest.storage接口抽象未来会添加对第三方资源(TPRs)的支持(Github Issues);

    - Controller,Controller实现了Service Catalog的行为,它监控API资源的变化(通过不断watch来自API server的事件流),并采取相应的动作使API资源的当前状态与用户期望的最终状态相一致;例如,当用户创建一个ClusterServiceBroker资源时,API Server将在Etcd里存入一个资源并产生一个事件,然后Controller将接受这个事件并从该资源所指向的Service Broker中请求Catalog信息;

    Service Catalog为k8s增加了如下的API Resources:

    - ClusterServiceBroker, 代表Service Broker,封装了broker的连接信息

    - ClusterServiceClass, 代表特定Service Broker所提供的服务;当增加一个新的ClusterServiceBroker资源到集群时,service catalog的controller会连接Service Broker并获取可用服务的列表

    - ClusterServicePlan,代表服务的套餐,其定义了服务的SLA,一个服务可以有多个套餐;当增加一个ClusterServiceBroker资源到集群时,service catalog会创建一个ClusterServicePlan资源来适配对应的每一个服务的所有可用服务套餐(Service Plan)

    - ServiceInstance,代表一个服务实例;当一个ServiceInstance资源被创建时,Service Catalog Controller会连接对应的Service Broker并命令broker去创建一个新的服务实例

    - ServiceBinding,代表服务实例与应用(Application)的一次绑定;创建之后,Service Catalog Controller会创建一个包含服务实例的连接与认证信息的Kubernetes Secret,并挂载到应用的pod上

    Service Catalog的API Resources与Application及Service Broker的关系见下图:

    图2

    OpenShift Origin从3.6版本开始提供Service Catalog的Technical Preview版本(对应k8s 1.6.3上的alpha版本), 用户可以在自己的PaaS环境中试用Service Catalog特性。

    下面将以OpenShift Origin 3.6为基础,讨论如何使用Service Catalog。


    在OpenShift Origin环境启用Service Catalog

    OpenShift Origin3.6的默认部署不会启用Service Catalog,需要用户在部署集群时在OpenShift Origin的Ansible hosts文件里进行显式指定,具体配置(写在在[OSEv3:vars]下面)如下:

    openshift_enable_service_catalog=true openshift_service_catalog_image_prefix=openshift/origin- openshift_service_catalog_image_version=v3.6.0

    集群部署完成之后,可以在OpenShift Origin Console上看到Service Catalog页面,里面列出了即集群中所有Service Broker所提供的所有服务的图标(启用Service Catalog之后,OpenShift Origin会默认启动由OpenShift官方提供Template Service Broker,它提供了一些诸如.NET/Ruby/Python运行时环境,Redis, MongoDB之类的通用服务):

    图3(可以看到OC的页面提示Technical Preview Enable)

    对于已经部署好的OpenShift集群,可以修改hosts文件之后重新执行ansible-playbook命令开启Service Catalog。


    通过Service Catalog管理外部服务

    在OpenShift 3.6中,可以通过oc create命令创建Service Catalog相关的资源:

    - 创建service broker

    oc create -f ./broker.yml

    Service Broker的资源定义模版如下:

    apiVersion: servicecatalog.k8s.io/v1alpha1

    kind: Broker

    metadata:

      name: <broker name> //Service Broker的名字

    spec:

      url: <broker URL> //Service Broker的endpoint, catalog通过它来连接Service Broker

      authInfo:

        basicAuthSecret:

          kind: Secret

          namespace: <namespace name> //添加Service Broker的namespace

          name: <secret name> //存储Service Broker认证信息的k8s secret name

    - 查看已经注册的service broker

    图4

    添加Service Broker之后就可以在OpenShift Origin Console的Service Catalog页面(参见图3)看到新注册的Service Broker所提供的服务的图标;也可以在后台用oc命令(oc get serviceclass)查看新注册的Service Broker所提供的服务的列表。

    - 创建服务实例

    oc create -f ./instance.yml

    Service Instance的资源定义模版如下:

    apiVersion: servicecatalog.k8s.io/v1alpha1

    kind: Instance

    metadata:

      name: <service instance name> //创建的Service Instance名称

      namespace: <namespace name> //创建Service Instance的namespace

    spec:

      serviceClassName: <service class name> //Service Instance的服务名,即创建的是何种服务的实例

      planName: <service plan name> //服务的套餐名,规定了服务实例的SLA

      parameters:

        xxx: xxx  //传给Service Broker的provision参数列表

    - 查看服务实例

    图5

    - 绑定服务实例

    oc create -f ./binding.yml

    Service binding的资源定义模版如下:

    apiVersion: servicecatalog.k8s.io/v1alpha1

    kind: Binding

    metadata:

        name: <binding name> //绑定名

    spec:

        instanceRef:

            name: <service instance name> //服务实例名

        secretName: <secret name> //存储服务实例连接和认证信息的k8s secret名

        labels:

            app: <application name> //需要绑定服务实例的应用名

        parameters:

            user_name: baikai //传给Service Broker的binding参数列表

    - 删除绑定

    oc delete -f ./instance.yml

    - 删除服务实例

    oc delete -f ./binding.yml

    上述服务实例的创建,绑定,解绑定和删除,也可以通过OpenShift Origin Console进行操作,例如服务实例的绑定:

    图6

    值得注意的是,Service Catalog社区在2017年10月才支持service instance update(即OSB API的Patch接口), 并在Service Catalog临时版本v.0.0.24中合入(请参见github issue: Support updates to Instances)。目前OpenShift Origin 3.6 底层k8s采用1.6.3版本,尚未合入该patch,所以OpenShift Origin 3.6的Service Catalog所创建的服务实例不能进行扩容等更新操作。


    Service Catalog REST API

    在k8s的1.6.x版本中,Service Catalog的REST API如下:

    (目前在1.6.x/1.7上的Service Catalog尚为alpha版本,与k8s 1.8上的beta版本的API以及部分Resource的命名方式略有区别)

    - 创建服务实例

    Route:

    POST /apis/servicecatalog.k8s.io/v1alpha1/namespaces/<namespace name>/instances

    Request header:

    "Authorization: Bearer <user token>"

    (在OpenShift Origin环境中,可以用过oc whoami -t命令获取当前用户的token)

    Request Body:

    {

        "apiVersion": "servicecatalog.k8s.io/v1alpha1",

        "kind": "Instance",

        "metadata": {

            "generateName": <service instance name>,

            "namespace": <namespace name>

        },

        "spec": {

            "parameters": {

                // service instance parameters list

            },

            "planName": <plan name>,

            "serviceClassName": <service class name>

        }

    }

    (Service Catalog各API的request body与命令行创建Service Instance时用户提供的描述资源的yaml文件中字段一致,只是形式从ymal变成json罢了 :-) )

    调用示例:

    图7

    - 获取服务实例列表

    Route:

    GET /apis/servicecatalog.k8s.io/v1alpha1/namespaces//instances

    Request header:

    "Authorization: Bearer <user token>"

    (在OpenShift Origin环境中,可以用过oc whoami -t命令获取当前用户的token)

    调用示例:

    图8(items里就是当前namespace里所有service instance的列表)

    - 绑定服务实例

    Route:

    POST /apis/servicecatalog.k8s.io/v1alpha1/namespaces/<namespace>/bindings

    Request header:

    "Authorization: Bearer <user token>"

    (在OpenShift Origin环境中,可以用过oc whoami -t命令获取当前用户的token)

    Request body:

    {

        "apiVersion": "servicecatalog.k8s.io/v1alpha1",

        "kind": "Binding",

        "metadata": {

                "generateName": <binding name>

        },

        "spec": {

            "instanceRef": {

                "name": <service instance name to binding>

            },

            "parameters": {

               //binding parameters list

            },

            "secretName": <secret to store service instance credentials>,

            "labels": {

                //label selector to get pod

            }

        }

    }

    调用示例:

    图9

    - 获取服务实例绑定列表

    Route:

    GET /apis/servicecatalog.k8s.io/v1alpha1/namespaces/<namespace name>/binding 

    Request header:

    "Authorization: Bearer <user token>"

    (在OpenShift Origin环境中,可以用过oc whoami -t命令获取当前用户的token)

    调用示例:

    图10(items里就是当前namespace里所有binding的列表)

    - 删除绑定

    Route:

    DELETE /apis/servicecatalog.k8s.io/v1alpha1/namespaces/<namespace name>/bindings/<binding name>

    Request header:

    "Authorization: Bearer <user token>"

    (在OpenShift Origin环境中,可以用过oc whoami -t命令获取当前用户的token)

    调用示例:

    图11

    - 删除服务实例

    Route:

    DELETE /apis/servicecatalog.k8s.io/v1alpha1/namespaces/<namespace name>/instances/<service instance name>

    Request header:

    "Authorization: Bearer <user token>"

    (在OpenShift Origin环境中,可以用过oc whoami -t命令获取当前用户的token)

    调用示例:

    图12

    结论

    目前Service Catalog项目尚处于k8s社区的孵化阶段,特性在不断的迭代和完善,API以及Resource的名称也在演化中,距离稳定和生产可用还有一段距离。在版本发布方面,k8s社区的1.6/1.7 release对应的service catalog的alpha版本,1.8 release对应service catalog的beta版本。

    推荐大家去试用k8s的Service Catalog特性,通过Service Catalog把自己项目所需要依赖的服务集成到k8s环境中,这也是未来k8s社区主推的第三方服务管理方式。


    参考

    Service Catalog发布计划:kubernetes Service Catalog Project Roadmap

    Service Catalog官方文档:Service Catalog docs

    OpenShift官方文档:OpenShift Service Catalog

    相关文章

      网友评论

        本文标题:PaaS平台的服务目录(二): Service Catalog

        本文链接:https://www.haomeiwen.com/subject/zvakextx.html