Author: Michal Rostecki <email@example.com>
Annotations of the pod can be taken through the Kubernetes API, but currently there is no way to pass them to the application inside the container. This means that annotations can be used by the core Kubernetes services and the user outside of the Kubernetes cluster.
Of course using Kubernetes API from the application running inside the container managed by Kubernetes is technically possible, but that’s an idea which denies the principles of microservices architecture.
The purpose of the proposal is to allow to pass the annotation as the environment variable to the container.
The primary usecase for this proposal are StatefulSets. There is an idea to expose StatefulSet index to the applications running inside the pods managed by StatefulSet. Since StatefulSet creates pods as the API objects, passing this index as an annotation seems to be a valid way to do this. However, to finally pass this information to the containerized application, we need to pass this annotation. That’s why the downward API for annotations is needed here.
fieldPath to the annotation will have the following syntax:
Which means that:
- the annotationKey will be specified inside brackets (
]) and single quotation
- if the annotationKey contains
' characters inside, they will need to
be escaped (like
\') and having these characters unescaped should result
in validation error
So, assuming that we would want to pass the
annotation as a
STATEFULSET_INDEX variable, the environment variable definition
will look like:
env: - name: STATEFULSET_INDEX valueFrom: fieldRef: fieldPath: metadata.annotations['spec.pod.beta.kubernetes.io/statefulset-index']
In general, this environment downward API part will be implemented in the same place as the other metadata - as a label conversion function.