From 257e0fc0a959f7e395e08136c92aabd63a5c3f31 Mon Sep 17 00:00:00 2001 From: Georg Kunz Date: Mon, 30 Oct 2017 17:41:32 +0100 Subject: [PATCH] Allow custom Postgres pod environment variables --- README.md | 32 ++++++++++++++++++++++++++++++++ pkg/cluster/k8sres.go | 8 ++++++++ pkg/util/config/config.go | 1 + 3 files changed, 41 insertions(+) diff --git a/README.md b/README.md index eeea5e790..544f4d8a7 100644 --- a/README.md +++ b/README.md @@ -136,6 +136,38 @@ spec: Please be ware that the taint and toleration only ensures that no other pod gets scheduled to the "postgres" node but not that Postgres pods are placed on such a node. This can be achieved by setting a node affinity rule in the ConfigMap. +#### Custom Pod Environment Variables + +It is possible to configure a config map which is used by the Postgres pods as an additional provider for environment variables. + +One use case is to customize the Spilo image and configure it with environment variables. The config map with the additional settings is configured in the operator's main config map: + +**postgres-operator ConfigMap** + +``` +apiVersion: v1 +kind: ConfigMap +metadata: + name: postgres-operator +data: + # referencing config map with custom settings + pod_environment_configmap: postgres-pod-config + ... +``` + +**referenced ConfigMap `postgres-pod-config`** + +``` +apiVersion: v1 +kind: ConfigMap +metadata: + name: postgres-pod-config + namespace: default +data: + MY_CUSTOM_VAR: value +``` + +This ConfigMap is then added as a source of environment variables to the Postgres StatefulSet/pods. # Setup development environment diff --git a/pkg/cluster/k8sres.go b/pkg/cluster/k8sres.go index d0337c64b..0ef31e26d 100644 --- a/pkg/cluster/k8sres.go +++ b/pkg/cluster/k8sres.go @@ -361,6 +361,13 @@ func (c *Cluster) generatePodTemplate(resourceRequirements *v1.ResourceRequireme if cloneDescription.ClusterName != "" { envVars = append(envVars, c.generateCloneEnvironment(cloneDescription)...) } + + envFromSource := []v1.EnvFromSource{} + if c.OpConfig.PodEnvironmentConfigMap != "" { + configMapRef := v1.ConfigMapEnvSource{LocalObjectReference: v1.LocalObjectReference{Name: c.OpConfig.PodEnvironmentConfigMap}} + envFromSource = append(envFromSource, v1.EnvFromSource{ConfigMapRef: &configMapRef}) + } + privilegedMode := true container := v1.Container{ Name: c.containerName(), @@ -388,6 +395,7 @@ func (c *Cluster) generatePodTemplate(resourceRequirements *v1.ResourceRequireme }, }, Env: envVars, + EnvFrom: envFromSource, SecurityContext: &v1.SecurityContext{ Privileged: &privilegedMode, }, diff --git a/pkg/util/config/config.go b/pkg/util/config/config.go index caf617aea..1e0af1324 100644 --- a/pkg/util/config/config.go +++ b/pkg/util/config/config.go @@ -31,6 +31,7 @@ type Resources struct { DefaultCPULimit string `name:"default_cpu_limit" default:"3"` DefaultMemoryLimit string `name:"default_memory_limit" default:"1Gi"` EOLNodeLabel map[string]string `name:"eol_node_label" default:"eol:true"` + PodEnvironmentConfigMap string `name:"pod_environment_configmap" default:""` } // Auth describes authentication specific configuration parameters