Skip to content
Draft
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
19 changes: 15 additions & 4 deletions pkg/controller/kubelet-config/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func createNewKubeletDynamicSystemReservedIgnition(autoSystemReserved *bool, use
var systemReservedEphemeralStorage string

if autoSystemReserved == nil {
autoNodeSizing = "false"
autoNodeSizing = "true"
} else {
autoNodeSizing = strconv.FormatBool(*autoSystemReserved)
}
Expand All @@ -68,7 +68,7 @@ func createNewKubeletDynamicSystemReservedIgnition(autoSystemReserved *bool, use
config := fmt.Sprintf("NODE_SIZING_ENABLED=%s\nSYSTEM_RESERVED_MEMORY=%s\nSYSTEM_RESERVED_CPU=%s\nSYSTEM_RESERVED_ES=%s\n",
autoNodeSizing, systemReservedMemory, systemReservedCPU, systemReservedEphemeralStorage)

r := ctrlcommon.NewIgnFileBytesOverwriting("/etc/node-sizing-enabled.env", []byte(config))
r := ctrlcommon.NewIgnFileBytesOverwriting("/etc/auto-node-sizing-enabled.env", []byte(config))
return &r
}

Expand Down Expand Up @@ -461,6 +461,7 @@ func kubeletConfigToIgnFile(cfg *kubeletconfigv1beta1.KubeletConfiguration) (*ig

// generateKubeletIgnFiles generates the Ignition files from the kubelet config
func generateKubeletIgnFiles(kubeletConfig *mcfgv1.KubeletConfig, originalKubeConfig *kubeletconfigv1beta1.KubeletConfiguration) (*ign3types.File, *ign3types.File, *ign3types.File, error) {
klog.Infof("generateKubeletIgnFiles: starting for KubeletConfig %s", kubeletConfig.Name)
var (
kubeletIgnition *ign3types.File
logLevelIgnition *ign3types.File
Expand All @@ -469,6 +470,7 @@ func generateKubeletIgnFiles(kubeletConfig *mcfgv1.KubeletConfig, originalKubeCo
userDefinedSystemReserved := make(map[string]string)

if kubeletConfig.Spec.KubeletConfig != nil && kubeletConfig.Spec.KubeletConfig.Raw != nil {
klog.Infof("generateKubeletIgnFiles: KubeletConfig %s has custom kubelet config, decoding", kubeletConfig.Name)
specKubeletConfig, err := DecodeKubeletConfig(kubeletConfig.Spec.KubeletConfig.Raw)
if err != nil {
return nil, nil, nil, fmt.Errorf("could not deserialize the new Kubelet config: %w", err)
Expand All @@ -477,16 +479,19 @@ func generateKubeletIgnFiles(kubeletConfig *mcfgv1.KubeletConfig, originalKubeCo
if val, ok := specKubeletConfig.SystemReserved["memory"]; ok {
userDefinedSystemReserved["memory"] = val
delete(specKubeletConfig.SystemReserved, "memory")
klog.Infof("generateKubeletIgnFiles: KubeletConfig %s has user-defined systemReserved memory: %s", kubeletConfig.Name, val)
}

if val, ok := specKubeletConfig.SystemReserved["cpu"]; ok {
userDefinedSystemReserved["cpu"] = val
delete(specKubeletConfig.SystemReserved, "cpu")
klog.Infof("generateKubeletIgnFiles: KubeletConfig %s has user-defined systemReserved cpu: %s", kubeletConfig.Name, val)
}

if val, ok := specKubeletConfig.SystemReserved["ephemeral-storage"]; ok {
userDefinedSystemReserved["ephemeral-storage"] = val
delete(specKubeletConfig.SystemReserved, "ephemeral-storage")
klog.Infof("generateKubeletIgnFiles: KubeletConfig %s has user-defined systemReserved ephemeral-storage: %s", kubeletConfig.Name, val)
}

// FeatureGates must be set from the FeatureGate.
Expand All @@ -502,27 +507,33 @@ func generateKubeletIgnFiles(kubeletConfig *mcfgv1.KubeletConfig, originalKubeCo
originalKubeConfig.ProtectKernelDefaults = false
}
// Merge the Old and New
klog.Infof("generateKubeletIgnFiles: merging custom kubelet config for KubeletConfig %s", kubeletConfig.Name)
err = mergo.Merge(originalKubeConfig, specKubeletConfig, mergo.WithOverride)
if err != nil {
return nil, nil, nil, fmt.Errorf("could not merge original config and new config: %w", err)
}
}

// Encode the new config into an Ignition File
klog.Infof("generateKubeletIgnFiles: encoding kubelet config to ignition file for KubeletConfig %s", kubeletConfig.Name)
kubeletIgnition, err := kubeletConfigToIgnFile(originalKubeConfig)
if err != nil {
return nil, nil, nil, fmt.Errorf("could not encode JSON: %w", err)
}

if kubeletConfig.Spec.LogLevel != nil {
klog.Infof("generateKubeletIgnFiles: creating log level ignition for KubeletConfig %s with level %d", kubeletConfig.Name, *kubeletConfig.Spec.LogLevel)
logLevelIgnition = createNewKubeletLogLevelIgnition(*kubeletConfig.Spec.LogLevel)
}
if kubeletConfig.Spec.AutoSizingReserved != nil && len(userDefinedSystemReserved) == 0 {
klog.Infof("KubeletConfig %s: autoSizingReserved is set to %t", kubeletConfig.Name, *kubeletConfig.Spec.AutoSizingReserved)
autoSizingReservedIgnition = createNewKubeletDynamicSystemReservedIgnition(kubeletConfig.Spec.AutoSizingReserved, userDefinedSystemReserved)
}
if len(userDefinedSystemReserved) > 0 {
} else if len(userDefinedSystemReserved) > 0 {
klog.Infof("KubeletConfig %s: using user-defined systemReserved values: %v", kubeletConfig.Name, userDefinedSystemReserved)
autoSizingReservedIgnition = createNewKubeletDynamicSystemReservedIgnition(nil, userDefinedSystemReserved)
}

klog.Infof("generateKubeletIgnFiles: completed for KubeletConfig %s (kubeletIgnition=%v, logLevelIgnition=%v, autoSizingReservedIgnition=%v)",
kubeletConfig.Name, kubeletIgnition != nil, logLevelIgnition != nil, autoSizingReservedIgnition != nil)
return kubeletIgnition, logLevelIgnition, autoSizingReservedIgnition, nil
}
19 changes: 11 additions & 8 deletions pkg/daemon/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -1863,27 +1863,30 @@ func (dn *Daemon) deleteStaleData(oldIgnConfig, newIgnConfig ign3types.Config) e
newFileSet[f.Path] = struct{}{}
}

// need to skip these on upgrade if they are in a MC, or else we will remove all certs!
certsToSkip := []string{
// need to skip these on upgrade if they are in a MC,
// or else we will remove all certs!
// also required to ensure that clusters with node sizing disabled are not affected
filesToSkip := []string{
userCABundleFilePath,
caBundleFilePath,
cloudCABundleFilePath,
"/etc/node-sizing-enabled.env",
}
for _, f := range oldIgnConfig.Storage.Files {
if _, ok := newFileSet[f.Path]; ok {
continue
}
skipBecauseCert := false
for _, cert := range certsToSkip {
if cert == f.Path {
skipBecauseCert = true
mustSkip := false
for _, fileToSkip := range filesToSkip {
if fileToSkip == f.Path {
mustSkip = true
break
}
}
if strings.Contains(filepath.Dir(f.Path), imageCAFilePath) {
skipBecauseCert = true
mustSkip = true
}
if skipBecauseCert {
if mustSkip {
continue
}
if _, err := os.Stat(noOrigFileStampName(f.Path)); err == nil {
Expand Down
2 changes: 1 addition & 1 deletion pkg/operator/sync_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -402,4 +402,4 @@ func buildMachineConfigurationWithBootImageUpdateEnabled() *opv1.MachineConfigur

func buildMachineConfigurationWithNoBootImageConfiguration() *opv1.MachineConfiguration {
return &opv1.MachineConfiguration{Spec: opv1.MachineConfigurationSpec{ManagedBootImages: apihelpers.GetManagedBootImagesWithNoConfiguration()}, ObjectMeta: metav1.ObjectMeta{Name: "cluster"}}
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
mode: 0644
path: "/etc/node-sizing-enabled.env"
path: "/etc/auto-node-sizing-enabled.env"
contents:
inline: |
NODE_SIZING_ENABLED=false
NODE_SIZING_ENABLED=true
SYSTEM_RESERVED_MEMORY=1Gi
SYSTEM_RESERVED_CPU=500m
SYSTEM_RESERVED_ES=1Gi
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ contents: |
# Need oneshot to delay kubelet
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=/etc/node-sizing-enabled.env
EnvironmentFile=/etc/auto-node-sizing-enabled.env
EnvironmentFile=-/etc/node-sizing-enabled.env
ExecStart=/bin/bash /usr/local/sbin/dynamic-system-reserved-calc.sh ${NODE_SIZING_ENABLED} ${SYSTEM_RESERVED_MEMORY} ${SYSTEM_RESERVED_CPU} ${SYSTEM_RESERVED_ES}
[Install]
RequiredBy=kubelet-dependencies.target