Search code examples
kuberneteskubernetes-podfabric8fabric8-maven-plugin

dynamically or programmatically unmount / detach a persistent volum claim from a kubernetes pod and assign (mount /attach ) it to another pod


I have a pod called mypod0 with two persistent volumes.

mypd0, mypd1 (provided through two persistent volume claims myclaim0, myclaim1) mounted into mypod0 at /dir0, /dir1 as shown in the pod definition below.

apiVersion: v1
kind: Pod
metadata:
  name: mypod0
spec:
  containers:
    - name: mycontainer
      image: myimage
      volumeMounts:
      - mountPath: "/dir0"
        name: mypd
-   mountPath: "/dir1"
-   name: mypd1
  volumes:
    - name: mypd0
      persistentVolumeClaim:
        claimName: myclaim0
    - name: mypd1
      persistentVolumeClaim:
        claimName: myclaim1

Now I also have another pod mypod1 already running in the cluster. Is there a way to dynamically/programmatically (using fabric8, Kubernetes-client) to unmount (detach) mypd1 from mypod0, and then attach the volume mypd1 into mypod1 (without restarting any of the pods mypod0, mypod1). Any hint will be appreciated.


Solution

  • As Jonas mentioned in the comment, this action is not possible:

    Nope, this is not possible. Pod-manifests is intended to be seen as immutable and pods as disposable resources.

    Look at the definition of pods:

    Pods are the smallest deployable units of computing that you can create and manage in Kubernetes.

    A Pod (as in a pod of whales or pea pod) is a group of one or more containers, with shared storage and network resources, and a specification for how to run the containers. A Pod's contents are always co-located and co-scheduled, and run in a shared context. A Pod models an application-specific "logical host": it contains one or more application containers which are relatively tightly coupled. In non-cloud contexts, applications executed on the same physical or virtual machine are analogous to cloud applications executed on the same logical host.

    However, you can dynamically create new storage volumes. Kubernetes supports Dynamic Volume Provisioning:

    Dynamic volume provisioning allows storage volumes to be created on-demand. Without dynamic provisioning, cluster administrators have to manually make calls to their cloud or storage provider to create new storage volumes, and then create PersistentVolume objects to represent them in Kubernetes. The dynamic provisioning feature eliminates the need for cluster administrators to pre-provision storage. Instead, it automatically provisions storage when it is requested by users.