proposal: Expose single annotations via downward API
Moved from kubernetes/kubernetes#36058 Ref kubernetes/kubernetes#31218
This commit is contained in:
parent
09ef55a496
commit
df27ea2fb0
|
@ -0,0 +1,67 @@
|
||||||
|
# Exposing annotations via environment downward API
|
||||||
|
|
||||||
|
Author: Michal Rostecki \<michal@kinvolk.io\>
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
### Use-case
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
The exact `fieldPath` to the annotation will have the following syntax:
|
||||||
|
|
||||||
|
```
|
||||||
|
metadata.annotations['annotationKey']
|
||||||
|
```
|
||||||
|
|
||||||
|
Which means that:
|
||||||
|
- the *annotationKey* will be specified inside brackets (`[`, `]`) and single quotation
|
||||||
|
marks (`'`)
|
||||||
|
- if the *annotationKey* contains `[`, `]` or `'` characters inside, they will need to
|
||||||
|
be escaped (like `\[`, `\]`, `\'`) and having these characters unescaped should result
|
||||||
|
in validation error
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
- `metadata.annotations['spec.pod.beta.kubernetes.io/statefulset-index']`
|
||||||
|
- `metadata.annotations['foo.bar/example-annotation']`
|
||||||
|
- `metadata.annotations['foo.bar/more\'complicated\]example\[with\'characters"to-escape']`
|
||||||
|
|
||||||
|
So, assuming that we would want to pass the `pod.beta.kubernetes.io/statefulset-index`
|
||||||
|
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']
|
||||||
|
```
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
In general, this environment downward API part will be implemented in the same
|
||||||
|
place as the other metadata - as a label conversion function.
|
||||||
|
|
||||||
|
<!-- BEGIN MUNGE: GENERATED_ANALYTICS -->
|
||||||
|
[]()
|
||||||
|
<!-- END MUNGE: GENERATED_ANALYTICS -->
|
Loading…
Reference in New Issue