1.Service Catalog
中文叫服務(wù)目錄,是將各種形態(tài)服務(wù)(包括IAAS、PAAS等服務(wù))集中統(tǒng)一的管理起來,其目的主要是為了管理第三方(相對于kubernetes而言,主要指集群外)服務(wù),使第三方服務(wù)通過統(tǒng)一的方式和規(guī)范接入到集群中,具體的服務(wù)實現(xiàn)在外部,托管方無需關(guān)注。外部的服務(wù)一般通過Service Broker的方式接入到服務(wù)目錄。
Service Catalog的動作
創(chuàng)建ClusterServiceBroker
通過ClusterServiceBroker將托管服務(wù)的代理配置到集群中,創(chuàng)建后會觸發(fā)ServiceBroker的Catalog獲取服務(wù)列表和ServicePlan,并將其以ClusterServiceClass和ClusterServicePlan存儲到本地創(chuàng)建ServiceInstance
通過創(chuàng)建ServiceInstance向代理發(fā)起創(chuàng)建實例請求服務(wù)綁定
將需要使用托管服務(wù)的應(yīng)用和托管服務(wù)綁定,生成secret,掛載到應(yīng)用中
Service Broker的動作
- Catalog
- Provision
- Bind
- Unbind
- Deprovision
在kuberntes中,接入后的服務(wù)將由kuberntes托管,典型的如數(shù)據(jù)庫。Service Catalog的元數(shù)據(jù)存在etcd中,建議不和kubernetes本身的共用。要是使用Service Catalog,首先要注冊APIService資源(servicecatalog.k8s.io)

APIService中包含的資源類型
ClusterServiceBroker:ServiceBroker在集群內(nèi)的編排模板,封裝了其服務(wù)器連接詳細(xì)信息。主要是有由集群管理員創(chuàng)建的外部服務(wù)在集群中的代理。
ClusterServiceClass:外部服務(wù)會有不同的服務(wù)實例和類型,ClusterServiceBroker連接到ServiceBroker,通過catalog獲取該broker的服務(wù)列表,為每個具體服務(wù)創(chuàng)建ClusterServiceClass。
ClusterServicePlan:主要描述各個服務(wù)的計量計費標(biāo)準(zhǔn)和方式,一個ClusterServiceClass對應(yīng)一個ClusterServicePlan。
ServiceInstance:對應(yīng)具體的服務(wù)實例的預(yù)配置實例,由Service Catalog控制器負(fù)責(zé)與外部的service broker通信,通知創(chuàng)建實例,綁定,在kubernetes創(chuàng)建service與內(nèi)部應(yīng)用通信。
ServiceBinding:將ServiceInstance與需要訪問 的POD進(jìn)行綁定,關(guān)聯(lián)相關(guān)的證書到pod。
Service Catalog的認(rèn)證方式
- 基礎(chǔ)認(rèn)證Basic (username/password)
- OAuth 2.0 Bearer Token
使用步驟
集群管理員通過Service Catalog API Resources提供托管能力,使之在kubernetes中提供服務(wù)。
-
從ServiceBroker中獲取服務(wù)列表(ClusterServiceClass)以及對應(yīng)的ClusterServicePlan
首先,集群管理員創(chuàng)建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獲取服務(wù)列表(ClusterServiceClass)和對應(yīng)的ClusterServicePlan的流程
image.png
①.一旦ClusterServiceBroker被添加到Service Catalog,將會觸發(fā)一次對外部ServiceBroker的調(diào)用,來獲取服務(wù)列表②.外部
ServiceBroker會返回一系列的可用服務(wù)以及對應(yīng)的ServicePlan,這些服務(wù)和ServicePlan,將會以ClusterServiceClass和ClusterServicePlan③.集群管理員通過如下命令獲取可用的服務(wù)列表和
ServicePlankubectl 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 -
開通服務(wù)實例
群集操作員可以通過創(chuàng)建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. #####以下序列圖說明了創(chuàng)建托管服務(wù)的實例所涉及的步驟
image.png
①當(dāng)ServiceInstance 被創(chuàng)建時,Service Catalog會對Service broker發(fā)起調(diào)用,來創(chuàng)建服務(wù)實例請求
②Service broker執(zhí)行創(chuàng)建服務(wù)實例的動作,返回HTTP響應(yīng)結(jié)果
③集群操作員可以檢查實例的狀態(tài),看看它是否ready。 -
綁定到托管服務(wù)
在新的實例創(chuàng)建之后,集群管理員需要綁定托管的服務(wù),應(yīng)用程序才能獲取所需要的連接信息和賬戶信息,此過程通過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. #####以下序列圖說明綁定到托管服務(wù)實例所涉及的步驟:
image.png
①ServiceBinding被創(chuàng)建之后,Service Catalog調(diào)用外部的service broker獲取綁定實例的必要信息
②service broker為請求創(chuàng)建合適的賬戶信息
③service broker返回連接和訪問托管服務(wù)的必要信息,由于服務(wù)提供方和使用時特定的,所以不同的請求返回的信息可能會不一樣。 -
映射連接憑證
綁定之后,最后一步將連接憑據(jù)和特定于服務(wù)的信息映射到應(yīng)用程序中。這些信息存儲在secrets中,集群中的應(yīng)用程序可以通過secrets直接連接和訪問托管服務(wù)。
image.png
執(zhí)行映射的方式如下... 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
#其他的會創(chuàng)建RoleBinding(當(dāng)前命名空間和kube-system )、role、ClusterRoleBinding、ClusterRole、ServiceAccount、Secret、APIService
3.Service Broker實例
Service Broker實現(xiàn)主要要遵守上面提到的5個接口,當(dāng)然也有許多的SDK,方便開發(fā)者實現(xiàn)各自的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



