Skip to main content

Storage

Single PVC (default)​

By default, the operator creates one PVC per replica mounted at /var/opt/mssql. All SQL Server data, logs, and tempdb share this volume.

storage:
size: 8Gi
storageClassName: standard # optional
accessModes: [ReadWriteOnce] # optional (default)

Separate volumes​

Set storage.volumes to create individual PVCs for data, log, and tempdb. Each volume gets its own storageClassName, accessModes, and size.

This is useful when:

  • Data and logs need different storage classes (e.g. high-IOPS SSD for logs)
  • You want independent capacity planning for each volume
  • tempdb should use ephemeral storage since it's rebuilt on every restart
storage:
volumes:
data:
storageClassName: fast-ssd
resources:
requests:
storage: 50Gi
log:
storageClassName: fast-ssd
resources:
requests:
storage: 20Gi
tempdb:
emptyDir:
sizeLimit: 10Gi

Mount paths​

VolumeMount pathPurpose
mssql-data/var/opt/mssqlMSSQL root + data files
mssql-log/var/opt/mssql/logTransaction log files
mssql-tempdb/var/opt/mssql/tempdbtempdb files

tempdb: PVC or emptyDir​

tempdb is rebuilt from scratch on every SQL Server restart, so ephemeral storage is a valid choice. Set exactly one of persistentVolumeClaim or emptyDir:

emptyDir (recommended for most workloads):

tempdb:
emptyDir:
sizeLimit: 10Gi

PVC (when you need guaranteed IOPS or specific storage class):

tempdb:
persistentVolumeClaim:
storageClassName: ultra-fast
resources:
requests:
storage: 10Gi

Immutability​

storage.volumes is immutable after creation. Kubernetes does not allow changing VolumeClaimTemplates on an existing StatefulSet. To change the storage layout, delete and recreate the StatefulSet (data persists in PVCs).

mssql.conf​

When separate volumes are enabled, the operator automatically configures SQL Server's file locations via mssql.conf:

[filelocation]
defaultdatadir = /var/opt/mssql/data
defaultlogdir = /var/opt/mssql/log
defaultdumpdir = /var/opt/mssql/data
errorlogfile = /var/opt/mssql/log/errorlog