Kubernetes: how to set VolumeMount user group and file permissions
Solution 1:
The Pod Security Context supports setting an fsGroup
, which allows you to set the group ID that owns the volume, and thus who can write to it. The example in the docs:
apiVersion: v1
kind: Pod
metadata:
name: hello-world
spec:
containers:
# specification of the pod's containers
# ...
securityContext:
fsGroup: 1234
More info on this is here
Solution 2:
I ended up with an initContainer
with the same volumeMount
as the main container to set proper permissions, in my case, for a custom Grafana image.
This is necessary when a container in a pod is running as a user other than root
and needs write permissions on a mounted volume.
initContainers:
- name: take-data-dir-ownership
image: alpine:3
# Give `grafana` user (id 472) permissions a mounted volume
# https://github.com/grafana/grafana-docker/blob/master/Dockerfile
command:
- chown
- -R
- 472:472
- /var/lib/grafana
volumeMounts:
- name: data
mountPath: /var/lib/grafana
- https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
Solution 3:
This came as one of the challenges for the Kubernetes Deployments/StatefulSets, when you have to run process inside a container as non-root user. But, when you mount a volume to a pod, it always gets mounted with the permission of root:root
.
So, the non-root user must have access to the folder where it wants to read and write data.
Please follow the below steps for the same.
- Create user group and assign group ID in Dockerfile.
- Create user with user ID and add to the group in Dockerfile.
- change ownership recursively for the folders the user process wants to read/write.
-
Add the below lines in Deployment/StatefulSet in pod
spec
context.spec: securityContext: runAsUser: 1099 runAsGroup: 1099 fsGroup: 1099
runAsUser
Specifies that for any Containers in the Pod, all processes run with user ID 1099.
runAsGroup
Specifies the primary group ID of 1099 for all processes within any containers of the Pod.
If this field is omitted, the primary group ID of the containers will be root(0)
.
Any files created will also be owned by user 1099 and group 1099 when runAsGroup
is specified.
fsGroup
Specifies the owner of any volume attached will be owner by group ID 1099.
Any files created under it will be having permission of nonrootgroup:nonrootgroup
.