How to read an arg from a volume in a kubernetes deployment?

57 Views Asked by At

I want to create a statefulset that runs an image that creates devices. I want each pod to create unique devices, so the first will do 1-20, and second 21-40 etc. The image takes in a flag that indicates what index to start at. I am struggling to implement this so that the flag is unique for each pod in the statefulset.

I tried to use an init container that creates a file on a volume, and puts the pod number on that file. this worked as expected. I can access this file from the main container as well. How do i pass the value in this file as an arg for my container? I have tried to directly access it in the args section as well as create an environment variable but neither work. Ideally something like this would work but does not:

env:
  - name: index 
    value: "cat ./pod/pod.toml"
args: ["--start-index","$(index)"]
1

There are 1 best solutions below

0
larsks On BEST ANSWER

You can expose the pod name as an environment variable via the downward api:

env:
  - name: PODNAME
    valueFrom:
      fieldRef:
        fieldPath: metadata.name

You can use this variable to calculate the index in a shell script, and then launch your service with the appropriate argument:

command:
- sh
- -c
- |
  podnumber=$(echo $PODNAME | cut -f2 -d-)
  startindex=$(( podnumber * 20 + 1 ))
  exec myserver --start-index $index

Pod 0 will run with --start-index 1, pod 1 will run with --start-index 21, etc.

Note that this does require overriding the ENTRYPOINT in your image (by setting command in the manifest) because you need to perform the calculations in a shell script. Whether this is easy or complex depends on the image that you're using and whether or not it has an extensive existing ENTRYPOINT script.