Kubernetes Persisent Volume

5/21/2020

Could anyone clarify on the Persistent Volume in Kubernetes?

In this below example, the /my-test-project is in the persistent volume.Then, why I need these mounts as technically my entire directory /my-test-project is persisted? How these mountpath and subpath would help if entire directory is persisted.Thanks!

volumeMounts:
    - name: empty-dir-volume
      mountPath: /my-test-project/data-cache
      subPath: data-cache
    - name: empty-dir-volume
      mountPath:  /my-test-project/user-cache
      subPath: user-cache

  volumes:
  - name: empty-dir-volume
    emptyDir: {}
-- testbg testbg
kubernetes
kubernetes-pod

1 Answer

5/21/2020

Your /my-test-project entire directory is not persisted.

  • mountPath or path in host /my-test-project/data-cache is persisted in empty-dir-volume in path data-cache

  • mountPath /my-test-project/user-cache is persisted in empty-dir-volume in path user-cache

Which mean when you create files inside /my-test-project/data-cache, it will be persisted in data-cache(subpath) inside emtpy-dir-volume. Similarly for user-cache. Whenever you create files inside /my-test-project/ it wont be persisted. Lets say you create /my-test-project/new-dir, now new-dir will not be persisted.

For better explaination, lets take the below example(two containers sharing the volume, but in different mounthPath):

apiVersion: v1
kind: Pod
metadata:
  name: share-empty-dir
spec:
  containers:
  - name: container-1
    image: alpine
    command:
      - "bin/sh"
      - "-c"
      - "sleep 10000"
    volumeMounts:
    - name: empty-dir-volume
      mountPath: /my-test-project/data-cache
      subPath: data-cache-subpath
    - name: empty-dir-volume
      mountPath:  /my-test-project/user-cache
      subPath: user-cache-subpath
  - name: container-2
    image: alpine
    command:
      - "bin/sh"
      - "-c"
      - "sleep 10000"
    volumeMounts:
      - name: empty-dir-volume
        mountPath: /tmp/container-2
  volumes:
  - name: empty-dir-volume
    emptyDir: {}

In container-1:

  • mountPath /my-test-project/user-cache is persisted in empty-dir-volume in path user-cache-subpath
  • mountPath /my-test-project/data-cache is persisted in empty-dir-volume in path data-cache-subpath

In container-2:

  • mountPath /tmp/container-2 is persisted in empty-dir-volume in path "" (which means "/")

Observations:

  • touch /my-test-project/user-cache/a.txt. we can see this file in container-2 at /tmp/container-2/user-cache-subpath/a.txt and reverse will work
  • touch /my-test-project/data-cache/b.txt. we can see this file in container-2 at /tmp/container-2/data-cache-subpath/a.txt and reverse will work
  • touch /tmp/container-2/new.txt, we can never this file in container-1 as the base path we are have specified subPaths in container-1
  • Play around similarly for even better understanding

Note: Just to be clear, you are using emptyDir type volume, which means whenever pod gets deleted, data will be lost. This type is used only to share the data between containers.

-- Dinesh Balasubramanian
Source: StackOverflow