Replication Controller replica ID in an environment variable?

9/18/2018

I'm attempting to inject a ReplicationController's randomly generated pod ID extension (i.e. multiverse-{replicaID}) into a container's environment variables. I could manually get the hostname and extract it from there, but I'd prefer if I didn't have to add the special case into the script running inside the container, due to compatibility reasons.

If a pod is named multiverse-nffj1, INSTANCE_ID should equal nffj1. I've scoured the docs and found nothing.

apiVersion: v1
kind: ReplicationController
metadata:
  name: multiverse
spec:
  replicas: 3
  template:
    spec:
      containers:
      - env:
        - name: INSTANCE_ID
          value: $(replicaID)

I've tried adding a command into the controller's template configuration to create the environment variable from the hostname, but couldn't figure out how to make that environment variable available to the running script.

Is there a variable I'm missing, or does this feature not exist? If it doesn't, does anyone have any ideas on how to make this to work without editing the script inside of the container?

-- Stumblinbear
kubernetes

1 Answer

9/19/2018

There is an answer provided by Anton Kostenko about inserting DB credentials into container environment variables, but it could be applied to your case also. It is all about the content of the InitContainer spec.

You can use InitContainer to get the hash from the container’s hostname and put it to the file on the shared volume that you mount to the container.

In this example InitContainer put the Pod name into the INSTANCE_ID environment variable, but you can modify it according to your needs:

Create the init.yaml file with the content:

apiVersion: v1
kind: Pod
metadata:
  name: init-test
spec:
  containers:
  - name: init-test
    image: ubuntu
    args: [bash, -c, 'source /data/config && echo $INSTANCE_ID && while true ; do sleep 1000; done ']
    volumeMounts:
    - name: config-data
      mountPath: /data
  initContainers:
  - name: init-init 
    image: busybox
    command: ["sh","-c","echo -n INSTANCE_ID=$(hostname) > /data/config"]
    volumeMounts:
    - name: config-data
      mountPath: /data
  volumes:
  - name: config-data
    emptyDir: {}

Create the pod using following command:

kubectl create -f init.yaml

Check if Pod initialization is done and is Running:

kubectl get pod init-test

Check the logs to see the results of this example configuration:

$ kubectl logs init-test
init-test
-- VAS
Source: StackOverflow