Change type of pod environment config map to NamespacedName (#870)
* allow PodEnvironmentConfigMap in other namespaces * update codegen * update docs and comments
This commit is contained in:
		
							parent
							
								
									9dfa433363
								
							
						
					
					
						commit
						ba9cf68650
					
				|  | @ -71,7 +71,7 @@ configKubernetes: | ||||||
|   enable_pod_disruption_budget: true |   enable_pod_disruption_budget: true | ||||||
|   # enables sidecar containers to run alongside Spilo in the same pod |   # enables sidecar containers to run alongside Spilo in the same pod | ||||||
|   enable_sidecars: true |   enable_sidecars: true | ||||||
|   # name of the secret containing infrastructure roles names and passwords |   # namespaced name of the secret containing infrastructure roles names and passwords | ||||||
|   # infrastructure_roles_secret_name: postgresql-infrastructure-roles |   # infrastructure_roles_secret_name: postgresql-infrastructure-roles | ||||||
| 
 | 
 | ||||||
|   # list of labels that can be inherited from the cluster manifest |   # list of labels that can be inherited from the cluster manifest | ||||||
|  | @ -86,15 +86,15 @@ configKubernetes: | ||||||
|   # node_readiness_label: |   # node_readiness_label: | ||||||
|   #   status: ready |   #   status: ready | ||||||
| 
 | 
 | ||||||
|   # name of the secret containing the OAuth2 token to pass to the teams API |   # namespaced name of the secret containing the OAuth2 token to pass to the teams API | ||||||
|   # oauth_token_secret_name: postgresql-operator |   # oauth_token_secret_name: postgresql-operator | ||||||
| 
 | 
 | ||||||
|   # defines the template for PDB (Pod Disruption Budget) names |   # defines the template for PDB (Pod Disruption Budget) names | ||||||
|   pdb_name_format: "postgres-{cluster}-pdb" |   pdb_name_format: "postgres-{cluster}-pdb" | ||||||
|   # override topology key for pod anti affinity |   # override topology key for pod anti affinity | ||||||
|   pod_antiaffinity_topology_key: "kubernetes.io/hostname" |   pod_antiaffinity_topology_key: "kubernetes.io/hostname" | ||||||
|   # name of the ConfigMap with environment variables to populate on every pod |   # namespaced name of the ConfigMap with environment variables to populate on every pod | ||||||
|   # pod_environment_configmap: "" |   # pod_environment_configmap: "default/my-custom-config" | ||||||
| 
 | 
 | ||||||
|   # specify the pod management policy of stateful sets of Postgres clusters |   # specify the pod management policy of stateful sets of Postgres clusters | ||||||
|   pod_management_policy: "ordered_ready" |   pod_management_policy: "ordered_ready" | ||||||
|  |  | ||||||
|  | @ -67,7 +67,7 @@ configKubernetes: | ||||||
|   enable_pod_disruption_budget: "true" |   enable_pod_disruption_budget: "true" | ||||||
|   # enables sidecar containers to run alongside Spilo in the same pod |   # enables sidecar containers to run alongside Spilo in the same pod | ||||||
|   enable_sidecars: "true" |   enable_sidecars: "true" | ||||||
|   # name of the secret containing infrastructure roles names and passwords |   # namespaced name of the secret containing infrastructure roles names and passwords | ||||||
|   # infrastructure_roles_secret_name: postgresql-infrastructure-roles |   # infrastructure_roles_secret_name: postgresql-infrastructure-roles | ||||||
| 
 | 
 | ||||||
|   # list of labels that can be inherited from the cluster manifest |   # list of labels that can be inherited from the cluster manifest | ||||||
|  | @ -79,15 +79,15 @@ configKubernetes: | ||||||
|   # set of labels that a running and active node should possess to be considered ready |   # set of labels that a running and active node should possess to be considered ready | ||||||
|   # node_readiness_label: "" |   # node_readiness_label: "" | ||||||
| 
 | 
 | ||||||
|   # name of the secret containing the OAuth2 token to pass to the teams API |   # namespaced name of the secret containing the OAuth2 token to pass to the teams API | ||||||
|   # oauth_token_secret_name: postgresql-operator |   # oauth_token_secret_name: postgresql-operator | ||||||
| 
 | 
 | ||||||
|   # defines the template for PDB (Pod Disruption Budget) names |   # defines the template for PDB (Pod Disruption Budget) names | ||||||
|   pdb_name_format: "postgres-{cluster}-pdb" |   pdb_name_format: "postgres-{cluster}-pdb" | ||||||
|   # override topology key for pod anti affinity |   # override topology key for pod anti affinity | ||||||
|   pod_antiaffinity_topology_key: "kubernetes.io/hostname" |   pod_antiaffinity_topology_key: "kubernetes.io/hostname" | ||||||
|   # name of the ConfigMap with environment variables to populate on every pod |   # namespaced name of the ConfigMap with environment variables to populate on every pod | ||||||
|   # pod_environment_configmap: "" |   # pod_environment_configmap: "default/my-custom-config" | ||||||
| 
 | 
 | ||||||
|   # specify the pod management policy of stateful sets of Postgres clusters |   # specify the pod management policy of stateful sets of Postgres clusters | ||||||
|   pod_management_policy: "ordered_ready" |   pod_management_policy: "ordered_ready" | ||||||
|  |  | ||||||
|  | @ -321,11 +321,12 @@ spec: | ||||||
| ## Custom Pod Environment Variables | ## Custom Pod Environment Variables | ||||||
| 
 | 
 | ||||||
| It is possible to configure a ConfigMap which is used by the Postgres pods as | It is possible to configure a ConfigMap which is used by the Postgres pods as | ||||||
| an additional provider for environment variables. | an additional provider for environment variables. One use case is to customize | ||||||
| 
 | the Spilo image and configure it with environment variables. The ConfigMap with | ||||||
| One use case is to customize the Spilo image and configure it with environment | the additional settings is referenced in the operator's main configuration. | ||||||
| variables. The ConfigMap with the additional settings is configured in the | A namespace can be specified along with the name. If left out, the configured | ||||||
| operator's main ConfigMap: | default namespace of your K8s client will be used and if the ConfigMap is not | ||||||
|  | found there, the Postgres cluster's namespace is taken when different: | ||||||
| 
 | 
 | ||||||
| **postgres-operator ConfigMap** | **postgres-operator ConfigMap** | ||||||
| 
 | 
 | ||||||
|  | @ -336,7 +337,7 @@ metadata: | ||||||
|   name: postgres-operator |   name: postgres-operator | ||||||
| data: | data: | ||||||
|   # referencing config map with custom settings |   # referencing config map with custom settings | ||||||
|   pod_environment_configmap: postgres-pod-config |   pod_environment_configmap: default/postgres-pod-config | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| **OperatorConfiguration** | **OperatorConfiguration** | ||||||
|  | @ -349,7 +350,7 @@ metadata: | ||||||
| configuration: | configuration: | ||||||
|   kubernetes: |   kubernetes: | ||||||
|     # referencing config map with custom settings |     # referencing config map with custom settings | ||||||
|     pod_environment_configmap: postgres-pod-config |     pod_environment_configmap: default/postgres-pod-config | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| **referenced ConfigMap `postgres-pod-config`** | **referenced ConfigMap `postgres-pod-config`** | ||||||
|  |  | ||||||
|  | @ -221,11 +221,12 @@ configuration they are grouped under the `kubernetes` key. | ||||||
|   to the Postgres clusters after creation. |   to the Postgres clusters after creation. | ||||||
| 
 | 
 | ||||||
| * **oauth_token_secret_name** | * **oauth_token_secret_name** | ||||||
|   a name of the secret containing the `OAuth2` token to pass to the teams API. |   namespaced name of the secret containing the `OAuth2` token to pass to the | ||||||
|   The default is `postgresql-operator`. |   teams API. The default is `postgresql-operator`. | ||||||
| 
 | 
 | ||||||
| * **infrastructure_roles_secret_name** | * **infrastructure_roles_secret_name** | ||||||
|   name of the secret containing infrastructure roles names and passwords. |   namespaced name of the secret containing infrastructure roles names and | ||||||
|  |   passwords. | ||||||
| 
 | 
 | ||||||
| * **pod_role_label** | * **pod_role_label** | ||||||
|   name of the label assigned to the Postgres pods (and services/endpoints) by |   name of the label assigned to the Postgres pods (and services/endpoints) by | ||||||
|  | @ -262,11 +263,11 @@ configuration they are grouped under the `kubernetes` key. | ||||||
|   for details on taints and tolerations. The default is empty. |   for details on taints and tolerations. The default is empty. | ||||||
| 
 | 
 | ||||||
| * **pod_environment_configmap** | * **pod_environment_configmap** | ||||||
|   a name of the ConfigMap with environment variables to populate on every pod. |   namespaced name of the ConfigMap with environment variables to populate on | ||||||
|   Right now this ConfigMap is searched in the namespace of the Postgres cluster. |   every pod. Right now this ConfigMap is searched in the namespace of the | ||||||
|   All variables from that ConfigMap are injected to the pod's environment, on |   Postgres cluster. All variables from that ConfigMap are injected to the pod's | ||||||
|   conflicts they are overridden by the environment variables generated by the |   environment, on conflicts they are overridden by the environment variables | ||||||
|   operator. The default is empty. |   generated by the operator. The default is empty. | ||||||
| 
 | 
 | ||||||
| * **pod_priority_class_name** | * **pod_priority_class_name** | ||||||
|   a name of the [priority class](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass) |   a name of the [priority class](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass) | ||||||
|  |  | ||||||
|  | @ -69,7 +69,7 @@ data: | ||||||
|   pdb_name_format: "postgres-{cluster}-pdb" |   pdb_name_format: "postgres-{cluster}-pdb" | ||||||
|   # pod_antiaffinity_topology_key: "kubernetes.io/hostname" |   # pod_antiaffinity_topology_key: "kubernetes.io/hostname" | ||||||
|   pod_deletion_wait_timeout: 10m |   pod_deletion_wait_timeout: 10m | ||||||
|   # pod_environment_configmap: "" |   # pod_environment_configmap: "default/my-custom-config" | ||||||
|   pod_label_wait_timeout: 10m |   pod_label_wait_timeout: 10m | ||||||
|   pod_management_policy: "ordered_ready" |   pod_management_policy: "ordered_ready" | ||||||
|   pod_role_label: spilo-role |   pod_role_label: spilo-role | ||||||
|  |  | ||||||
|  | @ -40,7 +40,7 @@ configuration: | ||||||
|     oauth_token_secret_name: postgresql-operator |     oauth_token_secret_name: postgresql-operator | ||||||
|     pdb_name_format: "postgres-{cluster}-pdb" |     pdb_name_format: "postgres-{cluster}-pdb" | ||||||
|     pod_antiaffinity_topology_key: "kubernetes.io/hostname" |     pod_antiaffinity_topology_key: "kubernetes.io/hostname" | ||||||
|     # pod_environment_configmap: "" |     # pod_environment_configmap: "default/my-custom-config" | ||||||
|     pod_management_policy: "ordered_ready" |     pod_management_policy: "ordered_ready" | ||||||
|     # pod_priority_class_name: "" |     # pod_priority_class_name: "" | ||||||
|     pod_role_label: spilo-role |     pod_role_label: spilo-role | ||||||
|  |  | ||||||
|  | @ -66,8 +66,7 @@ type KubernetesMetaConfiguration struct { | ||||||
| 	CustomPodAnnotations                   map[string]string     `json:"custom_pod_annotations,omitempty"` | 	CustomPodAnnotations                   map[string]string     `json:"custom_pod_annotations,omitempty"` | ||||||
| 	// TODO: use a proper toleration structure?
 | 	// TODO: use a proper toleration structure?
 | ||||||
| 	PodToleration              map[string]string   `json:"toleration,omitempty"` | 	PodToleration              map[string]string   `json:"toleration,omitempty"` | ||||||
| 	// TODO: use namespacedname
 | 	PodEnvironmentConfigMap    spec.NamespacedName `json:"pod_environment_configmap,omitempty"` | ||||||
| 	PodEnvironmentConfigMap    string   `json:"pod_environment_configmap,omitempty"` |  | ||||||
| 	PodPriorityClassName       string              `json:"pod_priority_class_name,omitempty"` | 	PodPriorityClassName       string              `json:"pod_priority_class_name,omitempty"` | ||||||
| 	MasterPodMoveTimeout       Duration            `json:"master_pod_move_timeout,omitempty"` | 	MasterPodMoveTimeout       Duration            `json:"master_pod_move_timeout,omitempty"` | ||||||
| 	EnablePodAntiAffinity      bool                `json:"enable_pod_antiaffinity,omitempty"` | 	EnablePodAntiAffinity      bool                `json:"enable_pod_antiaffinity,omitempty"` | ||||||
|  |  | ||||||
|  | @ -179,6 +179,7 @@ func (in *KubernetesMetaConfiguration) DeepCopyInto(out *KubernetesMetaConfigura | ||||||
| 			(*out)[key] = val | 			(*out)[key] = val | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	out.PodEnvironmentConfigMap = in.PodEnvironmentConfigMap | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -18,6 +18,7 @@ import ( | ||||||
| 
 | 
 | ||||||
| 	acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1" | 	acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1" | ||||||
| 	"github.com/zalando/postgres-operator/pkg/spec" | 	"github.com/zalando/postgres-operator/pkg/spec" | ||||||
|  | 	pkgspec "github.com/zalando/postgres-operator/pkg/spec" | ||||||
| 	"github.com/zalando/postgres-operator/pkg/util" | 	"github.com/zalando/postgres-operator/pkg/util" | ||||||
| 	"github.com/zalando/postgres-operator/pkg/util/config" | 	"github.com/zalando/postgres-operator/pkg/util/config" | ||||||
| 	"github.com/zalando/postgres-operator/pkg/util/constants" | 	"github.com/zalando/postgres-operator/pkg/util/constants" | ||||||
|  | @ -485,9 +486,9 @@ func generateSidecarContainers(sidecars []acidv1.Sidecar, | ||||||
| 
 | 
 | ||||||
| // Check whether or not we're requested to mount an shm volume,
 | // Check whether or not we're requested to mount an shm volume,
 | ||||||
| // taking into account that PostgreSQL manifest has precedence.
 | // taking into account that PostgreSQL manifest has precedence.
 | ||||||
| func mountShmVolumeNeeded(opConfig config.Config, pgSpec *acidv1.PostgresSpec) *bool { | func mountShmVolumeNeeded(opConfig config.Config, spec *acidv1.PostgresSpec) *bool { | ||||||
| 	if pgSpec.ShmVolume != nil && *pgSpec.ShmVolume { | 	if spec.ShmVolume != nil && *spec.ShmVolume { | ||||||
| 		return pgSpec.ShmVolume | 		return spec.ShmVolume | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return opConfig.ShmVolume | 	return opConfig.ShmVolume | ||||||
|  | @ -911,12 +912,18 @@ func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.Statef | ||||||
| 
 | 
 | ||||||
| 	customPodEnvVarsList := make([]v1.EnvVar, 0) | 	customPodEnvVarsList := make([]v1.EnvVar, 0) | ||||||
| 
 | 
 | ||||||
| 	if c.OpConfig.PodEnvironmentConfigMap != "" { | 	if c.OpConfig.PodEnvironmentConfigMap != (pkgspec.NamespacedName{}) { | ||||||
| 		var cm *v1.ConfigMap | 		var cm *v1.ConfigMap | ||||||
| 		cm, err = c.KubeClient.ConfigMaps(c.Namespace).Get(c.OpConfig.PodEnvironmentConfigMap, metav1.GetOptions{}) | 		cm, err = c.KubeClient.ConfigMaps(c.OpConfig.PodEnvironmentConfigMap.Namespace).Get(c.OpConfig.PodEnvironmentConfigMap.Name, metav1.GetOptions{}) | ||||||
|  | 		if err != nil { | ||||||
|  | 			// if not found, try again using the cluster's namespace if it's different (old behavior)
 | ||||||
|  | 			if k8sutil.ResourceNotFound(err) && c.Namespace != c.OpConfig.PodEnvironmentConfigMap.Namespace { | ||||||
|  | 				cm, err = c.KubeClient.ConfigMaps(c.Namespace).Get(c.OpConfig.PodEnvironmentConfigMap.Name, metav1.GetOptions{}) | ||||||
|  | 			} | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return nil, fmt.Errorf("could not read PodEnvironmentConfigMap: %v", err) | 				return nil, fmt.Errorf("could not read PodEnvironmentConfigMap: %v", err) | ||||||
| 			} | 			} | ||||||
|  | 		} | ||||||
| 		for k, v := range cm.Data { | 		for k, v := range cm.Data { | ||||||
| 			customPodEnvVarsList = append(customPodEnvVarsList, v1.EnvVar{Name: k, Value: v}) | 			customPodEnvVarsList = append(customPodEnvVarsList, v1.EnvVar{Name: k, Value: v}) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -42,7 +42,7 @@ type Resources struct { | ||||||
| 	DefaultMemoryLimit      string              `name:"default_memory_limit" default:"500Mi"` | 	DefaultMemoryLimit      string              `name:"default_memory_limit" default:"500Mi"` | ||||||
| 	MinCPULimit             string              `name:"min_cpu_limit" default:"250m"` | 	MinCPULimit             string              `name:"min_cpu_limit" default:"250m"` | ||||||
| 	MinMemoryLimit          string              `name:"min_memory_limit" default:"250Mi"` | 	MinMemoryLimit          string              `name:"min_memory_limit" default:"250Mi"` | ||||||
| 	PodEnvironmentConfigMap string            `name:"pod_environment_configmap" default:""` | 	PodEnvironmentConfigMap spec.NamespacedName `name:"pod_environment_configmap"` | ||||||
| 	NodeReadinessLabel      map[string]string   `name:"node_readiness_label" default:""` | 	NodeReadinessLabel      map[string]string   `name:"node_readiness_label" default:""` | ||||||
| 	MaxInstances            int32               `name:"max_instances" default:"-1"` | 	MaxInstances            int32               `name:"max_instances" default:"-1"` | ||||||
| 	MinInstances            int32               `name:"min_instances" default:"-1"` | 	MinInstances            int32               `name:"min_instances" default:"-1"` | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue