Inject node labels into Kubernetes pod

I am looking to deploy services to a Kubernetes cluster running over multiple zones and would like to be able to inject the region/zone labels into my pods using environment variables.

I have looked into the downward API however this only seems to allow you to inject labels/metadata from the pod/service and not from the node you are running the pod on.

If there is no way to inject the node labels another solution I thought about was having the container query the kubernetes/AWS API to fetch this information however that would mean adding quite a lot of complexity to my containers.


Solution 1:

I thought about was having the container query the kubernetes/AWS API to fetch this information however that would mean adding quite a lot of complexity to my containers.

This is currently the recommended approach for getting information not available in the downward API. To avoid the additional complexity in your containers, you could use a "sidecar" with a variation on Tobias's solution. The sidecar would be an additional container in the pod, which connects to the kubernetes API, queries the information you're looking for (node labels), and writes the output to a shared volume. This could be implemented as an init container, or a sidecar that continuously syncs with the API.

Solution 2:

One option to achieve this is to store a custom file on each node that contains definitions of the environment variables that you want. Then you mount the folder containing the file into the container and source the file content as part of the startup of your container.

A similar approach for Kubernetes secrets is described here: https://github.com/kubernetes/kubernetes/blob/master/docs/design/secrets.md#deferral-consuming-secrets-as-environment-variables