kubernetes Service Catalog

1.Service Catalog

中文叫服务目录,是将各种形态服务(包括IAAS、PAAS等服务)集中统一的管理起来,其目的主要是为了管理第三方(相对于kubernetes而言,主要指集群外)服务,使第三方服务通过统一的方式和规范接入到集群中,具体的服务实现在外部,托管方无需关注。外部的服务一般通过Service Broker的方式接入到服务目录。

Service Catalog的动作

  • 创建ClusterServiceBroker
    通过ClusterServiceBroker将托管服务的代理配置到集群中,创建后会触发ServiceBrokerCatalog获取服务列表和ServicePlan,并将其以ClusterServiceClassClusterServicePlan存储到本地

  • 创建ServiceInstance
    通过创建ServiceInstance向代理发起创建实例请求

  • 服务绑定
    将需要使用托管服务的应用和托管服务绑定,生成secret,挂载到应用中

Service Broker的动作

  • Catalog
  • Provision
  • Bind
  • Unbind
  • Deprovision

在kuberntes中,接入后的服务将由kuberntes托管,典型的如数据库。Service Catalog的元数据存在etcd中,建议不和kubernetes本身的共用。要是使用Service Catalog,首先要注册APIService资源(servicecatalog.k8s.io

service catalog

APIService中包含的资源类型

  • ClusterServiceBroker:ServiceBroker在集群内的编排模板,封装了其服务器连接详细信息。主要是有由集群管理员创建的外部服务在集群中的代理。

  • ClusterServiceClass:外部服务会有不同的服务实例和类型,ClusterServiceBroker连接到ServiceBroker,通过catalog获取该broker的服务列表,为每个具体服务创建ClusterServiceClass。

  • ClusterServicePlan:主要描述各个服务的计量计费标准和方式,一个ClusterServiceClass对应一个ClusterServicePlan。

  • ServiceInstance:对应具体的服务实例的预配置实例,由Service Catalog控制器负责与外部的service broker通信,通知创建实例,绑定,在kubernetes创建service与内部应用通信。

  • ServiceBinding:将ServiceInstance与需要访问 的POD进行绑定,关联相关的证书到pod。

Service Catalog的认证方式

  • 基础认证Basic (username/password)
  • OAuth 2.0 Bearer Token

使用步骤
集群管理员通过Service Catalog API Resources提供托管能力,使之在kubernetes中提供服务。

  • 从ServiceBroker中获取服务列表(ClusterServiceClass)以及对应的ClusterServicePlan
    首先,集群管理员创建ClusterServiceBroker,其中包含URL和访问ServiceBroker地址必要的连接信息

    apiVersion: servicecatalog.k8s.io/v1beta1
    kind: ClusterServiceBroker
    metadata:
      name: cloud-broker
    spec:
      # Points to the endpoint of a service broker. (This example is not a working URL.)
      url:    https://servicebroker.somecloudprovider.com/v1alpha1/projects/service-catalog/brokers/default
      #####
      # Additional values can be added here, which may be used to communicate
      # with the service broker, such as bearer token info or a   caBundle for TLS.
      #####
    

    下面的时序图说明从service broker获取服务列表(ClusterServiceClass)和对应的ClusterServicePlan的流程

    image.png

    ①.一旦ClusterServiceBroker被添加到Service Catalog,将会触发一次对外部ServiceBroker的调用,来获取服务列表

    ②.外部ServiceBroker会返回一系列的可用服务以及对应的ServicePlan,这些服务和ServicePlan,将会以ClusterServiceClassClusterServicePlan

    ③.集群管理员通过如下命令获取可用的服务列表和ServicePlan

     kubectl get clusterserviceclasses -o=custom-columns=SERVICE\ NAME:.metadata.name,EXTERNAL\ NAME:.spec.externalName
     kubectl get clusterserviceplans -o=custom-columns=PLAN\ NAME:.metadata.name,EXTERNAL\ NAME:.spec.externalName
    
  • 开通服务实例
    群集操作员可以通过创建ServiceInstance资源来启动新实例。例如:

    apiVersion: servicecatalog.k8s.io/v1beta1
    kind: ServiceInstance
    metadata:
      name: cloud-queue-instance
      namespace: cloud-apps
    spec:
      # References one of the previously returned services
      clusterServiceClassExternalName: cloud-provider-service
      clusterServicePlanExternalName: service-plan-name
      #####
      # Additional parameters can be added here,
      # which may be used by the service broker.
      #####
    

    以下序列图说明了创建托管服务的实例所涉及的步骤


    image.png

    ①当ServiceInstance 被创建时,Service Catalog会对Service broker发起调用,来创建服务实例请求
    ②Service broker执行创建服务实例的动作,返回HTTP响应结果
    ③集群操作员可以检查实例的状态,看看它是否ready。

  • 绑定到托管服务
    在新的实例创建之后,集群管理员需要绑定托管的服务,应用程序才能获取所需要的连接信息和账户信息,此过程通过ServiceBinding来完成,例如:

      apiVersion: servicecatalog.k8s.io/v1beta1
      kind: ServiceBinding
      metadata:
        name: cloud-queue-binding
        namespace: cloud-apps
      spec:
        instanceRef:
          name: cloud-queue-instance
        #####
        # Additional information can be added here, such as a secretName or
        # service account parameters, which may be used by the service broker.
        #####
    

    以下序列图说明绑定到托管服务实例所涉及的步骤:

    image.png

    ServiceBinding被创建之后,Service Catalog调用外部的service broker获取绑定实例的必要信息
    service broker为请求创建合适的账户信息
    service broker返回连接和访问托管服务的必要信息,由于服务提供方和使用时特定的,所以不同的请求返回的信息可能会不一样。

  • 映射连接凭证
    绑定之后,最后一步将连接凭据和特定于服务的信息映射到应用程序中。这些信息存储在secrets中,集群中的应用程序可以通过secrets直接连接和访问托管服务。

    image.png

    执行映射的方式如下

    ...
      spec:
        volumes:
          - name: provider-cloud-key
            secret:
              secretName: sa-key
        containers:
            ...
            volumeMounts:
            - name: provider-cloud-key
              mountPath: /var/secrets/provider
            env:
            - name: PROVIDER_APPLICATION_CREDENTIALS
              value: "/var/secrets/provider/key.json"
    

2.在kubernetes中安装Service Catalog的CRD

[root@node4 repo]# helm repo add svc-cat https://svc-catalog-charts.storage.googleapis.com
"svc-cat" has been added to your repositories
[root@node4 repo]# helm search repo 
NAME                    CHART VERSION   APP VERSION DESCRIPTION                                       
svc-cat/catalog         0.2.1                       service-catalog API server and controller-manag...
svc-cat/catalog-v0.2    0.2.2                       service-catalog API server and controller-manag...
svc-cat/healthcheck     0.2.1                       HealthCheck monitors the health of Service Catalog
svc-cat/test-broker     0.2.1                       test service-broker deployment Helm chart.        
svc-cat/ups-broker      0.2.1                       user-provided service-broker deployment Helm ch...
[root@node4 repo]# helm install catalog  repo/catalog
NAME: catalog
LAST DEPLOYED: Fri Nov 22 15:07:16 2019
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@node4 repo]# helm ls
NAME    NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION
catalog default     1           2019-11-25 09:42:08.419781746 +0800 CST deployed    catalog-0.2.1   
[root@node4 repo]# kubectl get pod 
NAME                                                  READY   STATUS    RESTARTS   AGE
catalog-catalog-apiserver-548d58d5bb-dp764            0/2     Running   0          5s
catalog-catalog-controller-manager-7d4f797fbb-2sltc   0/1     Running   0          5s
[root@node4 repo]# kubectl get svc
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
catalog-catalog-apiserver            NodePort    172.20.250.33            443:30443/TCP   4m9s
catalog-catalog-controller-manager   ClusterIP   172.20.71.121            443/TCP         4m9s
#其他的会创建RoleBinding(当前命名空间和kube-system   )、role、ClusterRoleBinding、ClusterRole、ServiceAccount、Secret、APIService

3.Service Broker实例

Service Broker实现主要要遵守上面提到的5个接口,当然也有许多的SDK,方便开发者实现各自的broker,例如:

  • 基于java的
    Spring Cloud Open Service Broker
    具体实例:MySQL Java Broker:

  • 基于.NET的
    Open Service Broker API for .NET

  • 基于golang的
    osb-starter-pack
    brokerapi
    具体实例:Open Service Broker for Huawei Cloud、MySQL database service

你可能感兴趣的:(kubernetes Service Catalog)