Skip to content

Commit

Permalink
Update default resource limits for databases (#755)
Browse files Browse the repository at this point in the history
Signed-off-by: kamolhasan <kamol@appscode.com>
  • Loading branch information
Md Kamol Hasan committed Jun 5, 2021
1 parent 161b3fe commit 6fb2646
Show file tree
Hide file tree
Showing 13 changed files with 52 additions and 30 deletions.
11 changes: 8 additions & 3 deletions apis/kubedb/v1alpha2/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -323,8 +323,13 @@ const (
)

var (
DefaultResourceLimits = core.ResourceList{
core.ResourceCPU: resource.MustParse(".500"),
core.ResourceMemory: resource.MustParse("1024Mi"),
DefaultResources = core.ResourceRequirements{
Requests: core.ResourceList{
core.ResourceCPU: resource.MustParse(".500"),
core.ResourceMemory: resource.MustParse("1024Mi"),
},
Limits: core.ResourceList{
core.ResourceMemory: resource.MustParse("1024Mi"),
},
}
)
8 changes: 4 additions & 4 deletions apis/kubedb/v1alpha2/elasticsearch_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -318,21 +318,21 @@ func (e *Elasticsearch) SetDefaults(esVersion *catalog.ElasticsearchVersion, top
if e.Spec.Topology.Ingest.Suffix == "" {
e.Spec.Topology.Ingest.Suffix = ElasticsearchIngestNodeSuffix
}
SetDefaultResourceLimits(&e.Spec.Topology.Ingest.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&e.Spec.Topology.Ingest.Resources, DefaultResources)

// Default to "data"
if e.Spec.Topology.Data.Suffix == "" {
e.Spec.Topology.Data.Suffix = ElasticsearchDataNodeSuffix
}
SetDefaultResourceLimits(&e.Spec.Topology.Data.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&e.Spec.Topology.Data.Resources, DefaultResources)

// Default to "master"
if e.Spec.Topology.Master.Suffix == "" {
e.Spec.Topology.Master.Suffix = ElasticsearchMasterNodeSuffix
}
SetDefaultResourceLimits(&e.Spec.Topology.Master.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&e.Spec.Topology.Master.Resources, DefaultResources)
} else {
SetDefaultResourceLimits(&e.Spec.PodTemplate.Spec.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&e.Spec.PodTemplate.Spec.Resources, DefaultResources)
}

// set default kernel settings
Expand Down
2 changes: 1 addition & 1 deletion apis/kubedb/v1alpha2/etcd_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ func (e *Etcd) SetDefaults() {
}

e.Spec.Monitor.SetDefaults()
SetDefaultResourceLimits(&e.Spec.PodTemplate.Spec.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&e.Spec.PodTemplate.Spec.Resources, DefaultResources)
}

func (e *EtcdSpec) GetPersistentSecrets() []string {
Expand Down
37 changes: 27 additions & 10 deletions apis/kubedb/v1alpha2/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,15 +63,15 @@ func GetServiceTemplate(templates []NamedServiceTemplateSpec, alias ServiceAlias
return ofst.ServiceTemplateSpec{}
}

func SetDefaultResourceLimits(req *core.ResourceRequirements, defaultLimits core.ResourceList) {
func SetDefaultResourceLimits(req *core.ResourceRequirements, defaultResources core.ResourceRequirements) {
// if request is set,
// - limit set:
// - return max(limit,request)
// else if limit set:
// - return limit
// else
// - return default
fn := func(name core.ResourceName, defaultValue resource.Quantity) resource.Quantity {
calLimit := func(name core.ResourceName, defaultValue resource.Quantity) resource.Quantity {
if r, ok := req.Requests[name]; ok {
// l is greater than r == 1.
if l, exist := req.Limits[name]; exist && l.Cmp(r) == 1 {
Expand All @@ -84,6 +84,24 @@ func SetDefaultResourceLimits(req *core.ResourceRequirements, defaultLimits core
}
return defaultValue
}
// if request is not set,
// - if limit exists:
// - copy limit
// - else
// - set default
// else
// - return request
// endif
calRequest := func(name core.ResourceName, defaultValue resource.Quantity) resource.Quantity {
if r, ok := req.Requests[name]; !ok {
if l, exist := req.Limits[name]; exist {
return l
}
return defaultValue
} else {
return r
}
}

if req.Limits == nil {
req.Limits = core.ResourceList{}
Expand All @@ -92,15 +110,14 @@ func SetDefaultResourceLimits(req *core.ResourceRequirements, defaultLimits core
req.Requests = core.ResourceList{}
}

// for: cpu & memory
// - calculate limit
// - if request not set, set to limit
for resourceName := range defaultLimits {
req.Limits[resourceName] = fn(resourceName, defaultLimits[resourceName])
// Calculate the limits first
for l := range defaultResources.Limits {
req.Limits[l] = calLimit(l, defaultResources.Limits[l])
}

if _, ok := req.Requests[resourceName]; !ok {
req.Requests[resourceName] = req.Limits[resourceName]
}
// Once the limit is calculated, Calculate requests
for r := range defaultResources.Requests {
req.Requests[r] = calRequest(r, defaultResources.Requests[r])
}
}

Expand Down
2 changes: 1 addition & 1 deletion apis/kubedb/v1alpha2/mariadb_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ func (m *MariaDB) SetDefaults(topology *core_util.Topology) {
m.Spec.Monitor.SetDefaults()
m.setDefaultAffinity(&m.Spec.PodTemplate, m.OffshootSelectors(), topology)
m.SetTLSDefaults()
SetDefaultResourceLimits(&m.Spec.PodTemplate.Spec.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&m.Spec.PodTemplate.Spec.Resources, DefaultResources)
}

// setDefaultAffinity
Expand Down
2 changes: 1 addition & 1 deletion apis/kubedb/v1alpha2/memcached_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ func (m *Memcached) SetDefaults() {
}

m.Spec.Monitor.SetDefaults()
SetDefaultResourceLimits(&m.Spec.PodTemplate.Spec.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&m.Spec.PodTemplate.Spec.Resources, DefaultResources)
}

func (m *MemcachedSpec) GetPersistentSecrets() []string {
Expand Down
8 changes: 4 additions & 4 deletions apis/kubedb/v1alpha2/mongodb_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -365,9 +365,9 @@ func (m *MongoDB) SetDefaults(mgVersion *v1alpha1.MongoDBVersion, topology *core
}

if m.Spec.ShardTopology != nil {
SetDefaultResourceLimits(&m.Spec.ShardTopology.Mongos.PodTemplate.Spec.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&m.Spec.ShardTopology.Shard.PodTemplate.Spec.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&m.Spec.ShardTopology.ConfigServer.PodTemplate.Spec.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&m.Spec.ShardTopology.Mongos.PodTemplate.Spec.Resources, DefaultResources)
SetDefaultResourceLimits(&m.Spec.ShardTopology.Shard.PodTemplate.Spec.Resources, DefaultResources)
SetDefaultResourceLimits(&m.Spec.ShardTopology.ConfigServer.PodTemplate.Spec.Resources, DefaultResources)

if m.Spec.ShardTopology.Mongos.PodTemplate.Spec.Lifecycle == nil {
m.Spec.ShardTopology.Mongos.PodTemplate.Spec.Lifecycle = new(core.Lifecycle)
Expand Down Expand Up @@ -427,7 +427,7 @@ func (m *MongoDB) SetDefaults(mgVersion *v1alpha1.MongoDBVersion, topology *core
// set default affinity (PodAntiAffinity)
m.setDefaultAffinity(m.Spec.PodTemplate, m.OffshootSelectors(), topology)

SetDefaultResourceLimits(&m.Spec.PodTemplate.Spec.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&m.Spec.PodTemplate.Spec.Resources, DefaultResources)
}

m.SetTLSDefaults()
Expand Down
2 changes: 1 addition & 1 deletion apis/kubedb/v1alpha2/mysql_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ func (m *MySQL) SetDefaults(topology *core_util.Topology) {
m.Spec.Monitor.SetDefaults()
m.setDefaultAffinity(&m.Spec.PodTemplate, m.OffshootSelectors(), topology)
m.SetTLSDefaults()
SetDefaultResourceLimits(&m.Spec.PodTemplate.Spec.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&m.Spec.PodTemplate.Spec.Resources, DefaultResources)
}

// setDefaultAffinity
Expand Down
2 changes: 1 addition & 1 deletion apis/kubedb/v1alpha2/perconaxtradb_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ func (p *PerconaXtraDB) SetDefaults() {

p.Spec.setDefaultProbes()
p.Spec.Monitor.SetDefaults()
SetDefaultResourceLimits(&p.Spec.PodTemplate.Spec.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&p.Spec.PodTemplate.Spec.Resources, DefaultResources)
}

// setDefaultProbes sets defaults only when probe fields are nil.
Expand Down
2 changes: 1 addition & 1 deletion apis/kubedb/v1alpha2/pgbouncer_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ func (p *PgBouncer) SetDefaults() {
p.Spec.Monitor.SetDefaults()

p.SetTLSDefaults()
SetDefaultResourceLimits(&p.Spec.PodTemplate.Spec.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&p.Spec.PodTemplate.Spec.Resources, DefaultResources)
}

func (p *PgBouncer) SetTLSDefaults() {
Expand Down
2 changes: 1 addition & 1 deletion apis/kubedb/v1alpha2/postgres_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ func (p *Postgres) SetDefaults(postgresVersion *catalog.PostgresVersion, topolog

p.Spec.Monitor.SetDefaults()
p.SetTLSDefaults()
SetDefaultResourceLimits(&p.Spec.PodTemplate.Spec.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&p.Spec.PodTemplate.Spec.Resources, DefaultResources)
p.setDefaultAffinity(&p.Spec.PodTemplate, p.OffshootSelectors(), topology)
}

Expand Down
2 changes: 1 addition & 1 deletion apis/kubedb/v1alpha2/proxysql_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ func (p *ProxySQL) SetDefaults() {
}

p.Spec.Monitor.SetDefaults()
SetDefaultResourceLimits(&p.Spec.PodTemplate.Spec.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&p.Spec.PodTemplate.Spec.Resources, DefaultResources)
}

func (p *ProxySQLSpec) GetPersistentSecrets() []string {
Expand Down
2 changes: 1 addition & 1 deletion apis/kubedb/v1alpha2/redis_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ func (r *Redis) SetDefaults(topology *core_util.Topology) {
r.Spec.Monitor.SetDefaults()

r.SetTLSDefaults()
SetDefaultResourceLimits(&r.Spec.PodTemplate.Spec.Resources, DefaultResourceLimits)
SetDefaultResourceLimits(&r.Spec.PodTemplate.Spec.Resources, DefaultResources)
}

func (r *Redis) SetTLSDefaults() {
Expand Down

0 comments on commit 6fb2646

Please sign in to comment.