From a451577e24112505df845bed93afe456b4d40efa Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Fri, 15 May 2020 17:08:10 -0700 Subject: [PATCH 01/10] move node ip save farther down stack --- pkg/minikube/machine/cluster_test.go | 32 ++++++++++++++-------------- pkg/minikube/machine/fix.go | 14 ++++++------ pkg/minikube/machine/start.go | 26 ++++++++++++++++------ pkg/minikube/node/start.go | 13 +++-------- 4 files changed, 45 insertions(+), 40 deletions(-) diff --git a/pkg/minikube/machine/cluster_test.go b/pkg/minikube/machine/cluster_test.go index 3dfdc303e2..47adadcfbf 100644 --- a/pkg/minikube/machine/cluster_test.go +++ b/pkg/minikube/machine/cluster_test.go @@ -81,7 +81,7 @@ func TestCreateHost(t *testing.T) { t.Fatal("Machine already exists.") } - _, err := createHost(api, defaultClusterConfig, config.Node{Name: "minikube"}) + _, err := createHost(api, &defaultClusterConfig, &config.Node{Name: "minikube"}) if err != nil { t.Fatalf("Error creating host: %v", err) } @@ -122,7 +122,7 @@ func TestStartHostExists(t *testing.T) { api := tests.NewMockAPI(t) // Create an initial host. - ih, err := createHost(api, defaultClusterConfig, config.Node{Name: "minikube"}) + ih, err := createHost(api, &defaultClusterConfig, &config.Node{Name: "minikube"}) if err != nil { t.Fatalf("Error creating host: %v", err) } @@ -142,7 +142,7 @@ func TestStartHostExists(t *testing.T) { n := config.Node{Name: ih.Name} // This should pass without calling Create because the host exists already. - h, _, err := StartHost(api, mc, n) + h, _, err := StartHost(api, &mc, &n) if err != nil { t.Fatalf("Error starting host: %v", err) } @@ -161,7 +161,7 @@ func TestStartHostErrMachineNotExist(t *testing.T) { api := tests.NewMockAPI(t) // Create an incomplete host with machine does not exist error(i.e. User Interrupt Cancel) api.NotExistError = true - h, err := createHost(api, defaultClusterConfig, config.Node{Name: "minikube"}) + h, err := createHost(api, &defaultClusterConfig, &config.Node{Name: "minikube"}) if err != nil { t.Fatalf("Error creating host: %v", err) } @@ -175,7 +175,7 @@ func TestStartHostErrMachineNotExist(t *testing.T) { n := config.Node{Name: h.Name} // This should pass with creating host, while machine does not exist. - h, _, err = StartHost(api, mc, n) + h, _, err = StartHost(api, &mc, &n) if err != nil { if err != constants.ErrMachineMissing { t.Fatalf("Error starting host: %v", err) @@ -188,7 +188,7 @@ func TestStartHostErrMachineNotExist(t *testing.T) { n.Name = h.Name // Second call. This should pass without calling Create because the host exists already. - h, _, err = StartHost(api, mc, n) + h, _, err = StartHost(api, &mc, &n) if err != nil { t.Fatalf("Error starting host: %v", err) } @@ -207,7 +207,7 @@ func TestStartStoppedHost(t *testing.T) { RegisterMockDriver(t) api := tests.NewMockAPI(t) // Create an initial host. - h, err := createHost(api, defaultClusterConfig, config.Node{Name: "minikube"}) + h, err := createHost(api, &defaultClusterConfig, &config.Node{Name: "minikube"}) if err != nil { t.Fatalf("Error creating host: %v", err) } @@ -220,7 +220,7 @@ func TestStartStoppedHost(t *testing.T) { mc := defaultClusterConfig mc.Name = h.Name n := config.Node{Name: h.Name} - h, _, err = StartHost(api, mc, n) + h, _, err = StartHost(api, &mc, &n) if err != nil { t.Fatal("Error starting host.") } @@ -247,7 +247,7 @@ func TestStartHost(t *testing.T) { md := &tests.MockDetector{Provisioner: &tests.MockProvisioner{}} provision.SetDetector(md) - h, _, err := StartHost(api, defaultClusterConfig, config.Node{Name: "minikube"}) + h, _, err := StartHost(api, &defaultClusterConfig, &config.Node{Name: "minikube"}) if err != nil { t.Fatal("Error starting host.") } @@ -283,7 +283,7 @@ func TestStartHostConfig(t *testing.T) { DockerOpt: []string{"param=value"}, } - h, _, err := StartHost(api, cfg, config.Node{Name: "minikube"}) + h, _, err := StartHost(api, &cfg, &config.Node{Name: "minikube"}) if err != nil { t.Fatal("Error starting host.") } @@ -313,7 +313,7 @@ func TestStopHostError(t *testing.T) { func TestStopHost(t *testing.T) { RegisterMockDriver(t) api := tests.NewMockAPI(t) - h, err := createHost(api, defaultClusterConfig, config.Node{Name: "minikube"}) + h, err := createHost(api, &defaultClusterConfig, &config.Node{Name: "minikube"}) if err != nil { t.Errorf("createHost failed: %v", err) } @@ -332,7 +332,7 @@ func TestStopHost(t *testing.T) { func TestDeleteHost(t *testing.T) { RegisterMockDriver(t) api := tests.NewMockAPI(t) - if _, err := createHost(api, defaultClusterConfig, config.Node{Name: "minikube"}); err != nil { + if _, err := createHost(api, &defaultClusterConfig, &config.Node{Name: "minikube"}); err != nil { t.Errorf("createHost failed: %v", err) } @@ -347,7 +347,7 @@ func TestDeleteHost(t *testing.T) { func TestDeleteHostErrorDeletingVM(t *testing.T) { RegisterMockDriver(t) api := tests.NewMockAPI(t) - h, err := createHost(api, defaultClusterConfig, config.Node{Name: "minikube"}) + h, err := createHost(api, &defaultClusterConfig, &config.Node{Name: "minikube"}) if err != nil { t.Errorf("createHost failed: %v", err) } @@ -364,7 +364,7 @@ func TestDeleteHostErrorDeletingFiles(t *testing.T) { RegisterMockDriver(t) api := tests.NewMockAPI(t) api.RemoveError = true - if _, err := createHost(api, defaultClusterConfig, config.Node{Name: "minikube"}); err != nil { + if _, err := createHost(api, &defaultClusterConfig, &config.Node{Name: "minikube"}); err != nil { t.Errorf("createHost failed: %v", err) } @@ -378,7 +378,7 @@ func TestDeleteHostErrMachineNotExist(t *testing.T) { api := tests.NewMockAPI(t) // Create an incomplete host with machine does not exist error(i.e. User Interrupt Cancel) api.NotExistError = true - _, err := createHost(api, defaultClusterConfig, config.Node{Name: "minikube"}) + _, err := createHost(api, &defaultClusterConfig, &config.Node{Name: "minikube"}) if err != nil { t.Errorf("createHost failed: %v", err) } @@ -409,7 +409,7 @@ func TestStatus(t *testing.T) { checkState(state.None.String(), m) - if _, err := createHost(api, cc, config.Node{Name: "minikube"}); err != nil { + if _, err := createHost(api, &cc, &config.Node{Name: "minikube"}); err != nil { t.Errorf("createHost failed: %v", err) } diff --git a/pkg/minikube/machine/fix.go b/pkg/minikube/machine/fix.go index 934316f687..36daedfeb5 100644 --- a/pkg/minikube/machine/fix.go +++ b/pkg/minikube/machine/fix.go @@ -48,14 +48,14 @@ const ( ) // fixHost fixes up a previously configured VM so that it is ready to run Kubernetes -func fixHost(api libmachine.API, cc config.ClusterConfig, n config.Node) (*host.Host, error) { +func fixHost(api libmachine.API, cc *config.ClusterConfig, n *config.Node) (*host.Host, error) { start := time.Now() glog.Infof("fixHost starting: %s", n.Name) defer func() { glog.Infof("fixHost completed within %s", time.Since(start)) }() - h, err := api.Load(driver.MachineName(cc, n)) + h, err := api.Load(driver.MachineName(*cc, *n)) if err != nil { return h, errors.Wrap(err, "Error loading existing host. Please try running [minikube delete], then run [minikube start] again.") } @@ -72,7 +72,7 @@ func fixHost(api libmachine.API, cc config.ClusterConfig, n config.Node) (*host. // Avoid reprovisioning "none" driver because provision.Detect requires SSH if !driver.BareMetal(h.Driver.DriverName()) { - e := engineOptions(cc) + e := engineOptions(*cc) h.HostOptions.EngineOptions.Env = e.Env err = provisionDockerMachine(h) if err != nil { @@ -84,7 +84,7 @@ func fixHost(api libmachine.API, cc config.ClusterConfig, n config.Node) (*host. return h, nil } - if err := postStartSetup(h, cc); err != nil { + if err := postStartSetup(h, *cc); err != nil { return h, errors.Wrap(err, "post-start") } @@ -96,8 +96,8 @@ func fixHost(api libmachine.API, cc config.ClusterConfig, n config.Node) (*host. return h, ensureSyncedGuestClock(h, driverName) } -func recreateIfNeeded(api libmachine.API, cc config.ClusterConfig, n config.Node, h *host.Host) (*host.Host, error) { - machineName := driver.MachineName(cc, n) +func recreateIfNeeded(api libmachine.API, cc *config.ClusterConfig, n *config.Node, h *host.Host) (*host.Host, error) { + machineName := driver.MachineName(*cc, *n) machineType := driver.MachineType(cc.Driver) recreated := false s, serr := h.Driver.GetState() @@ -112,7 +112,7 @@ func recreateIfNeeded(api libmachine.API, cc config.ClusterConfig, n config.Node if !me || err == constants.ErrMachineMissing { out.T(out.Shrug, `{{.driver_name}} "{{.cluster}}" {{.machine_type}} is missing, will recreate.`, out.V{"driver_name": cc.Driver, "cluster": cc.Name, "machine_type": machineType}) - demolish(api, cc, n, h) + demolish(api, *cc, *n, h) glog.Infof("Sleeping 1 second for extra luck!") time.Sleep(1 * time.Second) diff --git a/pkg/minikube/machine/start.go b/pkg/minikube/machine/start.go index e44ad685fd..d1ffc15d73 100644 --- a/pkg/minikube/machine/start.go +++ b/pkg/minikube/machine/start.go @@ -61,8 +61,8 @@ var ( ) // StartHost starts a host VM. -func StartHost(api libmachine.API, cfg config.ClusterConfig, n config.Node) (*host.Host, bool, error) { - machineName := driver.MachineName(cfg, n) +func StartHost(api libmachine.API, cfg *config.ClusterConfig, n *config.Node) (*host.Host, bool, error) { + machineName := driver.MachineName(*cfg, *n) // Prevent machine-driver boot races, as well as our own certificate race releaser, err := acquireMachinesLock(machineName) @@ -100,7 +100,7 @@ func engineOptions(cfg config.ClusterConfig) *engine.Options { return &o } -func createHost(api libmachine.API, cfg config.ClusterConfig, n config.Node) (*host.Host, error) { +func createHost(api libmachine.API, cfg *config.ClusterConfig, n *config.Node) (*host.Host, error) { glog.Infof("createHost starting for %q (driver=%q)", n.Name, cfg.Driver) start := time.Now() defer func() { @@ -113,12 +113,12 @@ func createHost(api libmachine.API, cfg config.ClusterConfig, n config.Node) (*h See https://minikube.sigs.k8s.io/docs/reference/drivers/vmware/ for more information. To disable this message, run [minikube config set ShowDriverDeprecationNotification false]`) } - showHostInfo(cfg) + showHostInfo(*cfg) def := registry.Driver(cfg.Driver) if def.Empty() { return nil, fmt.Errorf("unsupported/missing driver: %s", cfg.Driver) } - dd, err := def.Config(cfg, n) + dd, err := def.Config(*cfg, *n) if err != nil { return nil, errors.Wrap(err, "config") } @@ -134,7 +134,7 @@ func createHost(api libmachine.API, cfg config.ClusterConfig, n config.Node) (*h h.HostOptions.AuthOptions.CertDir = localpath.MiniPath() h.HostOptions.AuthOptions.StorePath = localpath.MiniPath() - h.HostOptions.EngineOptions = engineOptions(cfg) + h.HostOptions.EngineOptions = engineOptions(*cfg) cstart := time.Now() glog.Infof("libmachine.API.Create for %q (driver=%q)", cfg.Name, cfg.Driver) @@ -144,13 +144,25 @@ func createHost(api libmachine.API, cfg config.ClusterConfig, n config.Node) (*h } glog.Infof("duration metric: libmachine.API.Create for %q took %s", cfg.Name, time.Since(cstart)) - if err := postStartSetup(h, cfg); err != nil { + if err := postStartSetup(h, *cfg); err != nil { return h, errors.Wrap(err, "post-start") } if err := api.Save(h); err != nil { return nil, errors.Wrap(err, "save") } + + // Save IP to config file for subsequent use + ip, err := h.Driver.GetIP() + if err != nil { + return h, err + } + n.IP = ip + err = config.SaveNode(cfg, n) + if err != nil { + return h, err + } + return h, nil } diff --git a/pkg/minikube/node/start.go b/pkg/minikube/node/start.go index e8b90a66f0..44de1cad81 100644 --- a/pkg/minikube/node/start.go +++ b/pkg/minikube/node/start.go @@ -325,7 +325,7 @@ func startMachine(cfg *config.ClusterConfig, node *config.Node) (runner command. if err != nil { return runner, preExists, m, host, errors.Wrap(err, "Failed to get machine client") } - host, preExists, err = startHost(m, *cfg, *node) + host, preExists, err = startHost(m, cfg, node) if err != nil { return runner, preExists, m, host, errors.Wrap(err, "Failed to start host") } @@ -345,18 +345,11 @@ func startMachine(cfg *config.ClusterConfig, node *config.Node) (runner command. out.FailureT("Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}`.", out.V{"ip": ip}) } - // Save IP to config file for subsequent use - node.IP = ip - err = config.SaveNode(cfg, node) - if err != nil { - return runner, preExists, m, host, errors.Wrap(err, "saving node") - } - return runner, preExists, m, host, err } // startHost starts a new minikube host using a VM or None -func startHost(api libmachine.API, cc config.ClusterConfig, n config.Node) (*host.Host, bool, error) { +func startHost(api libmachine.API, cc *config.ClusterConfig, n *config.Node) (*host.Host, bool, error) { host, exists, err := machine.StartHost(api, cc, n) if err == nil { return host, exists, nil @@ -364,7 +357,7 @@ func startHost(api libmachine.API, cc config.ClusterConfig, n config.Node) (*hos // NOTE: People get very cranky if you delete their prexisting VM. Only delete new ones. if !exists { - err := machine.DeleteHost(api, driver.MachineName(cc, n)) + err := machine.DeleteHost(api, driver.MachineName(*cc, *n)) if err != nil { glog.Warningf("delete host: %v", err) } From a9b29a71a52ac189f75876a04e1ef44732fa5384 Mon Sep 17 00:00:00 2001 From: Priya Wadhwa Date: Mon, 18 May 2020 14:59:35 -0700 Subject: [PATCH 02/10] Improve documentation for minikube installation via brew --- site/content/en/docs/start/_index.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/site/content/en/docs/start/_index.md b/site/content/en/docs/start/_index.md index 71746209e2..3ef4b7bb30 100644 --- a/site/content/en/docs/start/_index.md +++ b/site/content/en/docs/start/_index.md @@ -56,6 +56,12 @@ If the [Brew Package Manager](https://brew.sh/) installed: brew install minikube ``` +If `which minikube` fails after installation via brew, you may have to link the binary: + +``` +brew link minikube +``` + Otherwise, download minikube directly: ```shell From 2f2a8357a871ce50da18b7679e31980c53a3cc6d Mon Sep 17 00:00:00 2001 From: Medya Gh Date: Mon, 18 May 2020 18:04:45 -0700 Subject: [PATCH 03/10] fix proxy envs not being passed to docker engine --- cmd/minikube/cmd/start.go | 19 ------------------- cmd/minikube/cmd/start_flags.go | 3 ++- pkg/minikube/machine/start.go | 22 +++++++++++++++++++++- pkg/minikube/node/start.go | 3 ++- pkg/minikube/proxy/proxy.go | 21 +++++++++++++++++++++ 5 files changed, 46 insertions(+), 22 deletions(-) diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 0d52db44ac..3435f7a886 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -56,7 +56,6 @@ import ( "k8s.io/minikube/pkg/minikube/node" "k8s.io/minikube/pkg/minikube/notify" "k8s.io/minikube/pkg/minikube/out" - "k8s.io/minikube/pkg/minikube/proxy" "k8s.io/minikube/pkg/minikube/registry" "k8s.io/minikube/pkg/minikube/translate" "k8s.io/minikube/pkg/util" @@ -909,24 +908,6 @@ func createNode(cc config.ClusterConfig, kubeNodeName string, existing *config.C return cc, cp, nil } -// setDockerProxy sets the proxy environment variables in the docker environment. -func setDockerProxy() { - for _, k := range proxy.EnvVars { - if v := os.Getenv(k); v != "" { - // convert https_proxy to HTTPS_PROXY for linux - // TODO (@medyagh): if user has both http_proxy & HTTPS_PROXY set merge them. - k = strings.ToUpper(k) - if k == "HTTP_PROXY" || k == "HTTPS_PROXY" { - if strings.HasPrefix(v, "localhost") || strings.HasPrefix(v, "127.0") { - out.WarningT("Not passing {{.name}}={{.value}} to docker env.", out.V{"name": k, "value": v}) - continue - } - } - config.DockerEnv = append(config.DockerEnv, fmt.Sprintf("%s=%s", k, v)) - } - } -} - // autoSetDriverOptions sets the options needed for specific driver automatically. func autoSetDriverOptions(cmd *cobra.Command, drvName string) (err error) { err = nil diff --git a/cmd/minikube/cmd/start_flags.go b/cmd/minikube/cmd/start_flags.go index 582f85021c..de41ab180a 100644 --- a/cmd/minikube/cmd/start_flags.go +++ b/cmd/minikube/cmd/start_flags.go @@ -36,6 +36,7 @@ import ( "k8s.io/minikube/pkg/minikube/driver" "k8s.io/minikube/pkg/minikube/exit" "k8s.io/minikube/pkg/minikube/out" + "k8s.io/minikube/pkg/minikube/proxy" pkgutil "k8s.io/minikube/pkg/util" "k8s.io/minikube/pkg/version" ) @@ -341,7 +342,7 @@ func generateClusterConfig(cmd *cobra.Command, existing *config.ClusterConfig, k // Feed Docker our host proxy environment by default, so that it can pull images // doing this for both new config and existing, in case proxy changed since previous start if _, ok := r.(*cruntime.Docker); ok && !cmd.Flags().Changed("docker-env") { - setDockerProxy() + proxy.SetDockerEnv() } var kubeNodeName string diff --git a/pkg/minikube/machine/start.go b/pkg/minikube/machine/start.go index e44ad685fd..be0d1f84f8 100644 --- a/pkg/minikube/machine/start.go +++ b/pkg/minikube/machine/start.go @@ -39,6 +39,7 @@ import ( "k8s.io/minikube/pkg/minikube/driver" "k8s.io/minikube/pkg/minikube/localpath" "k8s.io/minikube/pkg/minikube/out" + "k8s.io/minikube/pkg/minikube/proxy" "k8s.io/minikube/pkg/minikube/registry" "k8s.io/minikube/pkg/minikube/vmpath" "k8s.io/minikube/pkg/util/lock" @@ -89,9 +90,28 @@ func StartHost(api libmachine.API, cfg config.ClusterConfig, n config.Node) (*ho return h, exists, err } +// engineOptions returns docker engine options for the dockerd running inside minikube func engineOptions(cfg config.ClusterConfig) *engine.Options { + // get docker env from user's proxy settings + dockerEnv := proxy.SetDockerEnv() + // get docker env from user specifiec config + dockerEnv = append(dockerEnv, cfg.DockerEnv...) + + // remove duplicates + seen := map[string]bool{} + uniqueEnvs := []string{} + for e := range dockerEnv { + if !seen[dockerEnv[e]] { + seen[dockerEnv[e]] = true + uniqueEnvs = append(uniqueEnvs, dockerEnv[e]) + } + } + + // config.DockerEnv is a global so we update that one too + config.DockerEnv = uniqueEnvs + o := engine.Options{ - Env: cfg.DockerEnv, + Env: uniqueEnvs, InsecureRegistry: append([]string{constants.DefaultServiceCIDR}, cfg.InsecureRegistry...), RegistryMirror: cfg.RegistryMirror, ArbitraryFlags: cfg.DockerOpt, diff --git a/pkg/minikube/node/start.go b/pkg/minikube/node/start.go index e8b90a66f0..24b0fc3c38 100644 --- a/pkg/minikube/node/start.go +++ b/pkg/minikube/node/start.go @@ -410,7 +410,8 @@ func validateNetwork(h *host.Host, r command.Runner, imageRepository string) (st ipExcluded := proxy.IsIPExcluded(ip) // Skip warning if minikube ip is already in NO_PROXY k = strings.ToUpper(k) // for http_proxy & https_proxy if (k == "HTTP_PROXY" || k == "HTTPS_PROXY") && !ipExcluded && !warnedOnce { - out.WarningT("You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}). Please see {{.documentation_url}} for more details", out.V{"ip_address": ip, "documentation_url": "https://minikube.sigs.k8s.io/docs/handbook/vpn_and_proxy/"}) + out.WarningT("You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).", out.V{"ip_address": ip}) + out.T(out.Documentation, "Please see {{.documentation_url}} for more details", out.V{"documentation_url": "https://minikube.sigs.k8s.io/docs/handbook/vpn_and_proxy/"}) warnedOnce = true } } diff --git a/pkg/minikube/proxy/proxy.go b/pkg/minikube/proxy/proxy.go index c6a539a8a3..0c95f23258 100644 --- a/pkg/minikube/proxy/proxy.go +++ b/pkg/minikube/proxy/proxy.go @@ -26,6 +26,8 @@ import ( "github.com/golang/glog" "github.com/pkg/errors" "k8s.io/client-go/rest" + "k8s.io/minikube/pkg/minikube/config" + "k8s.io/minikube/pkg/minikube/out" ) // EnvVars are variables we plumb through to the underlying container runtime @@ -149,3 +151,22 @@ func UpdateTransport(cfg *rest.Config) *rest.Config { } return cfg } + +// SetDockerEnv sets the proxy environment variables in the docker environment. +func SetDockerEnv() []string { + for _, k := range EnvVars { + if v := os.Getenv(k); v != "" { + // convert https_proxy to HTTPS_PROXY for linux + // TODO (@medyagh): if user has both http_proxy & HTTPS_PROXY set merge them. + k = strings.ToUpper(k) + if k == "HTTP_PROXY" || k == "HTTPS_PROXY" { + if strings.HasPrefix(v, "localhost") || strings.HasPrefix(v, "127.0") { + out.WarningT("Not passing {{.name}}={{.value}} to docker env.", out.V{"name": k, "value": v}) + continue + } + } + config.DockerEnv = append(config.DockerEnv, fmt.Sprintf("%s=%s", k, v)) + } + } + return config.DockerEnv +} From 80d1c8741d56834d812de016dc9d2f924341149b Mon Sep 17 00:00:00 2001 From: Medya Gh Date: Mon, 18 May 2020 18:17:45 -0700 Subject: [PATCH 04/10] improve unit test log --- pkg/minikube/machine/cluster_test.go | 2 +- pkg/minikube/machine/start.go | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/pkg/minikube/machine/cluster_test.go b/pkg/minikube/machine/cluster_test.go index 3dfdc303e2..3adbcf4a34 100644 --- a/pkg/minikube/machine/cluster_test.go +++ b/pkg/minikube/machine/cluster_test.go @@ -290,7 +290,7 @@ func TestStartHostConfig(t *testing.T) { for i := range h.HostOptions.EngineOptions.Env { if h.HostOptions.EngineOptions.Env[i] != cfg.DockerEnv[i] { - t.Fatal("Docker env variables were not set!") + t.Fatalf("Docker env variables were not set! got %+v but want %+v",h.HostOptions.EngineOptions.Env,cfg.DockerEnv) } } diff --git a/pkg/minikube/machine/start.go b/pkg/minikube/machine/start.go index be0d1f84f8..fc8d7d541d 100644 --- a/pkg/minikube/machine/start.go +++ b/pkg/minikube/machine/start.go @@ -107,9 +107,6 @@ func engineOptions(cfg config.ClusterConfig) *engine.Options { } } - // config.DockerEnv is a global so we update that one too - config.DockerEnv = uniqueEnvs - o := engine.Options{ Env: uniqueEnvs, InsecureRegistry: append([]string{constants.DefaultServiceCIDR}, cfg.InsecureRegistry...), From 32bf4d46a7202ff0d0d7e1500ba0a49d6bf37c87 Mon Sep 17 00:00:00 2001 From: Medya Gh Date: Mon, 18 May 2020 18:26:11 -0700 Subject: [PATCH 05/10] add unique --- cmd/minikube/cmd/start_flags.go | 2 +- pkg/minikube/proxy/proxy.go | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/cmd/minikube/cmd/start_flags.go b/cmd/minikube/cmd/start_flags.go index de41ab180a..075143845e 100644 --- a/cmd/minikube/cmd/start_flags.go +++ b/cmd/minikube/cmd/start_flags.go @@ -341,7 +341,7 @@ func generateClusterConfig(cmd *cobra.Command, existing *config.ClusterConfig, k // Feed Docker our host proxy environment by default, so that it can pull images // doing this for both new config and existing, in case proxy changed since previous start - if _, ok := r.(*cruntime.Docker); ok && !cmd.Flags().Changed("docker-env") { + if _, ok := r.(*cruntime.Docker); ok { proxy.SetDockerEnv() } diff --git a/pkg/minikube/proxy/proxy.go b/pkg/minikube/proxy/proxy.go index 0c95f23258..63aea41a16 100644 --- a/pkg/minikube/proxy/proxy.go +++ b/pkg/minikube/proxy/proxy.go @@ -168,5 +168,17 @@ func SetDockerEnv() []string { config.DockerEnv = append(config.DockerEnv, fmt.Sprintf("%s=%s", k, v)) } } + + // remove duplicates + seen := map[string]bool{} + uniqueEnvs := []string{} + for e := range config.DockerEnv { + if !seen[config.DockerEnv[e]] { + seen[config.DockerEnv[e]] = true + uniqueEnvs = append(uniqueEnvs, config.DockerEnv[e]) + } + } + config.DockerEnv = uniqueEnvs + return config.DockerEnv } From 5640da0cb48957f588eb3eb17213001098eebc89 Mon Sep 17 00:00:00 2001 From: Medya Gh Date: Mon, 18 May 2020 22:52:01 -0700 Subject: [PATCH 06/10] lint --- pkg/minikube/machine/cluster_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/minikube/machine/cluster_test.go b/pkg/minikube/machine/cluster_test.go index 3adbcf4a34..f45d7c4125 100644 --- a/pkg/minikube/machine/cluster_test.go +++ b/pkg/minikube/machine/cluster_test.go @@ -290,7 +290,7 @@ func TestStartHostConfig(t *testing.T) { for i := range h.HostOptions.EngineOptions.Env { if h.HostOptions.EngineOptions.Env[i] != cfg.DockerEnv[i] { - t.Fatalf("Docker env variables were not set! got %+v but want %+v",h.HostOptions.EngineOptions.Env,cfg.DockerEnv) + t.Fatalf("Docker env variables were not set! got %+v but want %+v", h.HostOptions.EngineOptions.Env, cfg.DockerEnv) } } From 07ceed9e2fcf910cce2fd31660af826233b3fe03 Mon Sep 17 00:00:00 2001 From: Priya Wadhwa Date: Tue, 19 May 2020 12:13:36 -0700 Subject: [PATCH 07/10] fix instructions --- site/content/en/docs/start/_index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/site/content/en/docs/start/_index.md b/site/content/en/docs/start/_index.md index 3ef4b7bb30..98633ea5ac 100644 --- a/site/content/en/docs/start/_index.md +++ b/site/content/en/docs/start/_index.md @@ -56,9 +56,10 @@ If the [Brew Package Manager](https://brew.sh/) installed: brew install minikube ``` -If `which minikube` fails after installation via brew, you may have to link the binary: +If `which minikube` fails after installation via brew, you may have to remove the minikube cask and link the binary: ``` +brew cask remove minikube brew link minikube ``` From da91c6fee143a867924d1367d0c8f0787d171a87 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Tue, 19 May 2020 15:12:05 -0700 Subject: [PATCH 08/10] refactor saving IP to node --- pkg/minikube/machine/fix.go | 4 ++-- pkg/minikube/machine/machine.go | 18 ++++++++++++++++++ pkg/minikube/machine/start.go | 13 +------------ 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/pkg/minikube/machine/fix.go b/pkg/minikube/machine/fix.go index 36daedfeb5..b720654cab 100644 --- a/pkg/minikube/machine/fix.go +++ b/pkg/minikube/machine/fix.go @@ -144,8 +144,8 @@ func recreateIfNeeded(api libmachine.API, cc *config.ClusterConfig, n *config.No if err := h.Driver.Start(); err != nil { return h, errors.Wrap(err, "driver start") } - if err := api.Save(h); err != nil { - return h, errors.Wrap(err, "save") + if err := saveHost(api, h, cc, n); err != nil { + return h, err } return h, nil } diff --git a/pkg/minikube/machine/machine.go b/pkg/minikube/machine/machine.go index 26470c3e7a..f6a7ab3040 100644 --- a/pkg/minikube/machine/machine.go +++ b/pkg/minikube/machine/machine.go @@ -17,12 +17,15 @@ limitations under the License. package machine import ( + "fmt" "time" + "github.com/docker/machine/libmachine" "github.com/docker/machine/libmachine/host" libprovision "github.com/docker/machine/libmachine/provision" "github.com/golang/glog" "github.com/pkg/errors" + "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/driver" "k8s.io/minikube/pkg/provision" ) @@ -108,3 +111,18 @@ func fastDetectProvisioner(h *host.Host) (libprovision.Provisioner, error) { return provision.NewBuildrootProvisioner(h.Driver), nil } } + +func saveHost(api libmachine.API, h *host.Host, cfg *config.ClusterConfig, n *config.Node) error { + if err := api.Save(h); err != nil { + return errors.Wrap(err, "save") + } + + // Save IP to config file for subsequent use + ip, err := h.Driver.GetIP() + if err != nil { + return err + } + n.IP = ip + fmt.Printf("SAVING NEW IP HERE: %s\n", ip) + return config.SaveNode(cfg, n) +} diff --git a/pkg/minikube/machine/start.go b/pkg/minikube/machine/start.go index d1ffc15d73..21b7116ae3 100644 --- a/pkg/minikube/machine/start.go +++ b/pkg/minikube/machine/start.go @@ -148,18 +148,7 @@ func createHost(api libmachine.API, cfg *config.ClusterConfig, n *config.Node) ( return h, errors.Wrap(err, "post-start") } - if err := api.Save(h); err != nil { - return nil, errors.Wrap(err, "save") - } - - // Save IP to config file for subsequent use - ip, err := h.Driver.GetIP() - if err != nil { - return h, err - } - n.IP = ip - err = config.SaveNode(cfg, n) - if err != nil { + if err := saveHost(api, h, cfg, n); err != nil { return h, err } From 0ec156dbb938b70bf6ace104247b2e6a3a0836b5 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Tue, 19 May 2020 15:31:14 -0700 Subject: [PATCH 09/10] remove debugging, add comments --- pkg/minikube/machine/machine.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/minikube/machine/machine.go b/pkg/minikube/machine/machine.go index f6a7ab3040..268f057da9 100644 --- a/pkg/minikube/machine/machine.go +++ b/pkg/minikube/machine/machine.go @@ -17,7 +17,6 @@ limitations under the License. package machine import ( - "fmt" "time" "github.com/docker/machine/libmachine" @@ -112,6 +111,7 @@ func fastDetectProvisioner(h *host.Host) (libprovision.Provisioner, error) { } } +// saveHost is a wrapper around libmachine's Save function to proactively update the node's IP whenever a host is saved func saveHost(api libmachine.API, h *host.Host, cfg *config.ClusterConfig, n *config.Node) error { if err := api.Save(h); err != nil { return errors.Wrap(err, "save") @@ -123,6 +123,5 @@ func saveHost(api libmachine.API, h *host.Host, cfg *config.ClusterConfig, n *co return err } n.IP = ip - fmt.Printf("SAVING NEW IP HERE: %s\n", ip) return config.SaveNode(cfg, n) } From 6eb0200daede6cbf21b603fdbf81ecde9f05e72d Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Tue, 19 May 2020 16:32:48 -0700 Subject: [PATCH 10/10] delete worker node volums for docker driver --- cmd/minikube/cmd/delete.go | 5 ++++- cmd/minikube/cmd/start.go | 3 ++- pkg/minikube/machine/delete.go | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cmd/minikube/cmd/delete.go b/cmd/minikube/cmd/delete.go index 711cf59da8..f4b0632313 100644 --- a/cmd/minikube/cmd/delete.go +++ b/cmd/minikube/cmd/delete.go @@ -271,7 +271,10 @@ func deleteProfile(profile *config.Profile) error { // if driver is oci driver, delete containers and volumes if driver.IsKIC(profile.Config.Driver) { out.T(out.DeletingHost, `Deleting "{{.profile_name}}" in {{.driver_name}} ...`, out.V{"profile_name": profile.Name, "driver_name": profile.Config.Driver}) - deletePossibleKicLeftOver(profile.Name, profile.Config.Driver) + for _, n := range profile.Config.Nodes { + machineName := driver.MachineName(*profile.Config, n) + deletePossibleKicLeftOver(machineName, profile.Config.Driver) + } } } else { glog.Infof("%s has no configuration, will try to make it work anyways", profile.Name) diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 0d52db44ac..ec5ab8d191 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -317,7 +317,8 @@ func startWithDriver(starter node.Starter, existing *config.ClusterConfig) (*kub } func warnAboutMultiNode() { - out.WarningT("Multi-node clusters are currently experimental and might exhibit unintended behavior.\nTo track progress on multi-node clusters, see https://github.com/kubernetes/minikube/issues/7538.") + out.WarningT("Multi-node clusters are currently experimental and might exhibit unintended behavior.") + out.T(out.Documentation, "To track progress on multi-node clusters, see https://github.com/kubernetes/minikube/issues/7538.") } func updateDriver(driverName string) { diff --git a/pkg/minikube/machine/delete.go b/pkg/minikube/machine/delete.go index 392ba98339..3c0a2d6f12 100644 --- a/pkg/minikube/machine/delete.go +++ b/pkg/minikube/machine/delete.go @@ -99,7 +99,7 @@ func DeleteHost(api libmachine.API, machineName string, deleteAbandoned ...bool) return delete(api, host, machineName) } -// delete removes a host and it's local data files +// delete removes a host and its local data files func delete(api libmachine.API, h *host.Host, machineName string) error { if err := h.Driver.Remove(); err != nil { glog.Warningf("remove failed, will retry: %v", err)