Files
talks/2025-09-11-sql-server-2022-openshift/README.org

4.1 KiB

Deploy sql server on openshift

This short write-up will explain how to deploy single instance SQL Sever 2022 databases on OpenShift for the purposes of rapid proof of concepts.

Pre-requisites

Before we begin let's ensure we are logged into our cluster.

oc whoami && oc version
cluster-admin
Client Version: 4.19.10
Kustomize Version: v5.5.0
Server Version: 4.17.37
Kubernetes Version: v1.30.14

Create database pvc

Our database will use persistent storage to ensure the database contents are not lost between restarts, we can request by creating a PersistentVolumeClaim resource.

cat << EOF | oc --namespace sql-server apply --filename -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mssql-data
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
EOF
persistentvolumeclaim/mssql-data created

Create database credential

We also need to supply credentials for our database to be created with, we can do this by creating a Secret resource.

cat << EOF | oc --namespace sql-server apply --filename -
apiVersion: v1
data:
  SA_PASSWORD: U1FMU2VydmVyMjAyMk9uT0NQ
kind: Secret
metadata:
  name: mssql
EOF
secret/mssql created

Create database deployment

With our pre-requisites in place we can create our database Deployment.

cat << EOF | oc --namespace sql-server apply --filename -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mssql-deployment
spec:
  selector:
    matchLabels:
      app: mssql
  template:
    metadata:
      labels:
        app: mssql
    spec:
      containers:
        - name: mssql
          image: mcr.microsoft.com/mssql/rhel/server:2022-CU13-rhel-9.1
          securityContext:
            capabilities:
              add: ["NET_BIND_SERVICE"]
          ports:
            - containerPort: 1433
          env:
            - name: MSSQL_PID
              value: "Developer"
            - name: ACCEPT_EULA
              value: "Y"
            - name: MSSQL_SA_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mssql
                  key: SA_PASSWORD
          volumeMounts:
            - name: mssqldb
              mountPath: /var/opt/mssql
      volumes:
        - name: mssqldb
          persistentVolumeClaim:
            claimName: mssql-data
EOF
deployment.apps/mssql-deployment created

Create database service

Once the database is running we can expose it for use within our cluster by creating a Service. Other pods we deploy in the namespace will be able to reach the database using the service name mssql-service and the appropriate port.

cat << EOF | oc --namespace sql-server apply --filename -
apiVersion: v1
kind: Service
metadata:
  name: mssql-service
spec:
  selector:
    app: mssql
  ports:
    - protocol: TCP
      port: 31433
      targetPort: 1433
  type: ClusterIP
EOF
service/mssql-service created

Confirm database running

Finally - we can validate the database is running by executing sqlcmd within the database pod.

oc --namespace sql-server exec $(oc --namespace sql-server get pods --output name) -- /opt/mssql-tools/bin/sqlcmd -Usa -PSQLServer2022OnOCP -q "SELECT name FROM sys.databases"
name
--------------------------------------------------------------------------------------------------------------------------------
master
tempdb
model
msdb

(4 rows affected)