8000 [Feature] Add --deployment.feature.init-containers-upscale-resources … · arangodb/kube-arangodb@316f208 · GitHub
[go: up one dir, main page]

Skip to content

Commit 316f208

Browse files
authored
[Feature] Add --deployment.feature.init-containers-upscale-resources … (#1557)
1 parent e2ef0e3 commit 316f208

File tree

10 files changed

+224
-64
lines changed

10 files changed

+224
-64
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
- (Feature) (ML) Container Envs
4242
- (Feature) Pass Arguments to ID Group
4343
- (Documentation) (ML) Minimal docs with examples how to deploy ArangoMLExtension
44+
- (Feature) Add --deployment.feature.init-containers-upscale-resources (default enabled)
4445

4546
## [1.2.35](https://github.com/arangodb/kube-arangodb/tree/1.2.35) (2023-11-06)
4647
- (Maintenance) Update go-driver to v1.6.0, update IsNotFound() checks

README.md

Lines changed: 29 additions & 28 deletions
Large diffs are not rendered by default.

docs/features/README.md

Lines changed: 29 additions & 28 deletions
Large diffs are not rendered by default.

internal/features.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,13 @@ features:
220220
releases:
221221
- operatorVersion: 1.2.33
222222
state: Production
223+
- name: Upscale resources spec in init containers
224+
enabled: true
225+
remarks: Upscale resources spec to built-in init containers if they are not specified or lower
226+
flag: --deployment.feature.init-containers-upscale-resources
227+
releases:
228+
- operatorVersion: 1.2.36
229+
state: Production
223230
- name: Enforced ResignLeadership
224231
enabled: true
225232
remarks: Enforce ResignLeadership and ensure that Leaders are moved from restarted DBServer

pkg/deployment/features/init_containers.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2023 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2023-2024 ArangoDB GmbH, Cologne, Germany
55
//
66
// Licensed under the Apache License, Version 2.0 (the "License");
77
// you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@ package features
2222

2323
func init() {
2424
registerFeature(initContainerCopyResources)
25+
registerFeature(initContainerUpscaleResources)
2526
}
2627

2728
var initContainerCopyResources = &feature{
@@ -33,6 +34,19 @@ var initContainerCopyResources = &feature{
3334
hidden: false,
3435
}
3536

37+
var initContainerUpscaleResources = &feature{
38+
name: "init-containers-upscale-resources",
39+
description: "Copy resources spec to built-in init containers if they are not specified or lower",
40+
version: "3.6.0",
41+
enterpriseRequired: false,
42+
enabledByDefault: true,
43+
hidden: false,
44+
}
45+
3646
func InitContainerCopyResources() Feature {
3747
return initContainerCopyResources
3848
}
49+
50+
func InitContainerUpscaleResources() Feature {
51+
return initContainerUpscaleResources
52+
}

pkg/deployment/resources/pod_creator_arangod.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2016-2023 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany
55
//
66
// Licensed under the Apache License, Version 2.0 (the "License");
77
// you may not use this file except in compliance with the License.
@@ -517,7 +517,12 @@ func (m *MemberArangoDPod) GetInitContainers(cachedStatus interfaces.Inspector)
517517
}
518518
}
519519

520-
return applyInitContainersResourceResources(initContainers, resources.ExtractPodInitContainerAcceptedResourceRequirement(m.GetContainerCreator().GetResourceRequirements())), nil
520+
res := resources.ExtractPodInitContainerAcceptedResourceRequirement(m.GetContainerCreator().GetResourceRequirements())
521+
522+
initContainers = applyInitContainersResourceResources(initContainers, res)
523+
initContainers = upscaleInitContainersResourceResources(initContainers, res)
524+
525+
return initContainers, nil
521526
}
522527

523528
func (m *MemberArangoDPod) GetFinalizers() []string {

pkg/deployment/resources/pod_creator_sync.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2016-2023 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany
55
//
66
// Licensed under the Apache License, Version 2.0 (the "License");
77
// you may not use this file except in compliance with the License.
@@ -309,7 +309,12 @@ func (m *MemberSyncPod) GetInitContainers(cachedStatus interfaces.Inspector) ([]
309309
initContainers = append(initContainers, c)
310310
}
311311

312-
return applyInitContainersResourceResources(initContainers, resources.ExtractPodInitContainerAcceptedResourceRequirement(m.GetContainerCreator().GetResourceRequirements())), nil
312+
res := resources.ExtractPodInitContainerAcceptedResourceRequirement(m.GetContainerCreator().GetResourceRequirements())
313+
314+
initContainers = applyInitContainersResourceResources(initContainers, res)
315+
initContainers = upscaleInitContainersResourceResources(initContainers, res)
316+
317+
return initContainers, nil
313318
}
314319

315320
func (m *MemberSyncPod) GetFinalizers() []string {

pkg/deployment/resources/pod_init_containers.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2023 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2023-2024 ArangoDB GmbH, Cologne, Germany
55
//
66
// Licensed under the Apache License, Version 2.0 (the "License");
77
// you may not use this file except in compliance with the License.
@@ -44,3 +44,20 @@ func applyInitContainersResourceResources(initContainers []core.Container, mainC
4444
}
4545
return initContainers
4646
}
47+
48+
// upscaleInitContainersResourceResources updates passed init containers to ensure that all resources are set (if such feature is enabled)
49+
// This is applied only to containers added by operator itself
50+
func upscaleInitContainersResourceResources(initContainers []core.Container, mainContainerResources core.ResourceRequirements) []core.Container {
51+
if !features.InitContainerUpscaleResources().Enabled() {
52+
return initContainers
53+
}
54+
55+
for i := range initContainers {
56+
if !api.IsReservedServerGroupInitContainerName(initContainers[i].Name) {
57+
continue
58+
}
59+
60+
resources.UpscaleContainerResourceRequirements(&initContainers[i], mainContainerResources)
61+
}
62+
return initContainers
63+
}

pkg/util/k8sutil/resources/resources.go

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2023 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2023-2024 ArangoDB GmbH, Cologne, Germany
55
//
66
// Licensed under the Apache License, Version 2.0 (the "License");
77
// you may not use this file except in compliance with the License.
@@ -62,6 +62,44 @@ func ApplyContainerResourceList(to core.ResourceList, from core.ResourceList) co
6262
return to
6363
}
6464

65+
func UpscaleContainerResourceRequirements(container *core.Container, resources core.ResourceRequirements) {
66+
if container == nil {
67+
return
68+
}
69+
70+
container.Resources.Limits = UpscaleContainerResourceList(container.Resources.Limits, resources.Limits)
71+
container.Resources.Requests = UpscaleContainerResourceList(container.Resources.Requests, resources.Requests)
72+
}
73+
74+
// UpscaleContainerResource scales up resources from `from` to `to` ResourceList
75+
func UpscaleContainerResource(to core.ResourceRequirements, from core.ResourceRequirements) core.ResourceRequirements {
76+
var r core.ResourceRequirements
77+
78+
r.Limits = UpscaleContainerResourceList(to.Limits, from.Limits)
79+
r.Requests = UpscaleContainerResourceList(to.Requests, from.Requests)
80+
81+
return r
82+
}
83+
84+
// UpscaleContainerResourceList scales up resources from `from` to `to` ResourceList
85+
func UpscaleContainerResourceList(to core.ResourceList, from core.ResourceList) core.ResourceList {
86+
if len(from) == 0 {
87+
return to
88+
}
89+
90+
if to == nil {
91+
to = core.ResourceList{}
92+
}
93+
94+
for k, v := range from {
95+
if n, ok := to[k]; !ok || n.Cmp(v) < 0 {
96+
to[k] = v
97+
}
98+
}
99+
100+
return to
101+
}
102+
65103
// ExtractPodInitContainerAcceptedResourceRequirement filters resource requirements for InitContainers.
66104
func ExtractPodInitContainerAcceptedResourceRequirement(resources core.ResourceRequirements) core.ResourceRequirements {
67105
return NewPodResourceRequirementsFilter(PodResourceRequirementsInitContainersAcceptedResourceRequirements()...)(resources)

pkg/util/k8sutil/resources/resources_test.go

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2023 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2023-2024 ArangoDB GmbH, Cologne, Germany
55
//
66
// Licensed under the Apache License, Version 2.0 (the "License");
77
// you may not use this file except in compliance with the License.
@@ -88,6 +88,7 @@ func Test_ExtractPodAcceptedResourceRequirement(t *testing.T) {
8888
}
8989
})
9090
}
91+
9192
func Test_ApplyContainerResourceRequirements(t *testing.T) {
9293
v1, err := resource.ParseQuantity("1Gi")
9394
require.NoError(t, err)
@@ -160,3 +161,73 @@ func Test_ApplyContainerResourceRequirements(t *testing.T) {
160161
require.Equal(t, v2, container.Resources.Limits[core.ResourceCPU])
161162
})
162163
}
164+
165+
func Test_UpsertContainerResourceRequirements(t *testing.T) {
166+
v1, err := resource.ParseQuantity("1Gi")
167+
require.NoError(t, err)
168+
169+
v2, err := resource.ParseQuantity("2Gi")
170+
require.NoError(t, err)
171+
172+
v3, err := resource.ParseQuantity("4Gi")
173+
require.NoError(t, err)
174+
175+
var container core.Container
176+
177+
t.Run("Ensure limits are copied", func(t *testing.T) {
178+
UpscaleContainerResourceRequirements(&container, core.ResourceRequirements{
179+
Limits: core.ResourceList{
180+
core.ResourceMemory: v1,
181+
},
182+
Requests: core.ResourceList{
183+
core.ResourceMemory: v1,
184+
},
185+
})
186+
187+
require.Len(t, container.Resources.Requests, 1)
188+
require.Contains(t, container.Resources.Requests, core.ResourceMemory)
189+
require.Equal(t, v1, container.Resources.Requests[core.ResourceMemory])
190+
191+
require.Len(t, container.Resources.Limits, 1)
192+
require.Contains(t, container.Resources.Limits, core.ResourceMemory)
193+
require.Equal(t, v1, container.Resources.Limits[core.ResourceMemory])
194+
})
195+
196+
t.Run("Ensure limits are increased", func(t *testing.T) {
197+
UpscaleContainerResourceRequirements(&container, core.ResourceRequirements{
198+
Limits: core.ResourceList{
199+
core.ResourceMemory: v2,
200+
},
201+
Requests: core.ResourceList{
202+
core.ResourceMemory: v2,
203+
},
204+
})
205+
206+
require.Len(t, container.Resources.Requests, 1)
207+
require.Contains(t, container.Resources.Requests, core.ResourceMemory)
208+
require.Equal(t, v2, container.Resources.Requests[core.ResourceMemory])
209+
210+
require.Len(t, container.Resources.Limits, 1)
211+
require.Contains(t, container.Resources.Limits, core.ResourceMemory)
212+
require.Equal(t, v2, container.Resources.Limits[core.ResourceMemory])
213+
})
214+
215+
t.Run("Ensure limits are not decreased", func(t *testing.T) {
216+
UpscaleContainerResourceRequirements(&container, core.ResourceRequirements{
217+
Limits: core.ResourceList{
218+
core.ResourceMemory: v3,
219+
},
220+
Requests: core.ResourceList{
221+
core.ResourceMemory: v1,
222+
},
223+
})
224+
225+
require.Len(t, container.Resources.Requests, 1)
226+
require.Contains(t, container.Resources.Requests, core.ResourceMemory)
227+
require.Equal(t, v2, container.Resources.Requests[core.ResourceMemory])
228+
229+
require.Len(t, container.Resources.Limits, 1)
230+
require.Contains(t, container.Resources.Limits, core.ResourceMemory)
231+
require.Equal(t, v3, container.Resources.Limits[core.ResourceMemory])
232+
})
233+
}

0 commit comments

Comments
 (0)
0