kubernetes笔记:Service Catalog
by 伊布
概念
Service Catalog (服务目录)是Kubernetes社区的孵化项目Kubernetes Service Catalog Project,旨在接入和管理第三方提供的Service Broker,使kubernetes上托管的应用可以使用service broker所代理的外部服务。第三方服务可以是云服务商提供的服务,例如数据库,消息队列等等,但不局限于此。
通过服务目录,kubernetes用户可以直接使用第三方服务,而不需要再到云上进行操作。对于企业来说,通过服务目录可以更好的管理对第三方资源的使用。
架构设计
Service Catalog 项目主要的工作是,将kubernetes资源翻译为对Service Broker的OSB API调用,基于此,kubernetes的用户可以通过创建kubernetes资源的方式来使用外部服务。
它有如下几个特性:
- 服务目录用户可以向kubernetes注册serice broker
- 服务目录可以从服务目录获取服务和服务计划(即catalog),并提供给kubernetes的用户
- kubernetes用户向服务目录请求一个ServiceInstance资源,从而向broker请求一个服务实例
- kubernetes用户通过创建ServiceBinding资源,将应用与服务绑定
Service Catalog 的架构和kubernetes的架构类似,也是分为API Server和controller;其中API Server接收RESTful请求,写入etcd;而Controller监听资源,并执行实际的工作:通过OSB API调用Service Broker的服务。Service Catalog 目前是通过Aggregated API的方式,将自身的API作为API 扩展注册到了kubernetes API server。值得注意的是,Service Catalog项目计划改为基于CRD来实现。
应用架构
Service Catalog在kubernetes架构中的位置如下图。
Service Catalog通过API Server对用户暴露如下API资源:
- ClusterServiceBroker,对接Service Broker,封装了该服务的连接细节。集群管理员管理。
- ClusterServiceClass,某Service Broker提供的服务,例如mysql,redis等。集群管理员管理。
- ClusterServicePlan,某服务的具体Plan(可以理解为套餐),例如mysql 5.7,redis-5-0-5
- ServiceInstance,ClusterServiceClass供给的服务实例,例如一个mysql数据库实例
- ServiceBinding,服务实例的访问凭证,例如mysql的用户名、密码、IP地址、端口号
部署Service Catalog
参考官网,使用helm可以很方便的部署。
部署后会在namespace catalog 下创建 catalog-catalog-apiserver 和 catalog-catalog-controller-manager两个Deployment,其中catalog-apiserver会向kubernetes apiserver注册如下api:
NAME SHORTNAMES APIGROUP NAMESPACED KIND
clusterservicebrokers servicecatalog.k8s.io false ClusterServiceBroker
clusterserviceclasses servicecatalog.k8s.io false ClusterServiceClass
clusterserviceplans servicecatalog.k8s.io false ClusterServicePlan
servicebindings servicecatalog.k8s.io true ServiceBinding
servicebrokers servicecatalog.k8s.io true ServiceBroker
serviceclasses servicecatalog.k8s.io true ServiceClass
serviceinstances servicecatalog.k8s.io true ServiceInstance
serviceplans servicecatalog.k8s.io true ServicePlan
kubernetes管理员通过clusterservicebrokers / clusterserviceclasses / clusterserviceplans注册第三方Service Broker服务;kubernetes用户通过serviceinstances / servicebindings 的api向k8s请求、使用第三方服务。
部署一个简单的service broker
kubernetes社区提供了一个service broker的demo,叫做minibroker,这个项目管理了一些helm charts,例如mysql,redis;例如,当service catalog通过OSB API向minibroker请求创建新的mysql实例时,minibroker其实是通过helm部署了一个mysql。
当然,minibroker实现了OSB API。
minibroker本身通过helm部署。
helm repo add minibroker https://minibroker.blob.core.windows.net/charts
helm install --name minibroker --namespace minibroker minibroker/minibroker
部署后,会在namespace minibroker里创建Deployment minibroker controller。helm部署时还会向kubernetes创建如下资源:
一个clusterservicebrokers,用来将OSB API请求转发给实际的broker服务(即minibroer controller):
$ kubectl get clusterservicebrokers.servicecatalog.k8s.io
NAME URL STATUS AGE
minibroker http://minibroker-minibroker.minibroker.svc.cluster.local Ready 2d
以及注册如下几个 clusterserviceclasses:
$ kubectl get clusterserviceclasses
NAME EXTERNAL-NAME BROKER AGE
mariadb mariadb minibroker 5m50s
mongodb mongodb minibroker 5m50s
mysql mysql minibroker 5m50s
postgresql postgresql minibroker 5m50s
redis redis minibroker 5m50s
以及若干clusterserviceplans:
$ kubectl get clusterserviceplans.servicecatalog.k8s.io
NAME EXTERNAL-NAME BROKER CLASS AGE
mariadb-10-1-26 10-1-26 minibroker mariadb 47h
mariadb-10-1-28 10-1-28 minibroker mariadb 47h
mariadb-10-1-29 10-1-29 minibroker mariadb 47h
实战
先创建namespace test-ns,假设用户是在test-ns里。
创建一个服务实例
$ kubectl create -f https://raw.githubusercontent.com/kubernetes-sigs/service-catalog/master/contrib/examples/walkthrough/mini-instance.yaml
$ kubectl get serviceinstances.servicecatalog.k8s.io -n test-ns
NAME CLASS PLAN STATUS AGE
mini-instance ClusterServiceClass/mariadb 10-1-26 Ready 3d3h
$ kubectl get pods -n test-ns
NAME READY STATUS RESTARTS AGE
virulent-camel-mariadb-d65d9dfb4-5bp4v 1/1 Running 0 3d3h
可以看到service catalog+minibroker会在用户的namespace test-ns下创建一个mariadb的Deployment,使用的也是用户自己的资源。相对用户直接helm install,service catalog更方便一些。
绑定服务实例
$ kubectl create -f https://raw.githubusercontent.com/kubernetes-sigs/service-catalog/master/contrib/examples/walkthrough/mini-binding.yaml
$ kubectl get servicebindings.servicecatalog.k8s.io -n test-ns
NAME SERVICE-INSTANCE SECRET-NAME STATUS AGE
mini-binding mini-instance mini-binding Ready 3d3h
$ svcat describe binding mini-binding
Name: mini-binding
Namespace: test-ns
Status: Ready - Injected bind result @ 2019-09-16 10:03:33 +0000 UTC
Secret: mini-binding
Instance: mini-instance
Parameters:
No parameters defined
Secret Data:
Protocol 5 bytes
host 48 bytes
mariadb-password 10 bytes
mariadb-root-password 10 bytes
password 10 bytes
port 4 bytes
uri 77 bytes
username 4 bytes
$ kubectl get secrets mini-binding -o yaml -n test-ns
apiVersion: v1
data:
Protocol: bX=====
host: dmlydW=====================================s
mariadb-password: a0d==========
mariadb-root-password: W==========
password: WD========
port: MzMwNg==
uri: bXl=================================================Y=
username: cm9vdA==
binding是什么意思呢?其实就是把访问服务的一些信息,通过secret提供给用户。
比如对于mariadb来说,其信息包括uri,port,用户名密码等等信息,用户可以通过这些信息来使用mariadb服务(例如将secret以volume的形式挂到Pod里)。
...
env:
- name: "PASSWORD"
valueFrom:
secretKeyRef:
name: mini-binding
key: password
总结
Ref:
Subscribe via RSS