PaaS平台的服务目录(二): Service Catalog in K8S/OpenShift Origin

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容