【编者的话】OpenShift 3.6新版本包括新的服务目录和服务中介技术预演版。它们是基于Kubernetes的孵化项目Kubernetes Service Catalog project。服务目录通过Open Service Broker API集成服务中介,由服务中介管理服务的创建和管理;这篇文章将深入介绍服务目录的设计。

服务目录是基于Kubernetes的Open Service Broker API实现。 它包括如下功能:

  • 服务中介注册到Kubernetes上;
  • 服务中介指定一组服务(或这些服务的变体),提供给Kubernetes用户;
  • Kubernetes用户可以发现可用的服务;
  • Kubernetes用户可以请求新的服务实例;
  • Kubernetes用户可以链接服务实例到一组Pods上;

这种底层机制允许在Kubernetes中运行的应用程序与它们使用的服务之间松耦合。 服务中介是一个黑盒实体,可以运行在Kubernetes外。 服务中介允许应用专注于自己的业务逻辑,将服务的管理交给服务中介。

术语

  • 应用(Application):服务目录中的服务与Kubernetes中的“服务”是不同的。为避免混淆,我们使用“应用”表示Kubernetes的服务实例;
  • 绑定或服务绑定(Binding):服务实例和应用之间的链接。它表示应用引用和使用特定服务实例的意图;
  • 中介或服务中介(Broker):一个实体,用于管理一组或多个服务,可以通过网络端点访问服务中介;
  • 凭证(Credentials):应用与服务实例通信所需的信息;
  • 实例或服务实例(Instance):服务的实现称为服务实例;
  • 服务类或服务(Service Class):服务中介提供的一种服务类型;
  • 计划或服务计划(Plan):服务类型的变体。例如,服务可以暴露一组计划,它们提供不同程度的服务质量(QoS);

Open Service Broker API

服务目录是Open Service Broker API(OSB API)的兼容实现。 OSB API规范是Cloud Foundry Service Broker API的演进。

本文档不会详细介绍OSB API的工作原理,相关信息请参阅:Open Service Broker API。 本文的其余部分假设读者熟悉OSB API规范的基本概念。

服务目录设计

服务目录的设计如下图所示:

请注意,该项目的当前状态并不完全支持设计中所述的所有内容,但我们从目标开始,然后指出当前项目状态,通过[DIFF]标记不同。

作为服务目录的核心,与Kubernetes核心一样,它是一个API服务器和一个控制器。 API服务器是用于存储组件HTTP(REST)RESTful的前端。系统的用户及系统的其他组件与API服务器进行交互,以便在服务目录资源模型上执行CRUD类型的操作。与Kubernetes本身一样,kubectl命令行工具可用于与服务目录资源模型进行交互。

服务目录API服务器后面的存储组件可以是etcd第三方资源(TPRs)。 rest.storage接口抽象正在使用的特定持久存储设备。当使用etcd时,etcd的实例将与Kubernetes的etcd实例不同,这意味着,服务目录将具有与Kubernetes不同的持久存储。当使用TPRs时,这些资源将被存储在Kubernetes中,因此不需要单独的持久存储。

[DIFF]到目前为止,API服务器只能使用etcd作为其持久存储。在不久的将来,API服务器的rest.storage接口将添加对TPRs的支持。

服务目录资源模型在pkg/apis/servicecatalog/types.go的文件中定义,模型的初始(当前)版本在pkg/apis/servicecatalog/v1alpha1/中。到目前为止,只有一个版本的模型,但随着时间的推移,将会创建其他版本,每个版本都将有自己的pkg/apis/servicecatalog /的子目录中。

控制器是服务目录的大脑。它监视资源模型(通过API服务器上watches接口),并根据其检测到的更改采取适当的操作。

要了解服务目录资源模型,最好通过一个典型的工作流程:

服务中介注册

在应用使用服务之前,服务中介首先向Kubernetes平台注册。服务中介管理服务,我们首先通过创建Broker实例来注册服务中介:

kubectl create -f broker.yaml 

broker.yaml内容如下:

apiVersion: servicecatalog.k8s.io/v1alpha1 
kind: Broker 
metadata:   
name: BestDataBase 
spec:   
url: http://bestdatabase.com 

创建中介资源后,服务目录控制器将收到数据存储区添加资源的事件。然后,控制器将查询服务中介(指定的URL)以获取可用服务列表。然后,每个服务都将创建一个相应的服务资源:

apiVersion: servicecatalog.k8s.io/v1alpha1 
kind: ServiceClass 
metadata:   
name: smallDB   
brokerName: BestDataBase   
plans... 

请注意,每个服务可以有一个或多个与之相关联的计划。

用户可以查询可用服务列表:

kubectl get services 

创建服务实例

在使用服务之前,必须创建一个新的实例。创建一个新的Instance资源:

kubectl create -f instance.yaml

instance.yaml内容如下:

apiVersion: servicecatalog.k8s.io/v1alpha1 
kind: Instance 
metadata:   
name: johnsDB 
spec:   
serviceClassName: smallDB 

在实例资源内可以指定使用的计划。允许用户指定他们想使用的服务的变体 – 可能是基于QoS的服务类型变体。

一旦Instance资源被创建,控制器会与指定的服务中介协商来创建一个所需服务的新的实例。

有两种创建方式:同步和异步

对于同步操作,向服务中介发出请求,并且在成功完成请求(200 OK)后,服务实例可以被应用使用。

一些服务中介支持异步方式。当控制器向服务中介发出create/update/deprovision请求时,服务中介以202 ACCEPTED响应,并提供GET请求端点:GET /v2/service_instances/<service_instance_id>/last_operation,控制器可以轮询请求状态。

服务中介为每个last_operation请求发送返回一个last_operation字段。轮询请求的状态为“in_progress”时,控制器将继续轮询。控制器会考虑轮询请求的最大超时,并将停止轮询并将创建标记为失败。

虽然服务实例正在进行异步操作,但控制器必须确保没有其他操作(提供,取消,更新,绑定,取消绑定)。

使用服务实例

在使用服务实例之前,必须将其绑定到应用程序。这意味着应用和服务实例之间的链接或使用意图必须建立。创建一个新的Binding资源:

kubectl create -f binding.yaml 

binding.yaml内容如下所示:

apiVersion: servicecatalog.k8s.io/v1alpha1 
kind: Binding 
metadata:   
name: johnsBinding 
spec:   
secretName: johnSecret   
...Pod selector labels... 

控制器,接到新的Binding资源通知后,将与服务中介通信,为指定的服务实例创建一个新的绑定。从服务中介返回的Binding对象中有一组凭据。这些凭据包含应用程序与服务实例通信所需的所有信息。例如,它可能包括以下内容:

  • 服务实例的URL
  • 用户ID和密码来访问服务实例

OSB API规范不要求在凭据中显示什么属性,因此需要应用了解返回的指定数据以及如何正确使用它们。这通常通过阅读服务的文档来完成。

凭证不会存储在服务目录的数据存储中。相反,它们将作为秘密存储在Kubenetes中,并且将Secret的引用保存在Binding资源中。如果未指定Binding的Spec.SecretName,则控制器将使用Binding Name属性作为Secret的名称。

绑定不需要与服务实例位于相同的Kubenetes命名空间中。允许跨应用和命名空间共享服务实例。

除了Secret之外,控制器还将在Kubernetes中创建一个Pod注入策略(PIP)资源。有关更多信息,请参阅PIP提案,但简而言之,PIP定义了在创建Pod时如何修改Pod的规范以包含其他卷和环境变量。特别地,服务目录将使用PIPs来允许应用程序所有者指示Secret应该如何提供给其Pods。例如,他们可以定义一个PIP来指示Secret安装到Pod中。或者Secret的名称/值应该被暴露为环境变量。

PIP将使用标签选择器来指示哪些Pod将被修改。例如:

kind: PodInjectionPolicy 
apiVersion: extensions/v1alpha1 
metadata:   
name: allow-database   
namespace: myns 
spec:   
selector:     
matchLabels:      
  role: frontend   
env:     
- name: DB_PORT       
  value: 6379 

定义一个PIP,添加一个名为DB_PORT的环境变量,值为6379,所有具有Role标签的Pods都具有此前端值。

最终,OSB API规范将希望有关于凭证的额外元数据,以指出哪些字段被认为是“Secret”,哪些不是。当该支持可用时,期望将非Secret信息放入ConfigMap而取代Secret。

一旦Secret提供给应用Pods中,那么应用代码就可以使用该信息与服务实例进行通信。

删除服务实例

与Kubernetes中的资源一样,可以通过对资源执行HTTP DELETE来删除服务目录资源。 但是,请注意,有相关的绑定存在时,服务实例不能被删除。 换句话说,在删除服务实例之前,必须先删除其所有绑定。 删除具有绑定的实例将失败并产生错误。

删除绑定也将自动删除与之相关联的Secret或ConfigMaps。

当前设计

上述各节描述了服务目录的当前设计。 但是,有些尚未到位,代码不一定与之对齐。 目前的设计实际上更像是这样:

不同的方面:

  • API服务器只能使用etcd作为其持久存储。
  • API服务器没有连接到控制器,这意味着它并没有被实际作为运行系统的一部分。 只是通过与API服务器通信完成资源的创建和存储。
  • 可以使用Kubernetes的API服务器创建服务目录资源的TPRs版本是当前系统的工作方式。 然后,控制器将与Kubernetes中API服务器进行通信,并监视服务目录资源的TPRs版本,采取一切适当的措施。

译者介绍:范彬,从事微服务、Docker和Kubernetes容器技术等方面的工作。可以关注译者的微信公众号:范范米饭。

Kubernetes服务目录的设计的更多相关文章

  1. SOA实践之基于服务总线的设计

    在上文中,主要介绍了SOA的概念,什么叫做“服务”,“服务”应该具备哪些特性.本篇中,我将介绍SOA的一种很常见的设计实践--基于服务总线的设计. 基于服务总线的设计 基于总线的设计,借鉴了计算机内部 ...

  2. Java生鲜电商平台-高可用微服务系统如何设计?

    Java生鲜电商平台-高可用微服务系统如何设计? 说明:Java生鲜电商平台高可用架构往往有以下的要求: 高可用.这类的系统往往需要保持一定的 SLA,7*24 时不间断运行不代表完全不挂,而是有一定 ...

  3. .NET 微服务 2 架构设计理论(一)

    SOA体系架构 面向服务的体系结构 (SOA) ,通过将应用程序分解为多个服务(通常为 HTTP 服务,WCF服务等),将其分为不同类型(例如子系统或层),从而来划分应用程序的结构. 微服务源自 SO ...

  4. 阿里云Kubernetes服务 - Service Broker快速入门指南

    4月底阿里云容器服务上线了基于Kubernetes集群的服务目录功能.阿里云的容器的服务目录遵循Open Service Broker API标准,提供了一系列的服务代理组件,实现了对主流开源服务如M ...

  5. Dubbo入门到精通学习笔记(十):dubbo服务集群 、Dubbo分布式服务子系统的划分、Dubbo服务接口的设计原则

    文章目录 dubbo服务集群 Dubbo服务集群部署 Dubbo服务集群容错配置--集群容错模式 1.Failover Cluster 失败自动切换,当出现失败,重试其它服务器.`(缺省) 通常用于读 ...

  6. Azure Kubernetes 服务 (AKS)

    一.首先创建集群 1,注意:一定要选择Kubernets Service(红框处),上面的那一堆虚拟机都没有用, 2,设置好相关属性,集群大小可后面更改节点数,但是节点的大小不可更改 二.登陆集群 在 ...

  7. 将微服务部署到 Azure Kubernetes 服务 (AKS) 实践

    本文是对 <.NET Tutorial - Deploy a microservice to Azure> 的翻译和实践.入门级踩坑实践,k8s 大佬请回避,以免耽误您宝贵的时间. 介绍 ...

  8. 用集装箱装ASP。带有Docker和Azure Kubernetes服务的NET Core应用程序

    介绍 曾经有一个单一软件应用程序的时代,整个应用程序被打包并部署在作为单个进程运行的单个服务器上.我们都知道,在这个模型中,单点故障可能会导致整个应用程序崩溃. 微服务体系结构的发展是为了解决单片应用 ...

  9. 微软开源Kubernetes服务网格项目Open Service Mesh​

    尽管微服务环境提供可移植性,允许更快更频繁的部署周期,甚至还能让组织创建关注于特定领域的团队,但这也伴随着对于流量管理.安全以及可观测性等需求的增长.在整个生态系统中,针对这些需求的服务网格模式的实现 ...

随机推荐

  1. 分类,logistic回归

    1. 使用回归进行分类 机器学习中分类是指输入一个样本点,输出这个样本点所属的类别,预测的是一个离散值,如类别(1,2). 而回归问题是输入一个样本点,预测一个值,这个值是连续值,可以介于\([1,2 ...

  2. SpringBoot-模板渲染

    模板 开发Web站点的本质,其实就是根据浏览器发起的请求(输入),生成HTML代码返回给浏览器(输出).在之前的学习中,我们已经通过文件的形式存储起来而不是直接在Java代码中生成HTML代码.另一方 ...

  3. A class for dynamic icons in Windows

    A class for dynamic icons in Windows #include <windows.h> class DynamicIcon {public:  DynamicI ...

  4. 参数或变量中有语法错误。 服务器响应为: mail from address must be same as authorization user

    企业qq发邮件失败,提示: 参数或变量中有语法错误. 服务器响应为: mail from address must be same as authorization user 解决办法: 登录邮箱,设 ...

  5. ruby中的可调用对象--proc和lamdba

    ruby中将块转变成对象的三种方法 ruby中的大部分东西都是对象,但是块不是.那么,如果你想存下来一个块,方便以后使用,你就需要一个对象.ruby中有三种方法,把块转换成可以利用的对象. Proc. ...

  6. Mac Outlook邮箱MicrosoftExchange邮箱快满了,请减小邮箱大小。

    这两天我的Mac电脑中的Exchange总是收到公司的邮箱发来的[存储空间不足的告警邮件] MicrosoftExchange329e71ec88ae4615bbc36ab6ce41109e@your ...

  7. 2017 Multi-University Training Contest - Team 3 hdu6060 RXD and dividing

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6060 题目: RXD and dividing Time Limit: 6000/3000 M ...

  8. IDEA创建Spring Boot的项目

    IDEA创建SpringBoot的项目非常的方便智能,可以实现零配置,只需要在创建的时候勾选你需要的功能,比如mybatis,mysql等等,它会帮你自动下载导入响应的jar,不用自己再去手动填写. ...

  9. 【android】来电悬浮窗

    先看下效果图 说下思路: 1:监听来电广播 2:根据来电号码,和本地数据库做匹配,有记录的,则提取出头像.名字.职位,生成悬浮窗 3:监听来电广播,如果当前行为是空闲的(没有任何通话行为),则删除掉悬 ...

  10. 如何在idea中设置 jsp 内容修改以后,立即生效而不用重新启动服务?

    点击 run---->edit configuration--->