Kubernetes - Generate files on all the pods

2/5/2020

I have Java API which exports the data to an excel and generates a file on the POD where the request is served. Now the next request (to download the file) might go to a different POD and the download fails.

How do I get around this? How do I generate files on all the POD? Or how do I make sure the subsequent request goes to the same POD where file was generated? I cant give the direct POD URL as it will not be accessible to clients.

Thanks.

-- Nishith Shah
kubernetes

1 Answer

2/6/2020

You need to use a persistent volumes to share the same files between your containers. You could use the node storage mounted on containers (easiest way) or other distributed file system like NFS, EFS (AWS), GlusterFS etc...

If you you need a simplest to share the file and your pods are in the same node, you could use hostpath to store the file and share the volume with other containers.

Assuming you have a kubernetes cluster that has only one Node, and you want to share the path /mtn/data of your node with your pods:

Create a PersistentVolume:

A hostPath PersistentVolume uses a file or directory on the Node to emulate network-attached storage.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

Create a PersistentVolumeClaim:

Pods use PersistentVolumeClaims to request physical storage

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

Look at the PersistentVolumeClaim:

kubectl get pvc task-pv-claim

The output shows that the PersistentVolumeClaim is bound to your PersistentVolume, task-pv-volume.

NAME            STATUS    VOLUME           CAPACITY   ACCESSMODES   STORAGECLASS   AGE
task-pv-claim   Bound     task-pv-volume   10Gi       RWO           manual         30s

Create a deployment with 2 replicas for example:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
        - name: task-pv-storage
          persistentVolumeClaim:
            claimName: task-pv-claim
      containers:
        - name: task-pv-container
          image: nginx
          ports:
            - containerPort: 80
              name: "http-server"
          volumeMounts:
            - mountPath: "/mnt/data"
              name: task-pv-storage

Now you can check inside both container the path /mnt/data has the same files.

If you have cluster with more than 1 node I recommend you to think about the other types of persistent volumes.

References: Configure persistent volumes Persistent volumes Volume Types

-- KoopaKiller
Source: StackOverflow