Kubernetes学习笔记-kubernetes应用扩展(2)-使用kubernetes服务目录扩展kubernetes20230623

一、服务目录介绍

服务目录就是列出所有的服务的目录。用户可以浏览目录并自行设置目录中列出的服务实例,无须处理服务运行所需的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集群中注册代理,在该集群中暴露服务。

猜你喜欢

转载自blog.csdn.net/wwxsoft/article/details/131349638