Service Binding
When you’re developing an application that uses multiple services (such as Kafka and a Service Registry), you normally have to manually configure connections to these services in a configuration file. These connection configurations often include public data such as well-known URLs, as well as private data such as passwords and account IDs. Custom resources (CRs) managed by the RHOAS Operator provide service binding annotations. This allows the Service Binding Operator (SBO) to expose connection information to your application. Because the SBO manages the connection information, the information stays securely inside your OpenShift cluster instead of being shared across different configuration files in source control.
The RHOAS Operator works with the SBO by setting values in the status subresource of KafkaConnection and ServiceRegistryConnection objects. These values match the values in the binding annotations. This method allows the Service Binding Operator to inject values from the CRs for these objects into end-user workloads.
Annotation Details
The service binding annotations can be found in the the KafkaConnection and ServiceRegistryConnection custom resource definitions (CRDs).
Shown below are the service binding annotations in a CR for a ServiceRegistryConnection object:
annotations:
service.binding/registryUrl: 'path={.status.registryUrl}'
## Additional binding metadata required for Quarkus
service.binding/type: 'path={.status.metadata.type}'
## OAUTH BEARER credentials
service.binding/clientId: >-
path={.status.serviceAccountSecretName},objectType=Secret,sourceKey=client-id
service.binding/clientSecret: >-
path={.status.serviceAccountSecretName},objectType=Secret,sourceKey=client-secret
service.binding/oauthTokenUrl: 'path={.status.metadata.oauthTokenUrl}'
These annotations instruct the SBO to map the fields registryUrl, type, clientId, clientSecret, and oauthTokenUrl to properties provided by the ServiceRegistryConnection object, as well as references to properties stored securely in a secret. In this case, the client credentials are actually resolved by a secret lookup, using the value of .status.serviceAccountSecretName.
Likewise, the CR for a KafkaConnection object has the following service binding annotations:
.kafkaconnection.example.yaml
annotations:
service.binding/bootstrapServers: 'path={.status.bootstrapServerHost}'
## SASL PLAIN credentials
service.binding/user: >-
path={.status.serviceAccountSecretName},objectType=Secret,sourceKey=client-id
service.binding/password: >-
path={.status.serviceAccountSecretName},objectType=Secret,sourceKey=client-secret
## SASL OAUTH BEARER credentials
service.binding/clientId: >-
path={.status.serviceAccountSecretName},objectType=Secret,sourceKey=client-id
service.binding/clientSecret: >-
path={.status.serviceAccountSecretName},objectType=Secret,sourceKey=client-secret
service.binding/saslMechanism: 'path={.status.metadata.saslMechanism}'
service.binding/securityProtocol: 'path={.status.metadata.securityProtocol}'
## Additional binding metadata required for Quarkus
service.binding/type: 'path={.status.metadata.type}'
service.binding/provider: 'path={.status.metadata.provider}'
Similar to the annotations in a ServiceRegistryConnection CR, the annotations in a KafkaConnection CR allow the SBO to map the fields bootstrapServers, user, password, clientId, clientSecret, saslMechanism, securityProtocol, type, and provider binding values to properties provided by the KafkaConnection object.
Binding Example
For a deployment named kafka-avro-schema-quickstart-app and a ServiceRegistryConnection object called quickstart-service-registry, the following ServiceBinding resource can be used to bind the Service Registry connection information into the pods of the deployment. The application in the deployment can look these properties up as values in the file system, or use a Quarkus extension to automatically consume them.
apiVersion: binding.operators.coreos.com/v1alpha1
kind: ServiceBinding
metadata:
name: movies
namespace: default
spec:
application:
group: apps
name: kafka-avro-schema-quickstart-app
resource: deployments
version: v1
bindAsFiles: true
services:
- group: rhoas.redhat.com
version: v1alpha1
kind: ServiceRegistryConnection
name: quickstart-service-registry
Conclusion
In the preceding examples, we focused on the ServiceRegistryConnection object, but the information (minus implementation details) is the same for KafkaConnection objects as well. If you want to learn more about service binding, you should look at the link{https://redhat-developer.github.io/service-binding-operator/userguide/intro.html}[Service Binding Operator documentation] and the link{https://github.com/servicebinding/spec}[Service Binding Specification for Kubernetes].