Skip to content

Commit

Permalink
Set default resource limits for Elasticsearch (#655)
Browse files Browse the repository at this point in the history
Signed-off-by: kamolhasan <kamol@appscode.com>
Co-authored-by: Tamal Saha <tamal@appscode.com>
  • Loading branch information
Md Kamol Hasan and tamalsaha committed Nov 17, 2020
1 parent b2fb44c commit 94392a2
Show file tree
Hide file tree
Showing 13 changed files with 56 additions and 38 deletions.
32 changes: 26 additions & 6 deletions apis/kubedb/v1alpha2/constants.go
Expand Up @@ -16,7 +16,12 @@ limitations under the License.

package v1alpha2

import "kubedb.dev/apimachinery/apis/kubedb"
import (
"kubedb.dev/apimachinery/apis/kubedb"

core "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
)

const (
// Deprecated
Expand All @@ -43,11 +48,6 @@ const (

DBCustomConfigName = "custom-config"

DefaultCPULimit = ".250"
DefaultMemoryLimit = "512Mi"
DefaultCPURequest = ".100"
DefaultMemoryRequest = "256Mi"

// =========================== Database key Constants ============================
PostgresKey = ResourceSingularPostgres + "." + kubedb.GroupName
ElasticsearchKey = ResourceSingularElasticsearch + "." + kubedb.GroupName
Expand Down Expand Up @@ -245,3 +245,23 @@ const (
const (
ResourceKindStatefulSet = "StatefulSet"
)

var (
defaultResourceLimits = core.ResourceList{
core.ResourceCPU: resource.MustParse(".250"),
core.ResourceMemory: resource.MustParse("512Mi"),
}
defaultResourceRequests = core.ResourceList{
core.ResourceCPU: resource.MustParse(".100"),
core.ResourceMemory: resource.MustParse("256Mi"),
}

defaultElasticsearchResourceLimits = core.ResourceList{
core.ResourceCPU: resource.MustParse(".600"),
core.ResourceMemory: resource.MustParse("512Mi"),
}
defaultElasticsearchResourceRequests = core.ResourceList{
core.ResourceCPU: resource.MustParse(".300"),
core.ResourceMemory: resource.MustParse("256Mi"),
}
)
22 changes: 11 additions & 11 deletions apis/kubedb/v1alpha2/elasticsearch_helpers.go
Expand Up @@ -26,7 +26,7 @@ import (
"kubedb.dev/apimachinery/apis/kubedb"
"kubedb.dev/apimachinery/crds"

corev1 "k8s.io/api/core/v1"
core "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
appslister "k8s.io/client-go/listers/apps/v1"
Expand Down Expand Up @@ -254,21 +254,21 @@ func (e *Elasticsearch) SetDefaults(esVersion *v1alpha1.ElasticsearchVersion, to
if e.Spec.Topology.Ingest.Prefix == "" {
e.Spec.Topology.Ingest.Prefix = ElasticsearchIngestNodePrefix
}
setDefaultResourceLimits(&e.Spec.Topology.Ingest.Resources)
setDefaultResourceLimits(&e.Spec.Topology.Ingest.Resources, defaultElasticsearchResourceLimits, defaultElasticsearchResourceRequests)

// Default to "data"
if e.Spec.Topology.Data.Prefix == "" {
e.Spec.Topology.Data.Prefix = ElasticsearchDataNodePrefix
}
setDefaultResourceLimits(&e.Spec.Topology.Data.Resources)
setDefaultResourceLimits(&e.Spec.Topology.Data.Resources, defaultElasticsearchResourceLimits, defaultElasticsearchResourceRequests)

// Default to "master"
if e.Spec.Topology.Master.Prefix == "" {
e.Spec.Topology.Master.Prefix = ElasticsearchMasterNodePrefix
}
setDefaultResourceLimits(&e.Spec.Topology.Master.Resources)
setDefaultResourceLimits(&e.Spec.Topology.Master.Resources, defaultElasticsearchResourceLimits, defaultElasticsearchResourceRequests)
} else {
setDefaultResourceLimits(&e.Spec.PodTemplate.Spec.Resources)
setDefaultResourceLimits(&e.Spec.PodTemplate.Spec.Resources, defaultElasticsearchResourceLimits, defaultElasticsearchResourceRequests)
}

e.setDefaultAffinity(&e.Spec.PodTemplate, e.OffshootSelectors(), topology)
Expand All @@ -286,26 +286,26 @@ func (e *Elasticsearch) setDefaultAffinity(podTemplate *ofst.PodTemplateSpec, la
return
}

podTemplate.Spec.Affinity = &corev1.Affinity{
PodAntiAffinity: &corev1.PodAntiAffinity{
PreferredDuringSchedulingIgnoredDuringExecution: []corev1.WeightedPodAffinityTerm{
podTemplate.Spec.Affinity = &core.Affinity{
PodAntiAffinity: &core.PodAntiAffinity{
PreferredDuringSchedulingIgnoredDuringExecution: []core.WeightedPodAffinityTerm{
// Prefer to not schedule multiple pods on the same node
{
Weight: 100,
PodAffinityTerm: corev1.PodAffinityTerm{
PodAffinityTerm: core.PodAffinityTerm{
Namespaces: []string{e.Namespace},
LabelSelector: &metav1.LabelSelector{
MatchLabels: labels,
MatchExpressions: e.GetMatchExpressions(),
},

TopologyKey: corev1.LabelHostname,
TopologyKey: core.LabelHostname,
},
},
// Prefer to not schedule multiple pods on the node with same zone
{
Weight: 50,
PodAffinityTerm: corev1.PodAffinityTerm{
PodAffinityTerm: core.PodAffinityTerm{
Namespaces: []string{e.Namespace},
LabelSelector: &metav1.LabelSelector{
MatchLabels: labels,
Expand Down
2 changes: 1 addition & 1 deletion apis/kubedb/v1alpha2/etcd_helpers.go
Expand Up @@ -153,7 +153,7 @@ func (e *Etcd) SetDefaults() {
}

e.Spec.Monitor.SetDefaults()
setDefaultResourceLimits(&e.Spec.PodTemplate.Spec.Resources)
setDefaultResourceLimits(&e.Spec.PodTemplate.Spec.Resources, defaultResourceLimits, defaultResourceRequests)
}

func (e *EtcdSpec) GetPersistentSecrets() []string {
Expand Down
14 changes: 6 additions & 8 deletions apis/kubedb/v1alpha2/helpers.go
Expand Up @@ -63,7 +63,7 @@ func GetServiceTemplate(templates []NamedServiceTemplateSpec, alias ServiceAlias
return ofst.ServiceTemplateSpec{}
}

func setDefaultResourceLimits(req *core.ResourceRequirements) {
func setDefaultResourceLimits(req *core.ResourceRequirements, limits, requests core.ResourceList) {
fn := func(name core.ResourceName, defaultValue resource.Quantity) resource.Quantity {
if req.Limits != nil {
if v, ok := req.Limits[name]; ok {
Expand All @@ -84,12 +84,10 @@ func setDefaultResourceLimits(req *core.ResourceRequirements) {
if req.Requests == nil {
req.Requests = core.ResourceList{}
}
req.Limits[core.ResourceCPU] = fn(core.ResourceCPU, resource.MustParse(DefaultCPULimit))
if _, ok := req.Requests[core.ResourceCPU]; !ok {
req.Requests[core.ResourceCPU] = resource.MustParse(DefaultCPURequest)
}
req.Limits[core.ResourceMemory] = fn(core.ResourceMemory, resource.MustParse(DefaultMemoryLimit))
if _, ok := req.Requests[core.ResourceMemory]; !ok {
req.Requests[core.ResourceMemory] = resource.MustParse(DefaultMemoryRequest)
for resource := range limits {
req.Limits[resource] = fn(resource, limits[resource])
if _, ok := req.Requests[resource]; !ok {
req.Requests[resource] = requests[resource]
}
}
}
2 changes: 1 addition & 1 deletion apis/kubedb/v1alpha2/mariadb_helpers.go
Expand Up @@ -170,7 +170,7 @@ func (m *MariaDB) SetDefaults() {

m.Spec.setDefaultProbes()
m.Spec.Monitor.SetDefaults()
setDefaultResourceLimits(&m.Spec.PodTemplate.Spec.Resources)
setDefaultResourceLimits(&m.Spec.PodTemplate.Spec.Resources, defaultResourceLimits, defaultResourceRequests)
}

func (m *MariaDBSpec) setDefaultProbes() {
Expand Down
2 changes: 1 addition & 1 deletion apis/kubedb/v1alpha2/memcached_helpers.go
Expand Up @@ -150,7 +150,7 @@ func (m *Memcached) SetDefaults() {
}

m.Spec.Monitor.SetDefaults()
setDefaultResourceLimits(&m.Spec.PodTemplate.Spec.Resources)
setDefaultResourceLimits(&m.Spec.PodTemplate.Spec.Resources, defaultResourceLimits, defaultResourceRequests)
}

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

if m.Spec.ShardTopology != nil {
setDefaultResourceLimits(&m.Spec.ShardTopology.Mongos.PodTemplate.Spec.Resources)
setDefaultResourceLimits(&m.Spec.ShardTopology.Shard.PodTemplate.Spec.Resources)
setDefaultResourceLimits(&m.Spec.ShardTopology.ConfigServer.PodTemplate.Spec.Resources)
setDefaultResourceLimits(&m.Spec.ShardTopology.Mongos.PodTemplate.Spec.Resources, defaultResourceLimits, defaultResourceRequests)
setDefaultResourceLimits(&m.Spec.ShardTopology.Shard.PodTemplate.Spec.Resources, defaultResourceLimits, defaultResourceRequests)
setDefaultResourceLimits(&m.Spec.ShardTopology.ConfigServer.PodTemplate.Spec.Resources, defaultResourceLimits, defaultResourceRequests)

if m.Spec.ShardTopology.Mongos.PodTemplate.Spec.Lifecycle == nil {
m.Spec.ShardTopology.Mongos.PodTemplate.Spec.Lifecycle = new(core.Lifecycle)
Expand Down Expand Up @@ -425,7 +425,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)
setDefaultResourceLimits(&m.Spec.PodTemplate.Spec.Resources, defaultResourceLimits, defaultResourceRequests)
}

m.SetTLSDefaults()
Expand Down
2 changes: 1 addition & 1 deletion apis/kubedb/v1alpha2/mysql_helpers.go
Expand Up @@ -183,7 +183,7 @@ func (m *MySQL) SetDefaults() {
m.Spec.Monitor.SetDefaults()

m.SetTLSDefaults()
setDefaultResourceLimits(&m.Spec.PodTemplate.Spec.Resources)
setDefaultResourceLimits(&m.Spec.PodTemplate.Spec.Resources, defaultResourceLimits, defaultResourceRequests)
}

func (m *MySQL) SetTLSDefaults() {
Expand Down
2 changes: 1 addition & 1 deletion apis/kubedb/v1alpha2/perconaxtradb_helpers.go
Expand Up @@ -171,7 +171,7 @@ func (p *PerconaXtraDB) SetDefaults() {

p.Spec.setDefaultProbes()
p.Spec.Monitor.SetDefaults()
setDefaultResourceLimits(&p.Spec.PodTemplate.Spec.Resources)
setDefaultResourceLimits(&p.Spec.PodTemplate.Spec.Resources, defaultResourceLimits, defaultResourceRequests)
}

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

p.SetTLSDefaults()
setDefaultResourceLimits(&p.Spec.PodTemplate.Spec.Resources)
setDefaultResourceLimits(&p.Spec.PodTemplate.Spec.Resources, defaultResourceLimits, defaultResourceRequests)
}

func (p *PgBouncer) SetTLSDefaults() {
Expand Down
2 changes: 1 addition & 1 deletion apis/kubedb/v1alpha2/postgres_helpers.go
Expand Up @@ -176,7 +176,7 @@ func (p *Postgres) SetDefaults() {
}

p.Spec.Monitor.SetDefaults()
setDefaultResourceLimits(&p.Spec.PodTemplate.Spec.Resources)
setDefaultResourceLimits(&p.Spec.PodTemplate.Spec.Resources, defaultResourceLimits, defaultResourceRequests)
}

func (e *PostgresSpec) GetPersistentSecrets() []string {
Expand Down
2 changes: 1 addition & 1 deletion apis/kubedb/v1alpha2/proxysql_helpers.go
Expand Up @@ -151,7 +151,7 @@ func (p *ProxySQL) SetDefaults() {
}

p.Spec.Monitor.SetDefaults()
setDefaultResourceLimits(&p.Spec.PodTemplate.Spec.Resources)
setDefaultResourceLimits(&p.Spec.PodTemplate.Spec.Resources, defaultResourceLimits, defaultResourceRequests)
}

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

r.SetTLSDefaults()
setDefaultResourceLimits(&r.Spec.PodTemplate.Spec.Resources)
setDefaultResourceLimits(&r.Spec.PodTemplate.Spec.Resources, defaultResourceLimits, defaultResourceRequests)
}

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

0 comments on commit 94392a2

Please sign in to comment.