Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions assets/components/openshift-dns/dns/daemonset.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,15 @@ spec:
failureThreshold: 5
resources:
requests:
cpu: 50m
memory: 70Mi
{{- range $key, $value := .DNSRequests }}
{{ $key }}: {{ $value }}
{{- end }}
{{- if .DNSLimits }}
limits:
{{- range $key, $value := .DNSLimits }}
{{ $key }}: {{ $value }}
{{- end }}
{{- end }}
securityContext:
readOnlyRootFilesystem: true
image: '{{ .ReleaseImage.coredns }}'
Expand Down
20 changes: 20 additions & 0 deletions cmd/generate-config/config/config-openapi-spec.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,26 @@
"example": "Enabled"
}
}
},
"resources": {
"description": "Resources configures the CPU and memory resources for the dns container.",
"type": "object",
"properties": {
"limits": {
"description": "Limits specifies the maximum resources the dns container can use.\nValid keys are \"cpu\" and \"memory\". Values must be valid Kubernetes resource quantities.\nWhen not set, no limits are applied.",
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"requests": {
"description": "Requests specifies the minimum resources required for the dns container.\nValid keys are \"cpu\" and \"memory\". Values must be valid Kubernetes resource quantities.\nWhen not set, defaults to cpu=50m, memory=70Mi.",
"type": "object",
"additionalProperties": {
"type": "string"
}
}
}
}
}
},
Expand Down
6 changes: 6 additions & 0 deletions docs/user/howto_config.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ dns:
hosts:
file: ""
status: ""
resources:
limits: {}
requests: {}
etcd:
memoryLimitMB: 0
genericDevicePlugin:
Expand Down Expand Up @@ -201,6 +204,9 @@ dns:
hosts:
file: /etc/hosts
status: Disabled
resources:
limits: {}
requests: {}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
etcd:
memoryLimitMB: 0
genericDevicePlugin:
Expand Down
10 changes: 10 additions & 0 deletions packaging/microshift/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,16 @@ dns:
# example:
# Enabled
status: Disabled
# Resources configures the CPU and memory resources for the dns container.
resources:
# Limits specifies the maximum resources the dns container can use.
# Valid keys are "cpu" and "memory". Values must be valid Kubernetes resource quantities.
# When not set, no limits are applied.
limits: {}
# Requests specifies the minimum resources required for the dns container.
# Valid keys are "cpu" and "memory". Values must be valid Kubernetes resource quantities.
# When not set, defaults to cpu=50m, memory=70Mi.
requests: {}
etcd:
# Set a memory limit on the etcd process; etcd will begin paging
# memory when it gets to this value. 0 means no limit.
Expand Down
2 changes: 2 additions & 0 deletions pkg/components/controllers.go
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,8 @@ func startDNSController(ctx context.Context, cfg *config.Config, kubeconfigPath
extraParams := assets.RenderParams{
"ClusterIP": cfg.Network.DNS,
"HostsEnabled": cfg.DNS.Hosts.Status == config.HostsStatusEnabled,
"DNSRequests": cfg.DNS.Resources.Requests,
"DNSLimits": cfg.DNS.Resources.Limits,
}

if err := assets.ApplyServices(ctx, svc, renderTemplate, renderParamsFromConfig(cfg, extraParams), kubeconfigPath); err != nil {
Expand Down
18 changes: 18 additions & 0 deletions pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,24 @@ func (c *Config) incorporateUserSettings(u *Config) {
c.DNS.Hosts.File = u.DNS.Hosts.File
}
}

// DNS resource configuration - merge key-by-key to preserve defaults
if u.DNS.Resources.Requests != nil {
if c.DNS.Resources.Requests == nil {
c.DNS.Resources.Requests = make(map[string]string)
}
for k, v := range u.DNS.Resources.Requests {
c.DNS.Resources.Requests[k] = v
}
}
if u.DNS.Resources.Limits != nil {
if c.DNS.Resources.Limits == nil {
c.DNS.Resources.Limits = make(map[string]string)
}
for k, v := range u.DNS.Resources.Limits {
c.DNS.Resources.Limits[k] = v
}
}
if u.ApiServer.FeatureGates.FeatureSet != "" {
c.ApiServer.FeatureGates.FeatureSet = u.ApiServer.FeatureGates.FeatureSet
}
Expand Down
164 changes: 164 additions & 0 deletions pkg/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,63 @@ func TestGetActiveConfigFromYAML(t *testing.T) {
return c
}(),
},
{
name: "dns-resources-requests",
config: dedent(`
dns:
resources:
requests:
cpu: "100m"
memory: "150Mi"
`),
expected: func() *Config {
c := mkDefaultConfig()
c.DNS.Resources.Requests = map[string]string{
"cpu": "100m",
"memory": "150Mi",
}
return c
}(),
},
{
name: "dns-resources-partial-request",
config: dedent(`
dns:
resources:
requests:
cpu: "100m"
`),
expected: func() *Config {
c := mkDefaultConfig()
c.DNS.Resources.Requests["cpu"] = "100m"
return c
}(),
},
{
name: "dns-resources-with-limits",
config: dedent(`
dns:
resources:
requests:
cpu: "100m"
memory: "150Mi"
limits:
cpu: "200m"
memory: "256Mi"
`),
expected: func() *Config {
c := mkDefaultConfig()
c.DNS.Resources.Requests = map[string]string{
"cpu": "100m",
"memory": "150Mi",
}
c.DNS.Resources.Limits = map[string]string{
"cpu": "200m",
"memory": "256Mi",
}
return c
}(),
},
{
name: "network",
config: dedent(`
Expand Down Expand Up @@ -904,6 +961,113 @@ func TestValidate(t *testing.T) {
}(),
expectErr: true,
},
{
name: "dns-resources-valid-quantities",
config: func() *Config {
c := mkDefaultConfig()
c.DNS.Resources.Requests = map[string]string{
"cpu": "100m",
"memory": "128Mi",
}
c.DNS.Resources.Limits = map[string]string{
"cpu": "200m",
"memory": "256Mi",
}
return c
}(),
expectErr: false,
},
{
name: "dns-resources-invalid-request",
config: func() *Config {
c := mkDefaultConfig()
c.DNS.Resources.Requests["cpu"] = "abc"
return c
}(),
expectErr: true,
},
{
name: "dns-resources-invalid-limit",
config: func() *Config {
c := mkDefaultConfig()
c.DNS.Resources.Limits = map[string]string{
"cpu": "not-a-quantity",
}
return c
}(),
expectErr: true,
},
{
name: "dns-resources-limit-less-than-request",
config: func() *Config {
c := mkDefaultConfig()
c.DNS.Resources.Requests["cpu"] = "200m"
c.DNS.Resources.Limits = map[string]string{
"cpu": "50m",
}
return c
}(),
expectErr: true,
},
{
name: "dns-resources-limit-without-request",
config: func() *Config {
c := mkDefaultConfig()
c.DNS.Resources.Limits = map[string]string{
"cpu": "200m",
}
return c
}(),
expectErr: false,
},
{
name: "dns-resources-unsupported-request-key",
config: func() *Config {
c := mkDefaultConfig()
c.DNS.Resources.Requests["gpu"] = "1"
return c
}(),
expectErr: true,
},
{
name: "dns-resources-unsupported-limit-key",
config: func() *Config {
c := mkDefaultConfig()
c.DNS.Resources.Limits = map[string]string{
"ephemeral-storage": "1Gi",
}
return c
}(),
expectErr: true,
},
{
name: "dns-resources-cpu-below-minimum",
config: func() *Config {
c := mkDefaultConfig()
c.DNS.Resources.Requests["cpu"] = "10m"
return c
}(),
expectErr: true,
},
{
name: "dns-resources-memory-below-minimum",
config: func() *Config {
c := mkDefaultConfig()
c.DNS.Resources.Requests["memory"] = "30Mi"
return c
}(),
expectErr: true,
},
{
name: "dns-resources-at-minimum",
config: func() *Config {
c := mkDefaultConfig()
c.DNS.Resources.Requests["cpu"] = "50m"
c.DNS.Resources.Requests["memory"] = "70Mi"
return c
}(),
expectErr: false,
},
}
for _, tt := range ttests {
t.Run(tt.name, func(t *testing.T) {
Expand Down
Loading