Hi everyone! Today I want to show you how easy it is to get an instance of Oracle up and running in Kubernetes, with Oracle REST Data Services and Database Actions using the Oracle Database Operator for Kubernetes
Let’s assume you have a Kubernetes cluster running and you have configured kubectl access to the cluster.
The first step is to install Cert Manager, which is a pre-requisite for the Oracle Database Operator:
kubectl apply -f https://github.com/jetstack/cert-manager/releases/latest/download/cert-manager.yaml
It will take probably less than a minute to start up. You can check on it with this command:
kubectl -n cert-manager get pods
NAME READY STATUS RESTARTS AGE
cert-manager-8f49b54c8-xxd5v 1/1 Running 0 7d5h
cert-manager-cainjector-678548868-x5ljp 1/1 Running 0 7d5h
cert-manager-webhook-898d9d956-57m76 1/1 Running 0 7d5h
Next, install the Oracle Database Operator itself:
kubectl apply -f https://raw.githubusercontent.com/oracle/oracle-database-operator/main/oracle-database-operator.yaml
That will start up pretty quickly too, and you can check with this command:
kubectl -n oracle-database-operator-system get pods
Let’s create a Single Instance Database. The Oracle Database Operator will let you create other types of databases too, including sharded and multitenant databases, and to manage cloud database instances like Autonomous Database and Database Cloud Service. But today, I’m going to stick with a simple single instance.
Here’s the Kubernetes YAML file to describe the database we want, I called this sidb.yaml:
apiVersion: database.oracle.com/v1alpha1
kind: SingleInstanceDatabase
metadata:
name: sidb-sample
namespace: default
spec:
sid: ORCL1
edition: enterprise
adminPassword:
secretName: db-admin-secret
secretKey: oracle_pwd
keepSecret: true
charset: AL32UTF8
pdbName: orclpdb1
flashBack: false
archiveLog: false
forceLog: false
enableTCPS: false
tcpsCertRenewInterval: 8760h
image:
pullFrom: container-registry.oracle.com/database/enterprise:latest
pullSecrets: oracle-container-registry-secret
persistence:
size: 100Gi
storageClass: "oci-bv"
accessMode: "ReadWriteOnce"
loadBalancer: false
serviceAccountName: default
replicas: 1
If you have not before, head over to Oracle Container Registry and go to the Database group, and accept the license agreement for the Enterprise option. You’ll also want to create a Kubernetes secret with your credentials so it can pull the image:
kubectl create secret docker-registry oracle-container-registry-secret \
--docker-server=container-registry.oracle.com \
--docker-username='me@example.com' \
--docker-password='whatever' \
--docker-email='me@example.com'
You will want to change the storageClass to match your cluster. I am using Oracle Container Engine for Kuberentes in this example, so I used the “oci-bv” storage class. If you are using a different flavor of Kubernetes you should check what storage classes are available and use one of them.
This YAML describes a databse with the SID ORCL1 and a PDB called orclpdb1. It will get the password for sys, pdbadmin, etc., from a Kubernetes secret – so let’s create that:
kubectl create secret generic db-admin-secret --from-literal=oracle_pwd=Welcome12345
Now we can create the database by applying that YAML file to our cluster:
kubectl apply -f sidb.yaml
It will take few minutes to start up fully – it has to pull the image (which took 3m30s on my cluster, for the “enterprise” image which is the biggest one), create the database instance the first time (mine took 8m), and apply any patches that are required (just over 1m for me). Subsequent startups will be much faster of course (I stopped it by scaling to zero replicas, then started it again by scaling back to one replica and it reached ready/healthy status in about 90s). For reference, my cluster had two nodes each with one OCPU and 16 GB of RAM. You can check on the progress with this command:
kubectl get singleinstancedatabases -o wide -w
As the database starts up, you will see the connection string and other fields populate in the output.
Now, let’s add Oracle REST Data Services. Here’s a Kubernetes YAML file that describes what we want, I called this ords.yaml:
apiVersion: database.oracle.com/v1alpha1
kind: OracleRestDataService
metadata:
name: ords-sample
namespace: default
spec:
databaseRef: "sidb-sample"
adminPassword:
secretName: db-admin-secret
ordsPassword:
secretName: ords-secret
image:
pullFrom: container-registry.oracle.com/database/ords:21.4.2-gh
restEnableSchemas:
- schemaName: mark
enable: true
urlMapping: mark
You’ll need to create a secret to hold the password, for example:
kubectl create secret generic ords-secret --from-literal=oracle_pwd=Welcome12345
You can apply that to your cluster with this command:
kubectl apply -f ords.yaml
And we can check on progress with this command:
kubectl get oraclerestdataservice -w
As it becomes ready, you will see the URLs for the Database API REST endpoint and for Database Actions. Mine took about 2m to reach ready/healthy status.
If your nodes are on a private network, the quickest way to access the REST APIs and Database Actions is to use a port forward. You can get the name of the ORDS pod and start a port forwarding session with commands like this:
kubectl get pods
kubectl port-forward pod/ords-sample-g4wc7 8443
Now you can hit the Database API REST endpoint with curl:
curl -k https://localhost:8443/ords/orclpdb1/_/db-api/stable/
{"links":[{"rel":"self","href":"https://localhost:8443/ords/orclpdb1/_/db-api/stable/"},{"rel":"describedby","href":"https://localhost:8443/ords/orclpdb1/_/db-api/stable/metadata-catalog/"}]}
And you can access Database Actions at this address: http://localhost:8443/ords/sql-developer
On the login page, enter ORCLPDB1 for the PDB Name and mark as the user. Then on the password page enter Welcome12345, and you are good to go!
While we are at it, let’s also get SQLcl access to the database.
Again, we can use port forwarding to access the database from outside the cluster:
kubectl port-forward svc/sidb-sample 1521 &
And then connect from SQLcl (if you have not checked out SQLcl yet, you should, it’s got cool features like command line completion and history):
sql mark/Welcome12345@//localhost:1521/orclpdb1
SQLcl: Release 22.2 Production on Mon May 01 14:32:57 2023
Copyright (c) 1982, 2023, Oracle. All rights reserved.
Last Successful login time: Mon May 01 2023 14:32:56 -04:00
Connected to:
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
SQL> select * from dual;
DUMMY
________
X
SQL>
There you go! That was super quick and easy! Enjoy!
You must be logged in to post a comment.