1.Service Catalog
中文叫服务目录,是将各种形态服务(包括IAAS、PAAS等服务)集中统一的管理起来,其目的主要是为了管理第三方(相对于kubernetes而言,主要指集群外)服务,使第三方服务通过统一的方式和规范接入到集群中,具体的服务实现在外部,托管方无需关注。外部的服务一般通过Service Broker的方式接入到服务目录。
Service Catalog的动作
创建ClusterServiceBroker
通过ClusterServiceBroker将托管服务的代理配置到集群中,创建后会触发ServiceBroker
的Catalog
获取服务列表和ServicePlan
,并将其以ClusterServiceClass
和ClusterServicePlan
存储到本地创建ServiceInstance
通过创建ServiceInstance
向代理发起创建实例请求服务绑定
将需要使用托管服务的应用和托管服务绑定,生成secret
,挂载到应用中
Service Broker的动作
- Catalog
- Provision
- Bind
- Unbind
- Deprovision
在kuberntes中,接入后的服务将由kuberntes托管,典型的如数据库。Service Catalog的元数据存在etcd中,建议不和kubernetes本身的共用。要是使用Service Catalog,首先要注册APIService资源(servicecatalog.k8s.io
)
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
的流程
①.一旦ClusterServiceBroker
被添加到Service Catalog
,将会触发一次对外部ServiceBroker
的调用,来获取服务列表②.外部
ServiceBroker
会返回一系列的可用服务以及对应的ServicePlan
,这些服务和ServicePlan
,将会以ClusterServiceClass
和ClusterServicePlan
③.集群管理员通过如下命令获取可用的服务列表和
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. #####
以下序列图说明了创建托管服务的实例所涉及的步骤
①当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. #####
以下序列图说明绑定到托管服务实例所涉及的步骤:
①ServiceBinding
被创建之后,Service Catalog
调用外部的service broker
获取绑定实例的必要信息
②service broker
为请求创建合适的账户信息
③service broker
返回连接和访问托管服务的必要信息,由于服务提供方和使用时特定的,所以不同的请求返回的信息可能会不一样。 -
映射连接凭证
绑定之后,最后一步将连接凭据和特定于服务的信息映射到应用程序中。这些信息存储在secrets
中,集群中的应用程序可以通过secrets
直接连接和访问托管服务。
执行映射的方式如下... 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 <none> 443:30443/TCP 4m9s
catalog-catalog-controller-manager ClusterIP 172.20.71.121 <none> 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