I am attempting to setup a MSSQL-server in my WSL2 Linux distro, where I mount a volume for my .mdf- and .ldf-files.
However, I can't get Kubernetes to see my folder with said files.
I have my files stored in C:\WindowsFolder\data on my host (Windows), which allows WSL2 to see them at the path /mnt/c/WindowsFolder/data (Linux).
If I run the following yaml-file, kubectl sets up everything but my data - the folder I mount it into (/data) is empty.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-database
labels:
app.kubernetes.io/name: my-deployment
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: label-identifier
template:
metadata:
labels:
app.kubernetes.io/name: label-identifier
spec:
hostname: "database"
securityContext:
fsGroup: 0
containers:
- name: database
image: "mcr.microsoft.com/mssql/server:2019-latest"
imagePullPolicy: IfNotPresent
ports:
- containerPort: 1433
protocol: TCP
env:
- name: "ACCEPT_EULA"
value: "Y"
- name: "MSSQL_DATA_DIR"
value: /data
- name: "MSSQL_PID"
value: "Developer"
- name: "SA_PASSWORD"
value: "SuperSecret123!"
volumeMounts:
- name: "myvolume"
mountPath: /data
volumes:
- name: "myvolume"
hostPath:
path: "/mnt/c/windowsFolder/Database"
Then I tried to spin up a docker container inside my WSL2 - it works as expected, but this is not a good solution in the long run:
wsl.exe #Enter WSL2
docker run -d --name sql-t1 -e "ACCEPT_EULA=Y" \
-e "SA_PASSWORD=SuperSecret123!" -p 1433:1433 \
-v /mnt/c/windowsFolder/Database:/data \
mcr.microsoft.com/mssql/server:2019-latest
docker ps #find my containerID
docker exec -it <containerId> bash #step into docker container
> ls /data #shows my files correctly
WSL2 can mount through docker correctly on the same path specified with Kubernetes, but it doesn't work from Kubernetes.
Any suggestions why, or what I might try?
Edit 1:
I did an docker inspect <Kubectl's WSL container> to see if it held any clues:
[
{
"MountLabel": "",
"HostConfig": {
"Binds": [
"/mnt/c/windowsFolder/Database:/data",
...
],
},
"VolumeDriver": "",
"VolumesFrom": null,
"Isolation": ""
},
"Mounts": [
{
"Type": "bind",
"Source": "/mnt/c/windowsFolder/Database",
"Destination": "/data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
"Config": {
...
"Volumes": null,
...
}
}
]
Edit 2:
I noticed the folder has chmod of 755 instead of 777.
I fixed that by adding an initContainer and removing the security group, though it still did not help:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-database
labels:
app.kubernetes.io/name: my-deployment
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: label-identifier
template:
metadata:
labels:
app.kubernetes.io/name: label-identifier
spec:
hostname: "database"
containers:
- name: database
image: "mcr.microsoft.com/mssql/server:2019-latest"
imagePullPolicy: IfNotPresent
ports:
- containerPort: 1433
protocol: TCP
env:
- name: "ACCEPT_EULA"
value: "Y"
- name: "MSSQL_DATA_DIR"
value: /data
- name: "MSSQL_PID"
value: "Developer"
- name: "SA_PASSWORD"
value: "SuperSecret123!"
volumeMounts:
- name: "myvolume"
mountPath: /data
#this was added
initContainers:
- name: mssql-data-folder-permissions
image: "busybox:latest"
command: ["/bin/chmod","-R","777", "/data"]
volumeMounts:
- name: "myvolume"
mountPath: /data
volumes:
- name: "myvolume"
hostPath:
path: "/mnt/c/windowsFolder/Database"
Edit 3:
On request of @ovidiu-buligan:
kubectl get events -A gives the following output:
NAMESPACE LAST SEEN TYPE REASON OBJECT MESSAGE
default 2m15s Normal Scheduled pod/myProject-database-7c477d65b8-mmh7h Successfully assigned default/myProject-database-7c477d65b8-mmh7h to docker-desktop
default 2m16s Normal Pulling pod/myProject-database-7c477d65b8-mmh7h Pulling image "mcr.microsoft.com/mssql/server:2019-latest"
default 88s Normal Pulled pod/myProject-database-7c477d65b8-mmh7h Successfully pulled image "mcr.microsoft.com/mssql/server:2019-latest" in 47.2350549s
default 88s Normal Created pod/myProject-database-7c477d65b8-mmh7h Created container database
default 87s Normal Started pod/myProject-database-7c477d65b8-mmh7h Started container database
default 2m16s Normal SuccessfulCreate replicaset/myProject-database-7c477d65b8 Created pod: myProject-database-7c477d65b8-mmh7h
default 2m16s Normal ScalingReplicaSet deployment/myProject-database Scaled up replica set myProject-database-7c477d65b8 to 1
kubectl describe pod myProject-database-7c477d65b8-mmh7h gives the following output:
Name: myProject-database-7c477d65b8-mmh7h
Namespace: default
Priority: 0
Node: docker-desktop/192.168.65.4
Start Time: Tue, 06 Apr 2021 13:03:18 +0200
Labels: app.kubernetes.io/name=StatefulSet-database
pod-template-hash=7c477d65b8
Annotations: <none>
Status: Running
IP: 10.1.0.10
IPs:
IP: 10.1.0.10
Controlled By: ReplicaSet/myProject-database-7c477d65b8
Containers:
database:
Container ID: docker://f768710e7436d4c813913fa22a20091cb3fb77e1ecfbe2232b0ec6037eef3dbb
Image: mcr.microsoft.com/mssql/server:2019-latest
Image ID: docker-pullable://mcr.microsoft.com/mssql/server@sha256:ec5492b0b3f9c0707fddd37f0bd3d47d3ebea94a3054afb8b50e9e746d1e5f37
Port: 1433/TCP
Host Port: 0/TCP
State: Running
Started: Tue, 06 Apr 2021 13:04:07 +0200
Ready: True
Restart Count: 0
Environment:
ACCEPT_EULA: Y
MSSQL_DATA_DIR: /data
MSSQL_LOG_DIR: /log
MSSQL_PID: Developer
SA_PASSWORD: SuperSecret123!
Mounts:
/data from storage-volume-claim (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-gcd5j (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
storage-volume-claim:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: database-pvc
ReadOnly: false
default-token-gcd5j:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-gcd5j
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 3m6s default-scheduler Successfully assigned default/myProject-database-7c477d65b8-mmh7h to docker-desktop
Normal Pulling 3m6s kubelet Pulling image "mcr.microsoft.com/mssql/server:2019-latest"
Normal Pulled 2m18s kubelet Successfully pulled image "mcr.microsoft.com/mssql/server:2019-latest" in 47.2350549s
Normal Created 2m18s kubelet Created container database
Normal Started 2m17s kubelet Started container database