Merge 115e0f4821 into 6fbf962b1c
This commit is contained in:
commit
14ec0fbcd7
|
|
@ -114,6 +114,8 @@ spec:
|
||||||
format: int32
|
format: int32
|
||||||
minimum: 1
|
minimum: 1
|
||||||
type: integer
|
type: integer
|
||||||
|
connection_pooler_priority_class_name:
|
||||||
|
type: string
|
||||||
connection_pooler_schema:
|
connection_pooler_schema:
|
||||||
default: pooler
|
default: pooler
|
||||||
type: string
|
type: string
|
||||||
|
|
|
||||||
|
|
@ -168,6 +168,8 @@ spec:
|
||||||
format: int32
|
format: int32
|
||||||
minimum: 1
|
minimum: 1
|
||||||
type: integer
|
type: integer
|
||||||
|
priorityClassName:
|
||||||
|
type: string
|
||||||
resources:
|
resources:
|
||||||
description: Resources describes requests and limits for the cluster
|
description: Resources describes requests and limits for the cluster
|
||||||
resouces.
|
resouces.
|
||||||
|
|
|
||||||
|
|
@ -470,6 +470,8 @@ configConnectionPooler:
|
||||||
connection_pooler_mode: "transaction"
|
connection_pooler_mode: "transaction"
|
||||||
# number of pooler instances
|
# number of pooler instances
|
||||||
connection_pooler_number_of_instances: 2
|
connection_pooler_number_of_instances: 2
|
||||||
|
# priorityClassName to assign to pooler pods
|
||||||
|
# connection_pooler_priority_class_name: ""
|
||||||
# default resources
|
# default resources
|
||||||
connection_pooler_default_cpu_request: 500m
|
connection_pooler_default_cpu_request: 500m
|
||||||
connection_pooler_default_memory_request: 100Mi
|
connection_pooler_default_memory_request: 100Mi
|
||||||
|
|
|
||||||
|
|
@ -656,6 +656,14 @@ for both master and replica pooler services (if `enableReplicaConnectionPooler`
|
||||||
* **mode**
|
* **mode**
|
||||||
In which mode to run connection pooler, transaction or session.
|
In which mode to run connection pooler, transaction or session.
|
||||||
|
|
||||||
|
* **priorityClassName**
|
||||||
|
a name of the [priority
|
||||||
|
class](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass)
|
||||||
|
that should be assigned to the connection pooler pods. When not specified, the
|
||||||
|
value is taken from the `connection_pooler_priority_class_name` operator
|
||||||
|
parameter, if not set then the default priority class is taken. The priority
|
||||||
|
class itself must be defined in advance. Optional.
|
||||||
|
|
||||||
* **resources**
|
* **resources**
|
||||||
Resource configuration for connection pooler deployment.
|
Resource configuration for connection pooler deployment.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1102,6 +1102,12 @@ operator being able to provide some reasonable defaults.
|
||||||
* **connection_pooler_mode**
|
* **connection_pooler_mode**
|
||||||
Default pooler mode, `session` or `transaction`. Default is `transaction`.
|
Default pooler mode, `session` or `transaction`. Default is `transaction`.
|
||||||
|
|
||||||
|
* **connection_pooler_priority_class_name**
|
||||||
|
The name of the priority class to assign to connection pooler pods by default.
|
||||||
|
A cluster can override this with `connectionPooler.priorityClassName`. When
|
||||||
|
unset, the pooler pods use no priority class. The empty string signifies no
|
||||||
|
assignment.
|
||||||
|
|
||||||
* **connection_pooler_default_cpu_request**
|
* **connection_pooler_default_cpu_request**
|
||||||
**connection_pooler_default_memory_reques**
|
**connection_pooler_default_memory_reques**
|
||||||
**connection_pooler_default_cpu_limit**
|
**connection_pooler_default_cpu_limit**
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ data:
|
||||||
connection_pooler_max_db_connections: "60"
|
connection_pooler_max_db_connections: "60"
|
||||||
connection_pooler_mode: "transaction"
|
connection_pooler_mode: "transaction"
|
||||||
connection_pooler_number_of_instances: "2"
|
connection_pooler_number_of_instances: "2"
|
||||||
|
# connection_pooler_priority_class_name: ""
|
||||||
connection_pooler_schema: "pooler"
|
connection_pooler_schema: "pooler"
|
||||||
connection_pooler_user: "pooler"
|
connection_pooler_user: "pooler"
|
||||||
crd_categories: "all"
|
crd_categories: "all"
|
||||||
|
|
|
||||||
|
|
@ -114,6 +114,8 @@ spec:
|
||||||
format: int32
|
format: int32
|
||||||
minimum: 1
|
minimum: 1
|
||||||
type: integer
|
type: integer
|
||||||
|
connection_pooler_priority_class_name:
|
||||||
|
type: string
|
||||||
connection_pooler_schema:
|
connection_pooler_schema:
|
||||||
default: pooler
|
default: pooler
|
||||||
type: string
|
type: string
|
||||||
|
|
|
||||||
|
|
@ -231,6 +231,7 @@ configuration:
|
||||||
# connection_pooler_max_db_connections: 60
|
# connection_pooler_max_db_connections: 60
|
||||||
connection_pooler_mode: "transaction"
|
connection_pooler_mode: "transaction"
|
||||||
connection_pooler_number_of_instances: 2
|
connection_pooler_number_of_instances: 2
|
||||||
|
# connection_pooler_priority_class_name: ""
|
||||||
# connection_pooler_schema: "pooler"
|
# connection_pooler_schema: "pooler"
|
||||||
# connection_pooler_user: "pooler"
|
# connection_pooler_user: "pooler"
|
||||||
patroni:
|
patroni:
|
||||||
|
|
|
||||||
|
|
@ -168,6 +168,8 @@ spec:
|
||||||
format: int32
|
format: int32
|
||||||
minimum: 1
|
minimum: 1
|
||||||
type: integer
|
type: integer
|
||||||
|
priorityClassName:
|
||||||
|
type: string
|
||||||
resources:
|
resources:
|
||||||
description: Resources describes requests and limits for the cluster
|
description: Resources describes requests and limits for the cluster
|
||||||
resouces.
|
resouces.
|
||||||
|
|
|
||||||
|
|
@ -345,6 +345,7 @@ type ConnectionPoolerConfiguration struct {
|
||||||
DefaultCPULimit string `json:"connection_pooler_default_cpu_limit,omitempty"`
|
DefaultCPULimit string `json:"connection_pooler_default_cpu_limit,omitempty"`
|
||||||
// +kubebuilder:validation:Pattern=`^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$`
|
// +kubebuilder:validation:Pattern=`^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$`
|
||||||
DefaultMemoryLimit string `json:"connection_pooler_default_memory_limit,omitempty"`
|
DefaultMemoryLimit string `json:"connection_pooler_default_memory_limit,omitempty"`
|
||||||
|
PriorityClassName string `json:"connection_pooler_priority_class_name,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// OperatorLogicalBackupConfiguration defines configuration for logical backup
|
// OperatorLogicalBackupConfiguration defines configuration for logical backup
|
||||||
|
|
|
||||||
|
|
@ -114,6 +114,8 @@ spec:
|
||||||
format: int32
|
format: int32
|
||||||
minimum: 1
|
minimum: 1
|
||||||
type: integer
|
type: integer
|
||||||
|
connection_pooler_priority_class_name:
|
||||||
|
type: string
|
||||||
connection_pooler_schema:
|
connection_pooler_schema:
|
||||||
default: pooler
|
default: pooler
|
||||||
type: string
|
type: string
|
||||||
|
|
|
||||||
|
|
@ -168,6 +168,8 @@ spec:
|
||||||
format: int32
|
format: int32
|
||||||
minimum: 1
|
minimum: 1
|
||||||
type: integer
|
type: integer
|
||||||
|
priorityClassName:
|
||||||
|
type: string
|
||||||
resources:
|
resources:
|
||||||
description: Resources describes requests and limits for the cluster
|
description: Resources describes requests and limits for the cluster
|
||||||
resouces.
|
resouces.
|
||||||
|
|
|
||||||
|
|
@ -327,9 +327,10 @@ type ConnectionPooler struct {
|
||||||
Schema string `json:"schema,omitempty"`
|
Schema string `json:"schema,omitempty"`
|
||||||
User string `json:"user,omitempty"`
|
User string `json:"user,omitempty"`
|
||||||
// +kubebuilder:validation:Enum=session;transaction
|
// +kubebuilder:validation:Enum=session;transaction
|
||||||
Mode string `json:"mode,omitempty"`
|
Mode string `json:"mode,omitempty"`
|
||||||
DockerImage string `json:"dockerImage,omitempty"`
|
DockerImage string `json:"dockerImage,omitempty"`
|
||||||
MaxDBConnections *int32 `json:"maxDBConnections,omitempty"`
|
MaxDBConnections *int32 `json:"maxDBConnections,omitempty"`
|
||||||
|
PriorityClassName string `json:"priorityClassName,omitempty"`
|
||||||
|
|
||||||
*Resources `json:"resources,omitempty"`
|
*Resources `json:"resources,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -471,6 +471,9 @@ func (c *Cluster) generateConnectionPoolerPodTemplate(role PostgresRole) (
|
||||||
Volumes: poolerVolumes,
|
Volumes: poolerVolumes,
|
||||||
SecurityContext: &securityContext,
|
SecurityContext: &securityContext,
|
||||||
ServiceAccountName: c.OpConfig.PodServiceAccountName,
|
ServiceAccountName: c.OpConfig.PodServiceAccountName,
|
||||||
|
PriorityClassName: util.Coalesce(
|
||||||
|
connectionPoolerSpec.PriorityClassName,
|
||||||
|
c.OpConfig.ConnectionPooler.PriorityClassName),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -893,6 +896,16 @@ func (c *Cluster) needSyncConnectionPoolerDefaults(Config *Config, spec *acidv1.
|
||||||
reasons = append(reasons, msg)
|
reasons = append(reasons, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if spec.PriorityClassName == "" {
|
||||||
|
expectedPriorityClassName := config.PriorityClassName
|
||||||
|
if podTemplate.Spec.PriorityClassName != expectedPriorityClassName {
|
||||||
|
sync = true
|
||||||
|
msg := fmt.Sprintf("priorityClassName is different (having %s, required %s)",
|
||||||
|
podTemplate.Spec.PriorityClassName, expectedPriorityClassName)
|
||||||
|
reasons = append(reasons, msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
expectedResources, err := c.generateResourceRequirements(spec.Resources,
|
expectedResources, err := c.generateResourceRequirements(spec.Resources,
|
||||||
makeDefaultConnectionPoolerResources(&Config.OpConfig),
|
makeDefaultConnectionPoolerResources(&Config.OpConfig),
|
||||||
connectionPoolerContainer)
|
connectionPoolerContainer)
|
||||||
|
|
|
||||||
|
|
@ -871,6 +871,72 @@ func TestConnectionPoolerDeploymentSpec(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestConnectionPoolerPriorityClassName(t *testing.T) {
|
||||||
|
newCluster := func(specPooler, opPooler, specPod, opPod string) *Cluster {
|
||||||
|
c := New(
|
||||||
|
Config{
|
||||||
|
OpConfig: config.Config{
|
||||||
|
Resources: config.Resources{
|
||||||
|
PodPriorityClassName: opPod,
|
||||||
|
},
|
||||||
|
ConnectionPooler: config.ConnectionPooler{
|
||||||
|
PriorityClassName: opPooler,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, k8sutil.KubernetesClient{}, acidv1.Postgresql{}, logger, eventRecorder)
|
||||||
|
c.Spec = acidv1.PostgresSpec{
|
||||||
|
PodPriorityClassName: specPod,
|
||||||
|
ConnectionPooler: &acidv1.ConnectionPooler{PriorityClassName: specPooler},
|
||||||
|
}
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
subTest string
|
||||||
|
cluster *Cluster
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
subTest: "pooler spec wins over everything",
|
||||||
|
cluster: newCluster("pooler-spec", "pooler-op", "pod-spec", "pod-op"),
|
||||||
|
expected: "pooler-spec",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
subTest: "pooler operator default when spec empty",
|
||||||
|
cluster: newCluster("", "pooler-op", "pod-spec", "pod-op"),
|
||||||
|
expected: "pooler-op",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
subTest: "does not inherit cluster pod priority class",
|
||||||
|
cluster: newCluster("", "", "pod-spec", "pod-op"),
|
||||||
|
expected: "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
subTest: "does not inherit operator pod priority class",
|
||||||
|
cluster: newCluster("", "", "", "pod-op"),
|
||||||
|
expected: "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
subTest: "empty when nothing set",
|
||||||
|
cluster: newCluster("", "", "", ""),
|
||||||
|
expected: "",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, role := range [2]PostgresRole{Master, Replica} {
|
||||||
|
for _, tt := range tests {
|
||||||
|
podSpec, err := tt.cluster.generateConnectionPoolerPodTemplate(role)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("%s [%s]: unexpected error %v", role, tt.subTest, err)
|
||||||
|
}
|
||||||
|
if podSpec.Spec.PriorityClassName != tt.expected {
|
||||||
|
t.Errorf("%s [%s]: got priorityClassName %q, expected %q",
|
||||||
|
role, tt.subTest, podSpec.Spec.PriorityClassName, tt.expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func testServiceAccount(cluster *Cluster, podSpec *v1.PodTemplateSpec, role PostgresRole) error {
|
func testServiceAccount(cluster *Cluster, podSpec *v1.PodTemplateSpec, role PostgresRole) error {
|
||||||
poolerServiceAccount := podSpec.Spec.ServiceAccountName
|
poolerServiceAccount := podSpec.Spec.ServiceAccountName
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -280,6 +280,7 @@ func (c *Controller) importConfigurationFromCRD(fromCRD *acidv1.OperatorConfigur
|
||||||
result.ConnectionPooler.ConnectionPoolerDefaultMemoryRequest = fromCRD.ConnectionPooler.DefaultMemoryRequest
|
result.ConnectionPooler.ConnectionPoolerDefaultMemoryRequest = fromCRD.ConnectionPooler.DefaultMemoryRequest
|
||||||
result.ConnectionPooler.ConnectionPoolerDefaultCPULimit = fromCRD.ConnectionPooler.DefaultCPULimit
|
result.ConnectionPooler.ConnectionPoolerDefaultCPULimit = fromCRD.ConnectionPooler.DefaultCPULimit
|
||||||
result.ConnectionPooler.ConnectionPoolerDefaultMemoryLimit = fromCRD.ConnectionPooler.DefaultMemoryLimit
|
result.ConnectionPooler.ConnectionPoolerDefaultMemoryLimit = fromCRD.ConnectionPooler.DefaultMemoryLimit
|
||||||
|
result.ConnectionPooler.PriorityClassName = fromCRD.ConnectionPooler.PriorityClassName
|
||||||
|
|
||||||
result.ConnectionPooler.MaxDBConnections = util.CoalesceInt32(
|
result.ConnectionPooler.MaxDBConnections = util.CoalesceInt32(
|
||||||
fromCRD.ConnectionPooler.MaxDBConnections,
|
fromCRD.ConnectionPooler.MaxDBConnections,
|
||||||
|
|
|
||||||
|
|
@ -161,6 +161,7 @@ type ConnectionPooler struct {
|
||||||
Image string `name:"connection_pooler_image" default:"ghcr.io/zalando/postgres-operator/pgbouncer:v2.0.1"`
|
Image string `name:"connection_pooler_image" default:"ghcr.io/zalando/postgres-operator/pgbouncer:v2.0.1"`
|
||||||
Mode string `name:"connection_pooler_mode" default:"transaction"`
|
Mode string `name:"connection_pooler_mode" default:"transaction"`
|
||||||
MaxDBConnections *int32 `name:"connection_pooler_max_db_connections" default:"60"`
|
MaxDBConnections *int32 `name:"connection_pooler_max_db_connections" default:"60"`
|
||||||
|
PriorityClassName string `name:"connection_pooler_priority_class_name"`
|
||||||
ConnectionPoolerDefaultCPURequest string `name:"connection_pooler_default_cpu_request"`
|
ConnectionPoolerDefaultCPURequest string `name:"connection_pooler_default_cpu_request"`
|
||||||
ConnectionPoolerDefaultMemoryRequest string `name:"connection_pooler_default_memory_request"`
|
ConnectionPoolerDefaultMemoryRequest string `name:"connection_pooler_default_memory_request"`
|
||||||
ConnectionPoolerDefaultCPULimit string `name:"connection_pooler_default_cpu_limit"`
|
ConnectionPoolerDefaultCPULimit string `name:"connection_pooler_default_cpu_limit"`
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue