To follow the walkthrough you need to have Service Manager running either on CloudFoundry or on Kubernetes. Also you need the Service Broker Proxies for Kubernetes and/or CloudFoundry as well as the smctl command line tool. Please follow the installation instructions if you don't already have the needed components.
This walkthrough uses the following setup:
- Service Manager running on minikube
- Service Broker running on minikube
- Service Broker Proxy for Kubernetes running on minikube
- Service Broker Proxy for CloudFoundry running on cfdev
However, everything should work the same regardless of where you set up the components, provided that there is visibility from the service broker proxies to the service manager and from the service manager to the service brokers.
We're going to deploy the sample service broker. For the purposes of this guide, we'll be using the Service Catalog's demo service broker as it's lightweight and has all the necessary functionalities. To install the service broker, please follow the installation guide
We haven't registered any service brokers inside the service manager, so upon querying it should return an empty list:
$ smctl list-brokers
No brokers registered.Because the service manager's job is to propagate the registrations to the respective platforms and as there are no registrations currently, the query to the platform's broker registry returns that there are no brokers provided by the service manager.
$ cf service-brokers
Getting service brokers as admin...
name url
p-mysql https://p-mysql.dev.cfdev.sh:443
p.rabbitmq http://10.144.0.146:8080
redis-odb http://10.144.0.147:12345Note: Service brokers provided by the service manager have a well known pattern which is sm-<broker-name>
$ svcat get brokers
NAME NAMESPACE URL STATUS
+------+-----------+-----+--------+We'll register the service broker by executing the register-broker command:
$ smctl register-broker ups-broker http://192.168.64.2:30445 "UPS Broker" -b admin:admin
ID Name URL Description Created Updated
------------------------------------ ---------- ------------------------- ----------- -------------------- --------------------
a0d0a401-3048-4db7-a6d5-c5098be84d6d ups-broker http://192.168.64.2:30445 UPS Broker 2018-10-08T11:10:20Z 2018-10-08T11:10:20ZWe get in return the whole information for the service-broker as registered in the service manager.
After the service broker is registered in the service manager, the platforms will periodically synchronize the state in the platform and that in the service manager. Thus when we list the brokers in the respective platform, we should see that the broker we registered inside the service manager has been propagated.
$ cf service-brokers
Getting service brokers as admin...
name url
p-mysql https://p-mysql.dev.cfdev.sh:443
p.rabbitmq http://10.144.0.146:8080
redis-odb http://10.144.0.147:12345
sm-ups-broker https://cfproxy.dev.cfdev.sh/v1/osb/a0d0a401-3048-4db7-a6d5-c5098be84d6d$ svcat get brokers
NAME NAMESPACE URL STATUS
+-----------------------------------------------+-----------+-------------------------------------------------------------------------------------------------+--------+
sm-ups-broker http://service-broker-proxy.service-broker-proxy:80/v1/osb/a0d0a401-3048-4db7-a6d5-c5098be84d6d ReadyAfter the service broker is registered in each platform, its services and plans are made available to everyone.
The service broker provides a set of services (user-provided-service, user-provided-service-single-plan and user-provided-service-with-schemas) each with its respective plans:
$ cf marketplace
Getting services from marketplace in org test / space test as admin...
OK
service plans description
p-mysql 10mb, 20mb MySQL databases on demand
p.rabbitmq solo, cluster RabbitMQ Dedicated Instance
p.redis cache-small, cache-medium, cache-large Redis service to provide on-demand dedicated instances configured as a cache.
user-provided-service default, premium A user provided service
user-provided-service-single-plan default A user provided service
user-provided-service-with-schemas default A user provided service$ svcat get classes
NAME NAMESPACE DESCRIPTION
+------------------------------------+-----------+-------------------------+
user-provided-service A user provided service
user-provided-service-single-plan A user provided service
user-provided-service-with-schemas A user provided service$ svcat get plans
NAME NAMESPACE CLASS DESCRIPTION
+---------+-----------+------------------------------------+--------------------------------+
default user-provided-service Sample plan description
premium user-provided-service Premium plan
default user-provided-service-single-plan Sample plan description
default user-provided-service-with-schemas Plan with parameter and
response schemasNow that we see the user-provided-service in both platforms we can go ahead and create a new service instance.
$ cf create-service user-provided-service default ups
Creating service instance ups in org test / space test as admin...
OK$ svcat provision ups --class user-provided-service --plan default
Name: ups
Namespace: default
Status:
Class: user-provided-service
Plan: default
Parameters:
No parameters defined$ svcat describe instance ups
Name: ups
Namespace: default
Status: Ready - The instance was provisioned successfully @ 2018-10-08 12:07:31 +0000 UTC
Class: user-provided-service
Plan: default
Parameters:
No parameters defined
Bindings:
No bindings definedNow that we have created ups instance of the user-provided-service we can go ahead and create a service binding for it:
For CloudFoundry it's easiest to create a service key:
$ cf create-service-key ups ups-key
Creating service key ups-key for service instance ups as admin...
OK$ cf service-key ups ups-key
Getting key ups-key for service instance ups as admin...
{
"special-key-1": "special-value-1",
"special-key-2": "special-value-2"
}$ svcat bind ups
Name: ups
Namespace: default
Status:
Secret: ups
Instance: ups
Parameters:
No parameters defined$ svcat describe binding ups --show-secrets
Name: ups
Namespace: default
Status: Ready - Injected bind result @ 2018-10-08 12:10:33 +0000 UTC
Secret: ups
Instance: ups
Parameters:
No parameters defined
Secret Data:
special-key-1 special-value-1
special-key-2 special-value-2Now let's clean up the resources we've created:
$ cf delete-service-key ups ups-key
Really delete the service key ups-key?> y
Deleting key ups-key for service instance ups as admin...
OK$ svcat unbind ups
deleted upsListing the bindings should show that the ups binding is gone:
$ svcat get bindings
NAME NAMESPACE INSTANCE STATUS
+------+-----------+----------+--------+Next, we can deprovision the service instance:
$ cf delete-service ups
Really delete the service ups?> y
Deleting service ups in org test / space test as admin...
OK$ svcat deprovision ups
deleted upsListing the instances should show that the ups instance is gone:
$ svcat get instances
NAME NAMESPACE CLASS PLAN STATUS
+------+-----------+-------+------+--------+We can try and delete the service broker in the respective platform, but due to the architecture of the service manager it will reappear after a configured period of time:
$ cf delete-service-broker sm-ups-broker
Really delete the service-broker sm-a0d0a401-3048-4db7-a6d5-c5098be84d6d?> y
Deleting service broker sm-a0d0a401-3048-4db7-a6d5-c5098be84d6d as admin...
OKListing the brokers after a while we will see that the service broker is recreated:
$ cf service-brokers
Getting service brokers as admin...
name url
p-mysql https://p-mysql.dev.cfdev.sh:443
p.rabbitmq http://10.144.0.146:8080
redis-odb http://10.144.0.147:12345
sm-ups-broker https://cfproxy.dev.cfdev.sh/v1/osb/a0d0a401-3048-4db7-a6d5-c5098be84d6d$ kubectl delete clusterservicebrokers sm-ups-broker
clusterservicebroker.servicecatalog.k8s.io "sm-a0d0a401-3048-4db7-a6d5-c5098be84d6d" deletedAnd if we start watching for the ClusterServiceBroker resource we'll see that the service broker is registered again:
$ kubectl get clusterservicebrokers -w
NAME AGE
sm-a0d0a401-3048-4db7-a6d5-c5098be84d6d 0s
sm-a0d0a401-3048-4db7-a6d5-c5098be84d6d 1sTo delete the service broker, you need to remove its registration from the service manager itself:
$ smctl delete-broker ups-broker
Broker with name: ups-broker successfully deletedAnd after the configured period of time, the platforms will resync the state from the service manager, removing the service broker:
$ cf service-brokers
Getting service brokers as admin...
name url
p-mysql https://p-mysql.dev.cfdev.sh:443
p.rabbitmq http://10.144.0.146:8080
redis-odb http://10.144.0.147:12345$ svcat get brokers
NAME NAMESPACE URL STATUS
+------+-----------+-----+--------+