diff --git a/cmd/minikube/cmd/node_add.go b/cmd/minikube/cmd/node_add.go index b90a41ddcf58..5ba3ed0ba736 100644 --- a/cmd/minikube/cmd/node_add.go +++ b/cmd/minikube/cmd/node_add.go @@ -29,6 +29,7 @@ import ( "k8s.io/minikube/pkg/minikube/out/register" "k8s.io/minikube/pkg/minikube/reason" "k8s.io/minikube/pkg/minikube/style" + "k8s.io/minikube/pkg/util" ) var ( @@ -67,6 +68,10 @@ var nodeAddCmd = &cobra.Command{ } if n.ControlPlane { + err := util.CheckMultiControlPlaneVersion(cc.KubernetesConfig.KubernetesVersion) + if err != nil { + exit.Error(reason.KubernetesTooOld, "target kubernetes version too old", err) + } n.Port = cc.KubernetesConfig.NodePort } diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 8bb3d0ae9811..891a293703fe 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -137,6 +137,13 @@ func runStart(cmd *cobra.Command, args []string) { out.WarningT(fmt.Sprintf("control planes number %v larger than nodes number %v, enlarge nodes to %v.", controlPlanesNum, nodesNum, controlPlanesNum)) viper.Set(nodes, controlPlanesNum) } + k8sVersion := viper.GetString(kubernetesVersion) + if controlPlanesNum > 1 { + err := util.CheckMultiControlPlaneVersion(k8sVersion) + if err != nil { + exit.Error(reason.KubernetesTooOld, "target kubernetes version too old", err) + } + } out.SetJSON(outputFormat == "json") if err := pkgtrace.Initialize(viper.GetString(trace)); err != nil { diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go index 76756ef1701e..4876444acb5e 100644 --- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go +++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go @@ -236,7 +236,7 @@ func (k *Bootstrapper) init(cfg config.ClusterConfig) error { ctx, cancel := context.WithTimeout(context.Background(), initTimeoutMinutes*time.Minute) defer cancel() kr, kw := io.Pipe() - c := exec.CommandContext(ctx, "/bin/bash", "-c", fmt.Sprintf("%s init --config %s %s --ignore-preflight-errors=%s --upload-certs", + c := exec.CommandContext(ctx, "/bin/bash", "-c", fmt.Sprintf("%s init --config %s %s --ignore-preflight-errors=%s", bsutil.InvokeKubeadm(cfg.KubernetesConfig.KubernetesVersion), conf, extraFlags, strings.Join(ignore, ","))) c.Stdout = kw c.Stderr = kw diff --git a/pkg/util/utils.go b/pkg/util/utils.go index f5fe5a3b226a..d49631e44146 100644 --- a/pkg/util/utils.go +++ b/pkg/util/utils.go @@ -109,3 +109,14 @@ func MaybeChownDirRecursiveToMinikubeUser(dir string) error { func ParseKubernetesVersion(version string) (semver.Version, error) { return semver.Make(version[1:]) } + +func CheckMultiControlPlaneVersion(version string) error { + ver, err := ParseKubernetesVersion(version) + if err != nil { + return err + } + if ver.Minor < 16 { + return errors.Errorf("Multi control plane requires Kubernetes 1.16+, current version %s is not supported.", version) + } + return nil +}