Advanced Binding Options

Transform binding names before projection into application

This feature is only available for ServiceBinding in the API group.

If an application expects the projected environment variables in a particular format, but the values from backing services are not available in that format, then users can use the feature described here to transform binding names.

The transformation rules can be specified in the .spec.namingStrategy attribute of the ServiceBinding resource.

If the namingStrategy is not specified, the environment variables are create like this:

  • names are upper-cased

  • service resource kind is upper-cased and prepended to the name

Let’s say there is a host: value in the backing service, the projected environment variable is going to be like this:


In this example, DATABASE is the backend service Kind and HOST is the binding name.

How ?

Following fields are part of ServiceBinding request. - Application

    name: nodejs-app
    group: apps
    version: v1
    resource: deployments
  • Backend/Database Service

namingStrategy: 'POSTGRES_{{ .service.kind | upper }}_{{ .name | upper }}_ENV'
  - group:
    version: v1alpha1
    kind: Database
    name: db-demo

Considering following are the fields exposed by above service to use for binding 1. host 2. port

We have applied POSTGRES_{{ .service.kind | upper }}_{{ .name | upper }}_ENV naming strategy 1. .name refers to binding name exposed by the service, in this case host or port. 2. .service.kind refer to the kind of service resource whoes binding name are transformed with this strategy. 3. upper is the string function used to postprocess the string while compiling the template string. 4. POSTGRES is the prefix used. 5. ENV is the suffix used.

Following would be list of binding names prepared by above ServiceBinding


We can define how each key should be prepared defining string template in namingStrategy

Naming Strategies

There are few naming strategies predefine.

  1. none - When this is applied, no transformations are performed on binding names. The binding names is in following form - {{ .name }}. This is the default behavior.

    port: 8080
  2. uppercase - This is by uppercase set when no namingStrategy is defined and bindAsFiles set to false - {{ .service.kind | upper}}_{{ .name | upper }}

  3. lowercase - This is by default set when bindAsFiles set to true - {{ .name | lower }}

    port: 8080

Predefined string post processing functions

  1. upper - Capatalize all letters

  2. lower - Lowercase all letters

  3. title - Title case all letters.

Compose custom binding data

This feature is only available for ServiceBinding in the API group.

If the backing service doesn’t expose binding data or the values exposed are not easily consumable, then an application author may compose custom binding data using attributes in the Kubernetes resource representing the backing service.

Example, the backing service CR may expose the host, port and database user as binding data, but the application may need to consume this information as a connection string.

kind: ServiceBinding
  name: multi-service-binding
  namespace: service-binding-demo

    name: java-app
    group: apps
    version: v1
    resource: deployments

  - group:
    version: v1alpha1
    kind: Database
    name: db-demo   (1)
    id: postgresDB (2)
  - group:
    version: v1alpha1
    kind: Binding
    name: mytranslator-binding (3)
    id: translationService

    ## From the database service
    - name: JDBC_URL
      value: 'jdbc:postgresql://{{ .postgresDB.status.dbConnectionIP }}:{{ .postgresDB.status.dbConnectionPort }}/{{ .postgresDB.status.dbName }}'
    - name: DB_USER
      value: '{{ .postgresDB.status.dbCredentials.user }}'

    ## From the translator service
      value: '{{ index translationService.status.secretName "url" }}'
      value: '{{ index translationService.status.secretName "apikey" }}'

    ## From both the services!
      value: '{{ .postgresDB.status.dbName }}{{ translationService.status.secretName}}'

    ## Generate JSON.
    - name: DB_JSON
      value: {{ json .postgresDB.status }}
1 Database service
2 Optional "id" field
3 Translation service