ConfigMap mounted on Persistent Volume Claims

4/17/2020

In my deployment, I would like to use a Persistent Volume Claim in combination with a config map mount. For example, I'd like the following:

volumeMounts:
    - name: py-js-storage
        mountPath: /home/python
    - name: my-config
        mountPath: /home/python/my-config.properties
        subPath: my-config.properties
        readOnly: true
...
    volumes:
    - name: py-storage
    {{- if .Values.py.persistence.enabled }}
        persistentVolumeClaim:
        claimName: python-storage
    {{- else }}
        emptyDir: {}
    {{- end }}

Is this a possible and viable way to go? Is there any better way to approach such situation?

-- LoreV
containers
helmfile
kubernetes
kubernetes-helm

2 Answers

4/17/2020

Since you didn't give your use case, my answer will be based on if it is possible or not. In fact: Yes, it is.

I'm supposing you wish mount file from a configMap in a mount point that already contains other files, and your approach to use subPath is correct!

When you need to mount different volumes on the same path, you need specify subPath or the content of the original dir will be hidden.

In other words, if you want to keep both files (from the mount point and from configMap) you must use subPath.

To illustrate this, I've tested with the deployment code below. There I mount the hostPath /mnt that contains a file called filesystem-file.txt in my pod and the file /mnt/configmap-file.txt from my configmap test-pd-plus-cfgmap:

Note: I'm using Kubernetes 1.18.1

Configmap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-pd-plus-cfgmap
data:
  file-from-cfgmap: file data

Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-pv
spec:
  replicas: 3
  selector:
    matchLabels:
      app: test-pv
  template:
    metadata:
      labels:
        app: test-pv
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - mountPath: /mnt
          name: task-pv-storage
        - mountPath: /mnt/configmap-file.txt
          subPath: configmap-file.txt
          name: task-cm-file
      volumes:
        - name: task-pv-storage
          persistentVolumeClaim:
            claimName: task-pv-claim
        - name: task-cm-file
          configMap:
            name: test-pd-plus-cfgmap

As a result of the deployment, you can see the follow content in /mnt of the pod:

$ kubectl exec test-pv-5bcb54bd46-q2xwm -- ls /mnt
configmap-file.txt
filesystem-file.txt

You could check this github issue with the same discussion.

Here you could read a little more about volumes subPath.

-- KoopaKiller
Source: StackOverflow

4/17/2020

You can go with the following approach.

In your deployment.yaml template file you can configure:

...
{{- if .Values.volumeMounts }}
        volumeMounts:
{{- range .Values.volumeMounts }}
        - name: {{ .name }}
          mountPath: {{ .mountPath }}
{{- end }}
{{- end }}
...
{{- if .Values.volumeMounts }}
      volumes:
{{- range .Values.volumeMounts }}
      - name: {{ .name }}
{{ toYaml .volumeSource | indent 8 }}
{{- end }}
{{- end }}

And your values.yaml file you can define any volume sources:

volumeMounts:
  - name: volume-mount-1
    mountPath: /var/data
    volumeSource:
      persistentVolumeClaim:
        claimName: pvc-name
  - name: volume-mount-2
    mountPath: /var/config
    volumeSource:
      configMap:
        name: config-map-name

In this way, you don't have to worry about the source of the volume. You can add any kind of sources in your values.yaml file and you want to need to update the deployment.yaml template

Hope this helps!

-- Kalpesh Chaudhari
Source: StackOverflow