External database
Business Teams Service (BTS) can be configured with an external database. By default, BTS deploys the integrated EDB PostgreSQL database automatically in the Red Hat OpenShift cluster. You can also configure the external database for the BTS with one of the following methods:
Configuring an external database with the BTS custom resource
The BTS custom resource can be used to configure an external
database connection for the BTS service. You must specify the
spec.databaseConfig parameter in the YAML file to
configure the database. For more information about the
spec.databaseConfig parameter, see CRD API Reference.
The sample database configuration is as follows:
apiVersion: operator.ibm.com/v1alpha1
kind: BusinessTeamsService
metadata:
name: bts
namespace: cp4ba
spec:
databaseConfig:
serverName: mypostgresql.ibm.com
portNumber: 5432
databaseName: umsdb02
userSecretName: postgresql-user
ssl: "true"
sslMode: verify-ca
sslSecretName: postgres-ssl
If you set the databaseConfig parameter, BTS data
is hosted in an existing database and the default EDB PostgreSQL
installation is not deployed for the BTS installation.
You can configure the databaseConfig parameter with
the properties such as serverName,
portNumber, and databaseName. The
properties define the database endpoint and name that can be used
to configure the database.
The database admin can create the BTS database with CREATE
DATABASE btsdb. BTS creates the necessary tables
automatically when you configured database. The database user is
required to have the CREATE privilege on the
schema.
The userSecretName parameter directs to an existing
secret in the same namespace where BTS is installed. The following
is a sample secret for the userSecretName
parameter:
apiVersion: v1
kind: Secret
metadata:
name: postgresql-user
type: Opaque
stringData:
username: "postgres"
password: "Passw0rd"
The values of the username and
password parameters in the secret are the credentials
for login to the database.
SSL configuration
You can enable SSL encryption to create a private communication
between the BTS and the database. To enable the SSL encryption, set
the ssl: "true" parameter in the yaml file.
Set the values of sslMode parameter with
verify-ca or verify-full to validate the
certificate of the database. For more information, see
PostgreSQL JDBC connection parameters.
sslMode with
verify-ca. If you need to verify the certificate and
hostname of the database, set sslMode with
verify-full.The following is a sample configuration with SSL encryption:
apiVersion: operator.ibm.com/v1alpha1
kind: BusinessTeamsService
metadata:
name: bts
namespace: cp4ba
spec:
databaseConfig:
serverName: mypostgresql.ibm.com
portNumber: 5432
databaseName: umsdb02
userSecretName: postgresql-user
ssl: "true"
sslMode: verify-ca
sslSecretName: postgres-ssl
The sslSecretName parameter directs to an existing
secret in the same namespace where BTS is installed. The following
is an example of the secret with the postgres-ssl
secret name:
apiVersion: v1
kind: Secret
metadata:
name: postgres-ssl
type: Opaque
stringData:
ca.crt: |-
-----BEGIN CERTIFICATE-----
...<PEM encoded CA certificate>...
-----END CERTIFICATE-----
tls.crt: |-
-----BEGIN CERTIFICATE-----
...<PEM encoded certificate>...
-----END CERTIFICATE-----
In the example, ca.crt and tls.crt are
the keys of the secret that contain the respective certificate data
as PEM encoded strings. You can also set only one of the keys and
the content of the secret is mounted in the BTS container.
ca.crt and tls.crt are the values of the
sslrootcert and sslcert parameters of the
data source. For more information, see
PostgreSQL JDBC connection parameters.
SSL client certificate authentication
BTS can be used with SSL client certificate authentication. The following is a sample configuration with SSL client certificate authentication:
apiVersion: operator.ibm.com/v1alpha1
kind: BusinessTeamsService
metadata:
name: bts
namespace: cp4ba
spec:
databaseConfig:
serverName: mypostgresql.ibm.com
portNumber: 5432
databaseName: umsdb02
ssl: "true"
sslMode: verify-ca
sslSecretName: postgres-ssl
customProperties:
- name: sslkey
value: "/opt/ibm/wlp/usr/shared/resources/security/db/clientkey.pk8"
- name: user
value: postgres
userSecretName parameter. You can specify the
sslkey and user custom properties to
indicate the location of the client key and name of the user.The following is an example of the SSL secret
postgres-ssl:
apiVersion: v1
kind: Secret
metadata:
name: postgres-ssl
type: Opaque
data:
ca.crt: ...base64 encoded data...
tls.crt: ...base64 encoded data...
clientkey.pk8: ...base64 encoded data...
You can create the secret with the following command:
`oc create secret generic postgres-ssl --dry-run=client --from-file=clientkey.pk8=myclientkey.pk8 --from-file=ca.crt=ca.crt --from-file=tls.crt=tls.crt -oyaml >postgres-ssl.yaml`
The command assumes that the myclientkey.pk8,
ca.crt, and tls.crt files are located in
the same folder. The command creates a new
postgres-ssl.yaml file with the secret in the same
folder.
PEM format
needs to be converted to pk8 format before you create
the secret. Run the following command to convert the format:`openssl pkcs8 -topk8 -inform PEM -in myclientkey.pem -outform DER -nocrypt -out myclientkey.pk8`
Custom properties
You can set the custom properties to manage the special configuration cases. The following is an example of the custom properties:
apiVersion: operator.ibm.com/v1alpha1
kind: BusinessTeamsService
metadata:
name: bts
namespace: cp4ba
spec:
databaseConfig:
userSecretName: postgresql-user
customProperties:
- name: connectTimeout
value: "5"
- name: URL
value: jdbc:postgresql://mypostgresql.ibm.com:5432/umsdb02
For example, the JDBC URL and
connectTimeout properties are directly added in the
customProperties parameter. It is not necessary to
specify the host, port, and database name in the
databaseConfig section when you directly specify
URL in the customProperties parameter.
The value of connectTimeout is set to 5
seconds.
userSecretName
parameter in the spec.databaseConfig section to
authenticate the database with the credentials in a confidential
way. It is not recommended to set the username and password
directly in the custom properties.For more information about the supported
customProperties, see
PostgreSQL JDBC connection parameters.
Configuring an external database with the Kubernetes ConfigMap
You can use a Kubernetes ConfigMap to configure an
external database connection for the BTS. The parameters that are
specified in the Kubernetes ConfigMap are the same as in the BTS
custom resource. For more information about the parameters, SSL
configuration, and custom properties, see Configuring
an external database with the BTS custom resource.
The following is a sample ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: ibm-bts-config-extension
namespace: cp4ba
data:
serverName: unwon1.fyre.ibm.com
portNumber: "5432"
databaseName: umsdb02
ssl: "true"
sslMode: verify-ca
sslSecretName: postgres-ssl
userSecretName: postgresql-user
customPropertyName1: connectTimeout
customPropertyValue1: "5"
customPropertyName2: URL
customPropertyValue2: "jdbc:postgresql://unwon1.fyre.ibm.com:5432/umsdb02"
The custom properties are defined in a numbered way such as
customPropertyName1,
customPropertyValue1,
customPropertyName2, and
customPropertyValue2 to pass the name and value of the
specified custom properties.
For example, the connectTimeout and
URL properties are specified in the
customPropertyName1 and
customPropertyName2 parameters. The values of the
connectTimeout and URL properties are
specified in the customPropertyValue1 and
customPropertyValue1 parameters.