diff --git a/pkg/kapi/kapi.go b/pkg/kapi/kapi.go index 37dd0c559911..f589d935d551 100644 --- a/pkg/kapi/kapi.go +++ b/pkg/kapi/kapi.go @@ -211,3 +211,26 @@ func IsRetryableAPIError(err error) bool { func KubectlBinaryPath(version string) string { return path.Join(vmpath.GuestPersistentDir, "binaries", version, "kubectl") } + +// ScaleDeployment sets the number of replicas of deployment in namespace and context +func ScaleDeployment(context, namespace, deploymentName string, replicas int) error { + client, err := Client(context) + if err != nil { + return fmt.Errorf("client: %v", err) + } + + scale, err := client.AppsV1().Deployments(namespace).GetScale(deploymentName, meta.GetOptions{}) + if err != nil { + return fmt.Errorf("deployment scale: %v", err) + } + if scale.Spec.Replicas != int32(replicas) { + scale.Spec.Replicas = int32(replicas) + _, err = client.AppsV1().Deployments(namespace).UpdateScale(deploymentName, scale) + if err != nil { + return fmt.Errorf("deployment rescale: %v", err) + } + } + klog.Infof("deployment %q in namespace %q and context %q rescaled to %d", deploymentName, namespace, context, replicas) + + return nil +} diff --git a/pkg/minikube/node/start.go b/pkg/minikube/node/start.go index 85e1d284882b..5a7a684cff8e 100644 --- a/pkg/minikube/node/start.go +++ b/pkg/minikube/node/start.go @@ -32,7 +32,9 @@ import ( "github.com/pkg/errors" "github.com/spf13/viper" "golang.org/x/sync/errgroup" + meta "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/klog/v2" + kconst "k8s.io/kubernetes/cmd/kubeadm/app/constants" cmdcfg "k8s.io/minikube/cmd/minikube/cmd/config" "k8s.io/minikube/pkg/addons" "k8s.io/minikube/pkg/drivers/kic/oci" @@ -123,6 +125,11 @@ func Start(starter Starter, apiServer bool) (*kubeconfig.Settings, error) { if err := kubeconfig.Update(kcs); err != nil { return nil, errors.Wrap(err, "Failed kubeconfig update") } + + // scale down CoreDNS from default 2 to 1 replica + if err := kapi.ScaleDeployment(starter.Cfg.Name, meta.NamespaceSystem, kconst.CoreDNSDeploymentName, 1); err != nil { + klog.Errorf("Unable to scale down deployment %q in namespace %q to 1 replica: %v", kconst.CoreDNSDeploymentName, meta.NamespaceSystem, err) + } } else { bs, err = cluster.Bootstrapper(starter.MachineAPI, viper.GetString(cmdcfg.Bootstrapper), *starter.Cfg, starter.Runner) if err != nil { @@ -161,12 +168,6 @@ func Start(starter Starter, apiServer bool) (*kubeconfig.Settings, error) { go addons.Start(&wg, starter.Cfg, starter.ExistingAddons, config.AddonList) } - wg.Add(1) - go func() { - rescaleCoreDNS(starter.Cfg, starter.Runner) - wg.Done() - }() - if apiServer { // special ops for none , like change minikube directory. // multinode super doesn't work on the none driver @@ -589,15 +590,3 @@ func prepareNone() { exit.Message(reason.HostHomeChown, "Failed to change permissions for {{.minikube_dir_path}}: {{.error}}", out.V{"minikube_dir_path": localpath.MiniPath(), "error": err}) } } - -// rescaleCoreDNS attempts to reduce coredns replicas from 2 to 1 to improve CPU overhead -// no worries if this doesn't work -func rescaleCoreDNS(cc *config.ClusterConfig, runner command.Runner) { - kubectl := kapi.KubectlBinaryPath(cc.KubernetesConfig.KubernetesVersion) - cmd := exec.Command("sudo", "KUBECONFIG=/var/lib/minikube/kubeconfig", kubectl, "scale", "deployment", "--replicas=1", "coredns", "-n=kube-system") - if _, err := runner.RunCmd(cmd); err != nil { - klog.Warningf("unable to scale coredns replicas to 1: %v", err) - } else { - klog.Infof("successfully scaled coredns replicas to 1") - } -}