Skip to content

Commit b12addd

Browse files
OCP 4.20 and earlier cluster should have AutoSizingReserved disable by default
1 parent b9dbf39 commit b12addd

File tree

2 files changed

+108
-4
lines changed

2 files changed

+108
-4
lines changed

pkg/controller/kubelet-config/kubelet_config_nodes.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ import (
2121
"k8s.io/klog/v2"
2222
)
2323

24+
const (
25+
DefaultAutoSizingEnvContent = `NODE_SIZING_ENABLED=false
26+
SYSTEM_RESERVED_MEMORY=1Gi
27+
SYSTEM_RESERVED_CPU=500m
28+
SYSTEM_RESERVED_ES=1Gi
29+
`
30+
)
31+
2432
func (ctrl *Controller) nodeConfigWorker() {
2533
for ctrl.processNextNodeConfigWorkItem() {
2634
}
@@ -56,6 +64,62 @@ func (ctrl *Controller) handleNodeConfigErr(err error, key string) {
5664
ctrl.nodeConfigQueue.AddAfter(key, 1*time.Minute)
5765
}
5866

67+
// newAutoSizingMachineConfig creates an empty auto-sizing MachineConfig for a given pool
68+
func newAutoSizingMachineConfig(pool *mcfgv1.MachineConfigPool) (*mcfgv1.MachineConfig, error) {
69+
autoSizingDisabledName := fmt.Sprintf("01-%s-auto-sizing-disabled", pool.Name)
70+
ignConfig := ctrlcommon.NewIgnConfig()
71+
autoSizingMC, err := ctrlcommon.MachineConfigFromIgnConfig(pool.Name, autoSizingDisabledName, ignConfig)
72+
if err != nil {
73+
return nil, err
74+
}
75+
76+
// Create the auto-sizing disabled file
77+
autoSizingFile := ctrlcommon.NewIgnFileBytes("/etc/node-sizing-enabled.env", []byte(DefaultAutoSizingEnvContent))
78+
autoSizingIgnConfig := ctrlcommon.NewIgnConfig()
79+
autoSizingIgnConfig.Storage.Files = append(autoSizingIgnConfig.Storage.Files, autoSizingFile)
80+
rawAutoSizingIgn, err := json.Marshal(autoSizingIgnConfig)
81+
if err != nil {
82+
return nil, err
83+
}
84+
autoSizingMC.Spec.Config.Raw = rawAutoSizingIgn
85+
// Do not add GeneratedByControllerVersionAnnotationKey annotation to auto-sizing MachineConfig. It will fail upgrade.
86+
// This annotation is added for informing the user that the auto-sizing MachineConfig was added in a patch release
87+
// to identify clusters created before 4.21 release.
88+
autoSizingMC.ObjectMeta.Annotations = map[string]string{
89+
"openshift-patch-reference": "added auto-sizing MachineConfig to disable node sizing",
90+
}
91+
92+
return autoSizingMC, nil
93+
}
94+
95+
// configureAutoSizingMachineConfig creates an auto-sizing MachineConfig for a given pool if it doesn't exist
96+
func (ctrl *Controller) configureAutoSizingMachineConfig(pool *mcfgv1.MachineConfigPool) error {
97+
autoSizingKey := fmt.Sprintf("01-%s-auto-sizing-disabled", pool.Name)
98+
_, err := ctrl.client.MachineconfigurationV1().MachineConfigs().Get(context.TODO(), autoSizingKey, metav1.GetOptions{})
99+
autoSizingIsNotFound := errors.IsNotFound(err)
100+
if err != nil && !autoSizingIsNotFound {
101+
return err
102+
}
103+
// Only create the auto-sizing MachineConfig if it doesn't exist
104+
if autoSizingIsNotFound {
105+
autoSizingMC, err := newAutoSizingMachineConfig(pool)
106+
if err != nil {
107+
return err
108+
}
109+
// Create the auto-sizing MachineConfig
110+
if err := retry.RetryOnConflict(updateBackoff, func() error {
111+
_, err := ctrl.client.MachineconfigurationV1().MachineConfigs().Create(context.TODO(), autoSizingMC, metav1.CreateOptions{})
112+
return err
113+
}); err != nil {
114+
return fmt.Errorf("Could not Create auto-sizing MachineConfig, error: %w", err)
115+
}
116+
klog.Infof("Created auto-sizing configuration %v on MachineConfigPool %v", autoSizingKey, pool.Name)
117+
} else {
118+
klog.V(4).Infof("Auto-sizing MachineConfig %v already exists for pool %v, skipping creation", autoSizingKey, pool.Name)
119+
}
120+
return nil
121+
}
122+
59123
// syncNodeConfigHandler syncs whenever there is a change on the nodes.config.openshift.io resource
60124
// nodes.config.openshift.io object holds the cluster-wide information about the
61125
// node specific features such as cgroup modes, workerlatencyprofiles, etc.
@@ -93,6 +157,13 @@ func (ctrl *Controller) syncNodeConfigHandler(key string) error {
93157
return fmt.Errorf("could not get the TLSSecurityProfile from %v: %v", ctrlcommon.APIServerInstanceName, err)
94158
}
95159

160+
for _, pool := range mcpPools {
161+
// First, create the auto-sizing MachineConfig for this pool if it doesn't exist
162+
if err := ctrl.configureAutoSizingMachineConfig(pool); err != nil {
163+
return err
164+
}
165+
}
166+
96167
for _, pool := range mcpPools {
97168
role := pool.Name
98169
// Get MachineConfig
@@ -278,6 +349,15 @@ func RunNodeConfigBootstrap(templateDir string, fgHandler ctrlcommon.FeatureGate
278349

279350
configs := []*mcfgv1.MachineConfig{}
280351

352+
// Create auto-sizing MachineConfigs for each pool
353+
for _, pool := range mcpPools {
354+
autoSizingMC, err := newAutoSizingMachineConfig(pool)
355+
if err != nil {
356+
return nil, err
357+
}
358+
configs = append(configs, autoSizingMC)
359+
}
360+
281361
for _, pool := range mcpPools {
282362
role := pool.Name
283363
// Get MachineConfig

pkg/controller/kubelet-config/kubelet_config_nodes_test.go

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ func TestNodeConfigDefault(t *testing.T) {
6969
f.nodeLister = append(f.nodeLister, nodeConfig)
7070
f.oseobjects = append(f.oseobjects, nodeConfig)
7171

72+
// Auto-sizing MC
73+
autoSizingKey := fmt.Sprintf("01-%s-auto-sizing", mcp.Name)
74+
autoSizingMC := helpers.NewMachineConfig(autoSizingKey, map[string]string{"node-role/worker": ""}, "dummy://", []ign3types.File{{}})
75+
76+
f.expectGetMachineConfigAction(autoSizingMC)
77+
f.expectCreateMachineConfigAction(autoSizingMC)
7278
f.expectGetMachineConfigAction(mcs)
7379
f.expectGetMachineConfigAction(mcsDeprecated)
7480
f.expectGetMachineConfigAction(mcs)
@@ -119,11 +125,18 @@ func TestBootstrapNodeConfigDefault(t *testing.T) {
119125
if err != nil {
120126
t.Errorf("could not run node config bootstrap: %v", err)
121127
}
122-
expectedCount := 2
128+
// Bootstrap now creates 4 MachineConfigs:
129+
// 1. master auto-sizing (01-master-auto-sizing-disabled)
130+
// 2. master node config (97-master-generated-kubelet)
131+
// 3. worker auto-sizing (01-worker-auto-sizing-disabled)
132+
// 4. worker node config (97-worker-generated-kubelet)
133+
expectedCount := 4
123134
if len(mcs) != expectedCount {
124135
t.Errorf("expected %v machine configs generated with the default node config, got %d machine configs", expectedCount, len(mcs))
125136
}
126-
require.Equal(t, mcs[0].Spec.KernelArguments, expect.MasterKernelArgs)
137+
// The kernel args are on the node config MCs (indices 2 and 3)
138+
// Order: 0=master auto-sizing, 1=worker auto-sizing, 2=master node config, 3=worker node config
139+
require.Equal(t, expect.MasterKernelArgs, mcs[2].Spec.KernelArguments)
127140
}
128141
})
129142
}
@@ -218,8 +231,19 @@ func TestNodeConfigCustom(t *testing.T) {
218231

219232
mcList, err = c.client.MachineconfigurationV1().MachineConfigs().List(context.TODO(), metav1.ListOptions{})
220233
require.NoError(t, err)
221-
require.Len(t, mcList.Items, 1)
222-
require.NotEqual(t, nodeKeyCustom, mcList.Items[0].Name)
234+
// Now expecting 2 MachineConfigs:
235+
// 1. Auto-sizing MC for worker (01-worker-auto-sizing-disabled)
236+
// 2. Node config MC for worker (97-worker-generated-kubelet)
237+
// Note: The pre-existing nodeKeyCustom (97-custom-generated-kubelet) is cleaned up by
238+
// cleanUpDuplicatedMC because it was created without the proper annotation
239+
require.Len(t, mcList.Items, 2)
240+
// Verify both MachineConfigs are present
241+
mcNames := make(map[string]bool)
242+
for _, mc := range mcList.Items {
243+
mcNames[mc.Name] = true
244+
}
245+
require.True(t, mcNames["01-worker-auto-sizing-disabled"], "Expected 01-worker-auto-sizing-disabled to be created")
246+
require.True(t, mcNames["97-worker-generated-kubelet"], "Expected 97-worker-generated-kubelet to be created")
223247
})
224248
}
225249
}

0 commit comments

Comments
 (0)