diff options
| author | Michael Fraenkel <michael.fraenkel@gmail.com> | 2016-12-13 09:54:24 -0700 |
|---|---|---|
| committer | Paul Morie <pmorie@redhat.com> | 2016-12-13 11:54:24 -0500 |
| commit | f9fb575e7584fdb4769100e5f3a9b20ed9b441c6 (patch) | |
| tree | ca040a66b11d3836d20834ab024d02d6ecec80ae | |
| parent | cfd07fcf125b9ae4d1c85fad35d187694de8180c (diff) | |
Proposal: Configmaps populating environment variables (#148)
* Proposal: Configmaps populating environment variables
* Explain how conflicts are resolved
* kubectl create configmap enhancement
* Define the specific processing order, single --from-env-file
* Remove create configmap changes
To be done under a separate proposal.
* Update nits
| -rw-r--r-- | contributors/design-proposals/envvar-configmap.md | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/contributors/design-proposals/envvar-configmap.md b/contributors/design-proposals/envvar-configmap.md new file mode 100644 index 00000000..fe7f581c --- /dev/null +++ b/contributors/design-proposals/envvar-configmap.md @@ -0,0 +1,188 @@ +# ConfigMaps as environment variables + +## Goal + +Populating environment variables of a container from an entire ConfigMap. + +## Design Points + +A container can specify a set of existing ConfigMaps to populate environment variables. + +There needs to be an easy way to isolate the variables introduced by a given +ConfigMap. The contents of a ConfigMap may not be known in advance and it may +be generated by someone or something else. Services may provide binding +information via a ConfigMap. If you have a common service with multiple +instances like a Message Queue or Database, there needs to be a way to +uniquely identify and prevent collision when consuming multiple ConfigMaps in +a single container using this feature. + +## Proposed Design + +Containers can specify a set of sources that are consumed as environment +variables. One such source is a ConfigMap. +Each key defined in the ConfigMap's `Data` object must be a "C" identifier. If +an invalid key is present, the container will fail to start. + +Environment variables defined by a `Container` are processed in a specific +order. The processing order is as follows: + +1. All automatic service environment variables +1. All `EnvFrom` blocks in order +1. All `Env` blocks in order. + +The last value processed for any given environment variable will be the +decided winner. Variable references defined by an `EnvVar` struct will be +resolved by the current values defined even if the value is replaced later. + +To prevent collisions amongst multiple ConfigMaps, each defined ConfigMap can +have an optional associated prefix that is prepended to each key in the +ConfigMap. Prefixes must be a "C" identifier. + +### Kubectl updates + +The `describe` command will display the configmap name that have been defined as +part of the environment variable section including the optional prefix when +defined. + +### API Resource + +A new `EnvFromSource` type containing a `ConfigMapRef` will be added to the +`Container` struct. + +```go +// EnvFromSource represents the source of a set of ConfigMaps +type EnvFromSource struct { + // A string to place in front of every key. Must be a C_IDENTIFIER. + // +optional + Prefix string `json:"prefix,omitempty"` + // The ConfigMap to select from + ConfigMapRef *LocalObjectReference `json:"configMapRef,omitempty"` +} + +type Container struct { + // List of sources to populate environment variables in the container. + // The keys defined within a source must be a C_IDENTIFIER. An invalid key + // will prevent the container from starting. When a key exists in multiple + // sources, the value associated with the last source will take precedence. + // Values defined by an Env with a duplicate key will take precedence over + // any listed source. + // Cannot be updated. + // +optional + EnvFrom []EnvFromSource `json:"envFrom,omitempty"` +} +``` + +### Examples + +### Consuming `ConfigMap` as Environment Variables + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: etcd-env-config +data: + number_of_members: "1" + initial_cluster_state: new + initial_cluster_token: DUMMY_ETCD_INITIAL_CLUSTER_TOKEN + discovery_token: DUMMY_ETCD_DISCOVERY_TOKEN + discovery_url: http://etcd_discovery:2379 + etcdctl_peers: http://etcd:2379 + duplicate_key: FROM_CONFIG_MAP + REPLACE_ME: "a value" +``` + +This pod consumes the entire `ConfigMap` as environment variables: + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: config-env-example +spec: + containers: + - name: etcd + image: openshift/etcd-20-centos7 + ports: + - containerPort: 2379 + protocol: TCP + - containerPort: 2380 + protocol: TCP + env: + - Name: duplicate_key + Value: FROM_ENV + - Name: expansion + Value: $(REPLACE_ME) + envFrom: + - configMapRef: + name: etcd-env-config +``` + +The resulting environment variables will be: + +``` +number_of_members="1" +initial_cluster_state="new" +initial_cluster_token="DUMMY_ETCD_INITIAL_CLUSTER_TOKEN" +discovery_token="DUMMY_ETCD_DISCOVERY_TOKEN" +discovery_url="http://etcd_discovery:2379" +etcdctl_peers="http://etcd:2379" +duplicate_key="FROM_ENV" +expansion="a value" +REPLACE_ME="a value" +``` + +### Consuming multiple `ConfigMap` as Environment Variables + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: env-config +data: + key1: a + key2: b +``` + +This pod consumes the entire `ConfigMap` as environment variables: + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: config-env-example +spec: + containers: + - name: etcd + image: openshift/etcd-20-centos7 + ports: + - containerPort: 2379 + protocol: TCP + - containerPort: 2380 + protocol: TCP + envFrom: + - prefix: cm1_ + configMapRef: + name: env-config + - prefix: cm2_ + configMapRef: + name: env-config +``` + +The resulting environment variables will be: + +``` +cm1_key1="a" +cm1_key2="b" +cm2_key1="a" +cm2_key2="b" +``` + +### Future + +Add similar support for Secrets. + + +<!-- BEGIN MUNGE: GENERATED_ANALYTICS --> +[]() +<!-- END MUNGE: GENERATED_ANALYTICS --> |
