From 2fdbfd8a270535786dedabeabc89b0aaed5168c4 Mon Sep 17 00:00:00 2001 From: pacoxu Date: Wed, 19 May 2021 19:49:55 +0800 Subject: [PATCH] kubeadm: move cgroupDriver defaulting to componentconfigs/kubelet.go#Default() Signed-off-by: pacoxu --- cmd/kubeadm/app/cmd/init.go | 7 --- cmd/kubeadm/app/cmd/upgrade/plan.go | 4 -- cmd/kubeadm/app/componentconfigs/kubelet.go | 57 ++----------------- .../app/componentconfigs/kubelet_test.go | 6 ++ cmd/kubeadm/app/constants/constants.go | 5 ++ cmd/kubeadm/app/preflight/checks_linux.go | 5 +- cmd/kubeadm/app/util/cgroupdriver.go | 7 --- cmd/kubeadm/app/util/cgroupdriver_test.go | 3 +- 8 files changed, 20 insertions(+), 74 deletions(-) diff --git a/cmd/kubeadm/app/cmd/init.go b/cmd/kubeadm/app/cmd/init.go index 7119a5d13be..b1b218ce486 100644 --- a/cmd/kubeadm/app/cmd/init.go +++ b/cmd/kubeadm/app/cmd/init.go @@ -37,7 +37,6 @@ import ( phases "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/init" "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow" cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" - "k8s.io/kubernetes/cmd/kubeadm/app/componentconfigs" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/features" certsphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs" @@ -337,12 +336,6 @@ func newInitData(cmd *cobra.Command, args []string, options *initOptions, out io return nil, err } - // For new clusters we want to set the kubelet cgroup driver to "systemd" unless the user is explicit about it. - // Currently this cannot be as part of the kubelet defaulting (Default()) because the function is called for - // upgrades too, which can break existing nodes after a kubelet restart. - // TODO: https://github.com/kubernetes/kubeadm/issues/2376 - componentconfigs.MutateCgroupDriver(&cfg.ClusterConfiguration) - ignorePreflightErrorsSet, err := validation.ValidateIgnorePreflightErrors(options.ignorePreflightErrors, cfg.NodeRegistration.IgnorePreflightErrors) if err != nil { return nil, err diff --git a/cmd/kubeadm/app/cmd/upgrade/plan.go b/cmd/kubeadm/app/cmd/upgrade/plan.go index 52f7e39f33f..dfe2640fcdc 100644 --- a/cmd/kubeadm/app/cmd/upgrade/plan.go +++ b/cmd/kubeadm/app/cmd/upgrade/plan.go @@ -91,10 +91,6 @@ func runPlan(flags *planFlags, args []string) error { return errors.WithMessage(err, "[upgrade/versions] FATAL") } - // Warn if the kubelet component config is missing an explicit 'cgroupDriver'. - // TODO: https://github.com/kubernetes/kubeadm/issues/2376 - componentconfigs.WarnCgroupDriver(&cfg.ClusterConfiguration) - // No upgrades available if len(availUpgrades) == 0 { klog.V(1).Infoln("[upgrade/plan] Awesome, you're up-to-date! Enjoy!") diff --git a/cmd/kubeadm/app/componentconfigs/kubelet.go b/cmd/kubeadm/app/componentconfigs/kubelet.go index db822a2f3bf..3e3324e4ccd 100644 --- a/cmd/kubeadm/app/componentconfigs/kubelet.go +++ b/cmd/kubeadm/app/componentconfigs/kubelet.go @@ -17,10 +17,8 @@ limitations under the License. package componentconfigs import ( - "fmt" "path/filepath" - "github.com/pkg/errors" "k8s.io/apimachinery/pkg/util/version" clientset "k8s.io/client-go/kubernetes" "k8s.io/klog/v2" @@ -217,6 +215,10 @@ func (kc *kubeletConfig) Default(cfg *kubeadmapi.ClusterConfiguration, _ *kubead kc.config.CgroupDriver = driver } } + if len(kc.config.CgroupDriver) == 0 { + klog.V(1).Infof("the value of KubeletConfiguration.cgroupDriver is empty; setting it to %q", constants.CgroupDriverSystemd) + kc.config.CgroupDriver = constants.CgroupDriverSystemd + } ok, err := isServiceActive("systemd-resolved") if err != nil { @@ -241,54 +243,3 @@ func isServiceActive(name string) (bool, error) { } return initSystem.ServiceIsActive(name), nil } - -// TODO: https://github.com/kubernetes/kubeadm/issues/2376 -const cgroupDriverSystemd = "systemd" - -// MutateCgroupDriver can be called to set the KubeletConfiguration cgroup driver to systemd. -// Currently this cannot be as part of Default() because the function is called for -// upgrades too, which can break existing nodes after a kubelet restart. -// TODO: https://github.com/kubernetes/kubeadm/issues/2376 -func MutateCgroupDriver(cfg *kubeadmapi.ClusterConfiguration) { - cc, k, err := getKubeletConfig(cfg) - if err != nil { - klog.Warningf(err.Error()) - return - } - if len(k.CgroupDriver) == 0 { - klog.V(1).Infof("setting the KubeletConfiguration cgroupDriver to %q", cgroupDriverSystemd) - k.CgroupDriver = cgroupDriverSystemd - cc.Set(k) - } -} - -// WarnCgroupDriver prints a warning in case the user is not explicit -// about the cgroupDriver value in the KubeletConfiguration. -// TODO: https://github.com/kubernetes/kubeadm/issues/2376 -func WarnCgroupDriver(cfg *kubeadmapi.ClusterConfiguration) { - _, k, err := getKubeletConfig(cfg) - if err != nil { - klog.Warningf(err.Error()) - return - } - if len(k.CgroupDriver) == 0 { - klog.Warningf("The 'cgroupDriver' value in the KubeletConfiguration is empty. " + - "Starting from 1.22, 'kubeadm upgrade' will default an empty value to the 'systemd' cgroup driver. " + - "The cgroup driver between the container runtime and the kubelet must match! " + - "To learn more about this see: https://kubernetes.io/docs/setup/production-environment/container-runtimes/") - } -} - -// TODO: https://github.com/kubernetes/kubeadm/issues/2376 -func getKubeletConfig(cfg *kubeadmapi.ClusterConfiguration) (kubeadmapi.ComponentConfig, *kubeletconfig.KubeletConfiguration, error) { - errStr := fmt.Sprintf("setting the KubeletConfiguration cgroupDriver to %q failed unexpectedly", cgroupDriverSystemd) - cc, ok := cfg.ComponentConfigs[KubeletGroup] - if !ok { - return nil, nil, errors.Errorf("%s: %s", errStr, "missing kubelet component config") - } - k, ok := cc.Get().(*kubeletconfig.KubeletConfiguration) - if !ok { - return nil, nil, errors.Errorf("%s: %s", errStr, "incompatible KubeletConfiguration") - } - return cc, k, nil -} diff --git a/cmd/kubeadm/app/componentconfigs/kubelet_test.go b/cmd/kubeadm/app/componentconfigs/kubelet_test.go index f93dbebcfd8..27fa8fc35be 100644 --- a/cmd/kubeadm/app/componentconfigs/kubelet_test.go +++ b/cmd/kubeadm/app/componentconfigs/kubelet_test.go @@ -87,6 +87,7 @@ func TestKubeletDefault(t *testing.T) { HealthzPort: utilpointer.Int32Ptr(constants.KubeletHealthzPort), RotateCertificates: kubeletRotateCertificates, ResolverConfig: resolverConfig, + CgroupDriver: constants.CgroupDriverSystemd, }, }, }, @@ -120,6 +121,7 @@ func TestKubeletDefault(t *testing.T) { HealthzPort: utilpointer.Int32Ptr(constants.KubeletHealthzPort), RotateCertificates: kubeletRotateCertificates, ResolverConfig: resolverConfig, + CgroupDriver: constants.CgroupDriverSystemd, }, }, }, @@ -158,6 +160,7 @@ func TestKubeletDefault(t *testing.T) { HealthzPort: utilpointer.Int32Ptr(constants.KubeletHealthzPort), RotateCertificates: kubeletRotateCertificates, ResolverConfig: resolverConfig, + CgroupDriver: constants.CgroupDriverSystemd, }, }, }, @@ -196,6 +199,7 @@ func TestKubeletDefault(t *testing.T) { HealthzPort: utilpointer.Int32Ptr(constants.KubeletHealthzPort), RotateCertificates: kubeletRotateCertificates, ResolverConfig: resolverConfig, + CgroupDriver: constants.CgroupDriverSystemd, }, }, }, @@ -230,6 +234,7 @@ func TestKubeletDefault(t *testing.T) { HealthzPort: utilpointer.Int32Ptr(constants.KubeletHealthzPort), RotateCertificates: kubeletRotateCertificates, ResolverConfig: resolverConfig, + CgroupDriver: constants.CgroupDriverSystemd, }, }, }, @@ -261,6 +266,7 @@ func TestKubeletDefault(t *testing.T) { HealthzPort: utilpointer.Int32Ptr(constants.KubeletHealthzPort), RotateCertificates: kubeletRotateCertificates, ResolverConfig: resolverConfig, + CgroupDriver: constants.CgroupDriverSystemd, }, }, }, diff --git a/cmd/kubeadm/app/constants/constants.go b/cmd/kubeadm/app/constants/constants.go index 7a3aca32605..edaf8524aa5 100644 --- a/cmd/kubeadm/app/constants/constants.go +++ b/cmd/kubeadm/app/constants/constants.go @@ -398,6 +398,11 @@ const ( // PauseVersion indicates the default pause image version for kubeadm PauseVersion = "3.4.1" + + // CgroupDriverSystemd holds the systemd driver type + CgroupDriverSystemd = "systemd" + // CgroupDriverCgroupfs holds the cgroupfs driver type + CgroupDriverCgroupfs = "cgroupfs" ) var ( diff --git a/cmd/kubeadm/app/preflight/checks_linux.go b/cmd/kubeadm/app/preflight/checks_linux.go index 7efc2757279..8fd0ae2443e 100644 --- a/cmd/kubeadm/app/preflight/checks_linux.go +++ b/cmd/kubeadm/app/preflight/checks_linux.go @@ -22,6 +22,7 @@ import ( "syscall" "github.com/pkg/errors" + "k8s.io/kubernetes/cmd/kubeadm/app/constants" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" "k8s.io/utils/exec" ) @@ -32,12 +33,12 @@ func (idsc IsDockerSystemdCheck) Check() (warnings, errorList []error) { if err != nil { return nil, []error{err} } - if driver != kubeadmutil.CgroupDriverSystemd { + if driver != constants.CgroupDriverSystemd { err = errors.Errorf("detected %q as the Docker cgroup driver. "+ "The recommended driver is %q. "+ "Please follow the guide at https://kubernetes.io/docs/setup/cri/", driver, - kubeadmutil.CgroupDriverSystemd) + constants.CgroupDriverSystemd) return []error{err}, nil } return nil, nil diff --git a/cmd/kubeadm/app/util/cgroupdriver.go b/cmd/kubeadm/app/util/cgroupdriver.go index ca552b1d7f0..49cd53fd71c 100644 --- a/cmd/kubeadm/app/util/cgroupdriver.go +++ b/cmd/kubeadm/app/util/cgroupdriver.go @@ -24,13 +24,6 @@ import ( utilsexec "k8s.io/utils/exec" ) -const ( - // CgroupDriverSystemd holds the systemd driver type - CgroupDriverSystemd = "systemd" - // CgroupDriverCgroupfs holds the cgroupfs driver type - CgroupDriverCgroupfs = "cgroupfs" -) - // TODO: add support for detecting the cgroup driver for CRI other than // Docker. Currently only Docker driver detection is supported: // Discussion: diff --git a/cmd/kubeadm/app/util/cgroupdriver_test.go b/cmd/kubeadm/app/util/cgroupdriver_test.go index 3d6b66373d3..2a26798e54e 100644 --- a/cmd/kubeadm/app/util/cgroupdriver_test.go +++ b/cmd/kubeadm/app/util/cgroupdriver_test.go @@ -17,6 +17,7 @@ limitations under the License. package util import ( + "k8s.io/kubernetes/cmd/kubeadm/app/constants" "testing" ) @@ -50,7 +51,7 @@ func TestGetCgroupDriverDocker(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - result := tc.driver != CgroupDriverCgroupfs && tc.driver != CgroupDriverSystemd + result := tc.driver != constants.CgroupDriverCgroupfs && tc.driver != constants.CgroupDriverSystemd if result != tc.expectedError { t.Fatalf("expected error: %v, saw: %v", tc.expectedError, result) }