From 4b2d9a6838bac6e16bf3cc2fb780223bd90070d2 Mon Sep 17 00:00:00 2001 From: Kumar Shivendu Date: Sun, 18 Jul 2021 13:23:42 +0530 Subject: [PATCH 001/201] docs: Suggest using alias for minikube kubectl -- --- site/content/en/docs/start/_index.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/site/content/en/docs/start/_index.md b/site/content/en/docs/start/_index.md index a303266173e6..5bbf9e77542d 100644 --- a/site/content/en/docs/start/_index.md +++ b/site/content/en/docs/start/_index.md @@ -454,11 +454,15 @@ If you already have kubectl installed, you can now use it to access your shiny n kubectl get po -A ``` -Alternatively, minikube can download the appropriate version of kubectl, if you don't mind the double-dashes in the command-line: +Alternatively, minikube can download the appropriate version of kubectl and you should be able to use it like this: ```shell minikube kubectl -- get po -A ``` +If you've downloaded kubectl through minikube, you can make your life easier by adding the following to your shell config: +```shell +alias kubectl="minikube kubectl --" +``` Initially, some services such as the storage-provisioner, may not yet be in a Running state. This is a normal condition during cluster bring-up, and will resolve itself momentarily. For additional insight into your cluster state, minikube bundles the Kubernetes Dashboard, allowing you to get easily acclimated to your new environment: From bac3b6918fb2f6a28dae0d1817a04865a76a2828 Mon Sep 17 00:00:00 2001 From: Kumar Shivendu Date: Fri, 30 Jul 2021 00:24:50 +0530 Subject: [PATCH 002/201] docs: Simplify minikube alias documentation Co-authored-by: Sharif Elgamal --- site/content/en/docs/start/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/content/en/docs/start/_index.md b/site/content/en/docs/start/_index.md index 5bbf9e77542d..0d9e93c5e63e 100644 --- a/site/content/en/docs/start/_index.md +++ b/site/content/en/docs/start/_index.md @@ -459,7 +459,7 @@ Alternatively, minikube can download the appropriate version of kubectl and you ```shell minikube kubectl -- get po -A ``` -If you've downloaded kubectl through minikube, you can make your life easier by adding the following to your shell config: +You can also make your life easier by adding the following to your shell config: ```shell alias kubectl="minikube kubectl --" ``` From 2ab5c86a887c754c83934abd3716295f499a684b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20F=20Bj=C3=B6rklund?= Date: Fri, 6 Aug 2021 18:56:27 +0200 Subject: [PATCH 003/201] Build images on the primary control plane Allow selecting another node using --node Or continue build on all nodes with --all --- cmd/minikube/cmd/image.go | 8 +++++++- pkg/minikube/machine/build_images.go | 16 +++++++++++++++- site/content/en/docs/commands/image.md | 2 ++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/cmd/minikube/cmd/image.go b/cmd/minikube/cmd/image.go index 85616c09c49c..b341a9561af9 100644 --- a/cmd/minikube/cmd/image.go +++ b/cmd/minikube/cmd/image.go @@ -35,6 +35,10 @@ import ( docker "k8s.io/minikube/third_party/go-dockerclient" ) +var ( + allNodes bool +) + // imageCmd represents the image command var imageCmd = &cobra.Command{ Use: "image COMMAND", @@ -217,7 +221,7 @@ var buildImageCmd = &cobra.Command{ // Otherwise, assume it's a tar } } - if err := machine.BuildImage(img, dockerFile, tag, push, buildEnv, buildOpt, []*config.Profile{profile}); err != nil { + if err := machine.BuildImage(img, dockerFile, tag, push, buildEnv, buildOpt, []*config.Profile{profile}, allNodes, nodeName); err != nil { exit.Error(reason.GuestImageBuild, "Failed to build image", err) } if tmp != "" { @@ -257,6 +261,8 @@ func init() { buildImageCmd.Flags().StringVarP(&dockerFile, "file", "f", "", "Path to the Dockerfile to use (optional)") buildImageCmd.Flags().StringArrayVar(&buildEnv, "build-env", nil, "Environment variables to pass to the build. (format: key=value)") buildImageCmd.Flags().StringArrayVar(&buildOpt, "build-opt", nil, "Specify arbitrary flags to pass to the build. (format: key=value)") + buildImageCmd.Flags().StringVarP(&nodeName, "node", "n", "", "The node to build on. Defaults to the primary control plane.") + buildImageCmd.Flags().BoolVarP(&allNodes, "all", "", false, "Build image on all nodes.") imageCmd.AddCommand(buildImageCmd) imageCmd.AddCommand(listImageCmd) } diff --git a/pkg/minikube/machine/build_images.go b/pkg/minikube/machine/build_images.go index 3b7e4e82bbcf..637c15b5edd9 100644 --- a/pkg/minikube/machine/build_images.go +++ b/pkg/minikube/machine/build_images.go @@ -40,7 +40,7 @@ import ( var buildRoot = path.Join(vmpath.GuestPersistentDir, "build") // BuildImage builds image to all profiles -func BuildImage(path string, file string, tag string, push bool, env []string, opt []string, profiles []*config.Profile) error { +func BuildImage(path string, file string, tag string, push bool, env []string, opt []string, profiles []*config.Profile, allNodes bool, nodeName string) error { api, err := NewAPIClient() if err != nil { return errors.Wrap(err, "api") @@ -70,9 +70,23 @@ func BuildImage(path string, file string, tag string, push bool, env []string, o continue } + cp, err := config.PrimaryControlPlane(p.Config) + if err != nil { + return err + } + for _, n := range c.Nodes { m := config.MachineName(*c, n) + if !allNodes { + // build images on the primary control plane node by default + if nodeName == "" && n != cp { + continue + } else if nodeName != n.Name && nodeName != m { + continue + } + } + status, err := Status(api, m) if err != nil { klog.Warningf("error getting status for %s: %v", m, err) diff --git a/site/content/en/docs/commands/image.md b/site/content/en/docs/commands/image.md index 299e0c80aec1..624918d8d479 100644 --- a/site/content/en/docs/commands/image.md +++ b/site/content/en/docs/commands/image.md @@ -56,9 +56,11 @@ minikube image build . ### Options ``` + --all Build image on all nodes. --build-env stringArray Environment variables to pass to the build. (format: key=value) --build-opt stringArray Specify arbitrary flags to pass to the build. (format: key=value) -f, --file string Path to the Dockerfile to use (optional) + -n, --node string The node to build on. Defaults to the primary control plane. --push Push the new image (requires tag) -t, --tag string Tag to apply to the new image (optional) ``` From 3acbd2fc907a9d8fe1551d77a58937a7fe7361f0 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Tue, 10 Aug 2021 12:57:10 -0700 Subject: [PATCH 004/201] gcp-auth: improve flow for GCE/Cloud Shell --- pkg/addons/addons_gcpauth.go | 9 ++++++++- test/integration/addons_test.go | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/pkg/addons/addons_gcpauth.go b/pkg/addons/addons_gcpauth.go index acf98af15bc9..fbbc0d46366e 100644 --- a/pkg/addons/addons_gcpauth.go +++ b/pkg/addons/addons_gcpauth.go @@ -83,7 +83,8 @@ func enableAddonGCPAuth(cfg *config.ClusterConfig) error { // If the env var is explicitly set, even in GCE, then defer to the user and continue if !Force && detect.IsOnGCE() && os.Getenv("GOOGLE_APPLICATION_CREDENTUALS") == "" { - exit.Message(reason.InternalCredsNotNeeded, "It seems that you are running in GCE, which means authentication should work without the GCP Auth addon. If you would still like to authenticate using a credentials file, use the --force flag.") + out.WarningT("It seems that you are running in GCE, which means authentication should work without the GCP Auth addon. If you would still like to authenticate using a credentials file, use the --force flag.") + return nil } // Actually copy the creds over @@ -322,6 +323,12 @@ func verifyGCPAuthAddon(cc *config.ClusterConfig, name string, val string) error if err != nil { return errors.Wrapf(err, "parsing bool: %s", name) } + + // If we're in GCE and didn't actually start the gcp-auth pods, don't check for them. + if !Force && detect.IsOnGCE() && os.Getenv("GOOGLE_APPLICATION_CREDENTUALS") == "" { + return nil + } + err = verifyAddonStatusInternal(cc, name, val, "gcp-auth") if err != nil { return err diff --git a/test/integration/addons_test.go b/test/integration/addons_test.go index 59025f671f91..a52928c1314f 100644 --- a/test/integration/addons_test.go +++ b/test/integration/addons_test.go @@ -82,8 +82,8 @@ func TestAddons(t *testing.T) { if detect.IsOnGCE() { args = []string{"-p", profile, "addons", "enable", "gcp-auth"} rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) - if err == nil { - t.Errorf("Expected error but didn't get one. command %v, output %v", rr.Command(), rr.Output()) + if err != nil { + t.Errorf("%s failed: %v", rr.Command(), err) } else { if !strings.Contains(rr.Output(), "It seems that you are running in GCE") { t.Errorf("Unexpected error message: %v", rr.Output()) From dfef0ad47825d16f045b06e297463083c5dddd70 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Tue, 10 Aug 2021 13:46:49 -0700 Subject: [PATCH 005/201] read blessed cloud shell config file --- pkg/addons/addons_gcpauth.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pkg/addons/addons_gcpauth.go b/pkg/addons/addons_gcpauth.go index fbbc0d46366e..4fbbbbb094dd 100644 --- a/pkg/addons/addons_gcpauth.go +++ b/pkg/addons/addons_gcpauth.go @@ -20,8 +20,10 @@ import ( "bytes" "context" "fmt" + "io/ioutil" "os" "os/exec" + "path" "strconv" "strings" "time" @@ -71,7 +73,16 @@ func enableAddonGCPAuth(cfg *config.ClusterConfig) error { ctx := context.Background() creds, err := google.FindDefaultCredentials(ctx) if err != nil || creds.JSON == nil { - exit.Message(reason.InternalCredsNotFound, "Could not find any GCP credentials. Either run `gcloud auth application-default login` or set the GOOGLE_APPLICATION_CREDENTIALS environment variable to the path of your credentials file.") + if detect.IsCloudShell() { + if c := os.Getenv("CLOUDSDK_CONFIG"); c != "" { + f, err := ioutil.ReadFile(path.Join(c, "application_default_credentials.json")) + if err == nil { + creds, _ = google.CredentialsFromJSON(ctx, f) + } + } + } else { + exit.Message(reason.InternalCredsNotFound, "Could not find any GCP credentials. Either run `gcloud auth application-default login` or set the GOOGLE_APPLICATION_CREDENTIALS environment variable to the path of your credentials file.") + } } // Create a registry secret in every namespace we can find @@ -123,6 +134,10 @@ or set the GOOGLE_CLOUD_PROJECT environment variable.`) } func createPullSecret(cc *config.ClusterConfig, creds *google.Credentials) error { + if creds == nil { + return errors.New("no credentials, skipping creating pull secret") + } + client, err := service.K8s.GetCoreClient(cc.Name) if err != nil { return err From 19b763fd36c6f3e6d0ee22fb5d925240c8e3eb5b Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Tue, 10 Aug 2021 15:16:41 -0700 Subject: [PATCH 006/201] do not start pods if no creds --- pkg/addons/addons.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pkg/addons/addons.go b/pkg/addons/addons.go index a960a9655348..e20f882d661c 100644 --- a/pkg/addons/addons.go +++ b/pkg/addons/addons.go @@ -18,6 +18,7 @@ package addons import ( "fmt" + "os" "path" "runtime" "sort" @@ -150,6 +151,13 @@ func EnableOrDisableAddon(cc *config.ClusterConfig, name string, val string) err } } + // If the credentials haven't been mounted in, don't start the pods + if name == "gcp-auth" { + if _, err := os.Stat(credentialsPath); os.IsNotExist(err) { + return nil + } + } + // to match both ingress and ingress-dns addons if strings.HasPrefix(name, "ingress") && enable { if driver.IsKIC(cc.Driver) { From e150129172a8a7a9a0cd88a6a4a607e1a47c1f3f Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Tue, 10 Aug 2021 15:54:12 -0700 Subject: [PATCH 007/201] refactor EnableOrDisableAddon to reduce cyclotomic complexity --- pkg/addons/addons.go | 106 +++++++++++++++++++++++-------------------- 1 file changed, 58 insertions(+), 48 deletions(-) diff --git a/pkg/addons/addons.go b/pkg/addons/addons.go index e20f882d661c..3b07315e9972 100644 --- a/pkg/addons/addons.go +++ b/pkg/addons/addons.go @@ -151,42 +151,12 @@ func EnableOrDisableAddon(cc *config.ClusterConfig, name string, val string) err } } - // If the credentials haven't been mounted in, don't start the pods - if name == "gcp-auth" { - if _, err := os.Stat(credentialsPath); os.IsNotExist(err) { - return nil - } - } - - // to match both ingress and ingress-dns addons - if strings.HasPrefix(name, "ingress") && enable { - if driver.IsKIC(cc.Driver) { - if runtime.GOOS == "windows" { - out.Styled(style.Tip, `After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1"`) - } else if runtime.GOOS != "linux" { - exit.Message(reason.Usage, `Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported. -Alternatively to use this addon you can use a vm-based driver: - - 'minikube start --vm=true' - -To track the update on this work in progress feature please check: -https://github.com/kubernetes/minikube/issues/7332`, out.V{"driver_name": cc.Driver, "os_name": runtime.GOOS, "addon_name": name}) - } else if driver.BareMetal(cc.Driver) { - out.WarningT(`Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.`, - out.V{"driver_name": cc.Driver, "addon_name": name}) - } - } + bail, err := addonSpecificChecks(cc, name, enable) + if err != nil { + return err } - - if strings.HasPrefix(name, "istio") && enable { - minMem := 8192 - minCPUs := 4 - if cc.Memory < minMem { - out.WarningT("Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB", out.V{"minMem": minMem, "memory": cc.Memory}) - } - if cc.CPUs < minCPUs { - out.WarningT("Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs", out.V{"minCPUs": minCPUs, "cpus": cc.CPUs}) - } + if bail { + return nil } api, err := machine.NewAPIClient() @@ -213,19 +183,6 @@ https://github.com/kubernetes/minikube/issues/7332`, out.V{"driver_name": cc.Dri return nil } - if name == "registry" { - if driver.NeedsPortForward(cc.Driver) { - port, err := oci.ForwardedPort(cc.Driver, cc.Name, constants.RegistryAddonPort) - if err != nil { - return errors.Wrap(err, "registry port") - } - if enable { - out.Boxed(`Registry addon with {{.driver}} driver uses port {{.port}} please use that instead of default port 5000`, out.V{"driver": cc.Driver, "port": port}) - } - out.Styled(style.Documentation, `For more information see: https://minikube.sigs.k8s.io/docs/drivers/{{.driver}}`, out.V{"driver": cc.Driver}) - } - } - runner, err := machine.CommandRunner(host) if err != nil { return errors.Wrap(err, "command runner") @@ -249,6 +206,59 @@ https://github.com/kubernetes/minikube/issues/7332`, out.V{"driver_name": cc.Dri return enableOrDisableAddonInternal(cc, addon, runner, data, enable) } +func addonSpecificChecks(cc *config.ClusterConfig, name string, enable bool) (bool, error) { + // If the gcp-auth credentials haven't been mounted in, don't start the pods + if _, err := os.Stat(credentialsPath); os.IsNotExist(err) && name == "gcp-auth" { + return true, nil + } + + // to match both ingress and ingress-dns addons + if strings.HasPrefix(name, "ingress") && enable { + if driver.IsKIC(cc.Driver) { + if runtime.GOOS == "windows" { + out.Styled(style.Tip, `After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1"`) + } else if runtime.GOOS != "linux" { + exit.Message(reason.Usage, `Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported. +Alternatively to use this addon you can use a vm-based driver: + +'minikube start --vm=true' + +To track the update on this work in progress feature please check: +https://github.com/kubernetes/minikube/issues/7332`, out.V{"driver_name": cc.Driver, "os_name": runtime.GOOS, "addon_name": name}) + } else if driver.BareMetal(cc.Driver) { + out.WarningT(`Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.`, + out.V{"driver_name": cc.Driver, "addon_name": name}) + } + } + } + + if strings.HasPrefix(name, "istio") && enable { + minMem := 8192 + minCPUs := 4 + if cc.Memory < minMem { + out.WarningT("Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB", out.V{"minMem": minMem, "memory": cc.Memory}) + } + if cc.CPUs < minCPUs { + out.WarningT("Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs", out.V{"minCPUs": minCPUs, "cpus": cc.CPUs}) + } + } + + if name == "registry" { + if driver.NeedsPortForward(cc.Driver) { + port, err := oci.ForwardedPort(cc.Driver, cc.Name, constants.RegistryAddonPort) + if err != nil { + return false, errors.Wrap(err, "registry port") + } + if enable { + out.Boxed(`Registry addon with {{.driver}} driver uses port {{.port}} please use that instead of default port 5000`, out.V{"driver": cc.Driver, "port": port}) + } + out.Styled(style.Documentation, `For more information see: https://minikube.sigs.k8s.io/docs/drivers/{{.driver}}`, out.V{"driver": cc.Driver}) + } + } + + return false, nil +} + func isAddonAlreadySet(cc *config.ClusterConfig, addon *assets.Addon, enable bool) bool { enabled := addon.IsEnabled(cc) if enabled && enable { From f99b234c7e86e7889d7edd98644b8a6d1b7345fc Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Tue, 10 Aug 2021 15:56:15 -0700 Subject: [PATCH 008/201] simplify logic --- pkg/addons/addons.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pkg/addons/addons.go b/pkg/addons/addons.go index 3b07315e9972..3a2f9e208590 100644 --- a/pkg/addons/addons.go +++ b/pkg/addons/addons.go @@ -208,8 +208,10 @@ func EnableOrDisableAddon(cc *config.ClusterConfig, name string, val string) err func addonSpecificChecks(cc *config.ClusterConfig, name string, enable bool) (bool, error) { // If the gcp-auth credentials haven't been mounted in, don't start the pods - if _, err := os.Stat(credentialsPath); os.IsNotExist(err) && name == "gcp-auth" { - return true, nil + if name == "gcp-auth" { + if _, err := os.Stat(credentialsPath); os.IsNotExist(err) { + return true, nil + } } // to match both ingress and ingress-dns addons From 1319fe729f329b68cd12b9fa80fa7526ac25734a Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Wed, 11 Aug 2021 09:58:03 -0700 Subject: [PATCH 009/201] fix file existence check --- pkg/addons/addons.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/pkg/addons/addons.go b/pkg/addons/addons.go index 3a2f9e208590..783cbd8e3d6f 100644 --- a/pkg/addons/addons.go +++ b/pkg/addons/addons.go @@ -18,7 +18,7 @@ package addons import ( "fmt" - "os" + "os/exec" "path" "runtime" "sort" @@ -194,6 +194,14 @@ func EnableOrDisableAddon(cc *config.ClusterConfig, name string, val string) err } } + // If the gcp-auth credentials haven't been mounted in, don't start the pods + if name == "gcp-auth" { + rr, err := runner.RunCmd(exec.Command("cat", credentialsPath)) + if err != nil || rr.Stdout.String() == "" { + return nil + } + } + var networkInfo assets.NetworkInfo if len(cc.Nodes) >= 1 { networkInfo.ControlPlaneNodeIP = cc.Nodes[0].IP @@ -207,13 +215,6 @@ func EnableOrDisableAddon(cc *config.ClusterConfig, name string, val string) err } func addonSpecificChecks(cc *config.ClusterConfig, name string, enable bool) (bool, error) { - // If the gcp-auth credentials haven't been mounted in, don't start the pods - if name == "gcp-auth" { - if _, err := os.Stat(credentialsPath); os.IsNotExist(err) { - return true, nil - } - } - // to match both ingress and ingress-dns addons if strings.HasPrefix(name, "ingress") && enable { if driver.IsKIC(cc.Driver) { From 163a4b2934940cb34b80be21d8e7cafcb74f7042 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Wed, 11 Aug 2021 11:56:45 -0700 Subject: [PATCH 010/201] fix lint --- pkg/addons/addons.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/pkg/addons/addons.go b/pkg/addons/addons.go index 783cbd8e3d6f..64eb90f51145 100644 --- a/pkg/addons/addons.go +++ b/pkg/addons/addons.go @@ -151,13 +151,10 @@ func EnableOrDisableAddon(cc *config.ClusterConfig, name string, val string) err } } - bail, err := addonSpecificChecks(cc, name, enable) + err = addonSpecificChecks(cc, name, enable) if err != nil { return err } - if bail { - return nil - } api, err := machine.NewAPIClient() if err != nil { @@ -214,7 +211,7 @@ func EnableOrDisableAddon(cc *config.ClusterConfig, name string, val string) err return enableOrDisableAddonInternal(cc, addon, runner, data, enable) } -func addonSpecificChecks(cc *config.ClusterConfig, name string, enable bool) (bool, error) { +func addonSpecificChecks(cc *config.ClusterConfig, name string, enable bool) error { // to match both ingress and ingress-dns addons if strings.HasPrefix(name, "ingress") && enable { if driver.IsKIC(cc.Driver) { @@ -250,7 +247,7 @@ https://github.com/kubernetes/minikube/issues/7332`, out.V{"driver_name": cc.Dri if driver.NeedsPortForward(cc.Driver) { port, err := oci.ForwardedPort(cc.Driver, cc.Name, constants.RegistryAddonPort) if err != nil { - return false, errors.Wrap(err, "registry port") + return errors.Wrap(err, "registry port") } if enable { out.Boxed(`Registry addon with {{.driver}} driver uses port {{.port}} please use that instead of default port 5000`, out.V{"driver": cc.Driver, "port": port}) @@ -259,7 +256,7 @@ https://github.com/kubernetes/minikube/issues/7332`, out.V{"driver_name": cc.Dri } } - return false, nil + return nil } func isAddonAlreadySet(cc *config.ClusterConfig, addon *assets.Addon, enable bool) bool { From ca04178ced27009f0990fbf8085200013bcaf717 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 12 Aug 2021 14:13:51 -0700 Subject: [PATCH 011/201] exit prematurely in specific case for gcp-auth --- pkg/addons/addons.go | 45 +++++++++++++++++++++--------------- pkg/addons/addons_gcpauth.go | 3 ++- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/pkg/addons/addons.go b/pkg/addons/addons.go index 64eb90f51145..47fed71d3c6a 100644 --- a/pkg/addons/addons.go +++ b/pkg/addons/addons.go @@ -151,11 +151,6 @@ func EnableOrDisableAddon(cc *config.ClusterConfig, name string, val string) err } } - err = addonSpecificChecks(cc, name, enable) - if err != nil { - return err - } - api, err := machine.NewAPIClient() if err != nil { return errors.Wrap(err, "machine client") @@ -185,18 +180,12 @@ func EnableOrDisableAddon(cc *config.ClusterConfig, name string, val string) err return errors.Wrap(err, "command runner") } - if name == "auto-pause" && !enable { // needs to be disabled before deleting the service file in the internal disable - if err := sysinit.New(runner).DisableNow("auto-pause"); err != nil { - klog.ErrorS(err, "failed to disable", "service", "auto-pause") - } + bail, err := addonSpecificChecks(cc, name, enable, runner) + if err != nil { + return err } - - // If the gcp-auth credentials haven't been mounted in, don't start the pods - if name == "gcp-auth" { - rr, err := runner.RunCmd(exec.Command("cat", credentialsPath)) - if err != nil || rr.Stdout.String() == "" { - return nil - } + if bail { + return nil } var networkInfo assets.NetworkInfo @@ -211,7 +200,7 @@ func EnableOrDisableAddon(cc *config.ClusterConfig, name string, val string) err return enableOrDisableAddonInternal(cc, addon, runner, data, enable) } -func addonSpecificChecks(cc *config.ClusterConfig, name string, enable bool) error { +func addonSpecificChecks(cc *config.ClusterConfig, name string, enable bool, runner command.Runner) (bool, error) { // to match both ingress and ingress-dns addons if strings.HasPrefix(name, "ingress") && enable { if driver.IsKIC(cc.Driver) { @@ -230,6 +219,7 @@ https://github.com/kubernetes/minikube/issues/7332`, out.V{"driver_name": cc.Dri out.V{"driver_name": cc.Driver, "addon_name": name}) } } + return false, nil } if strings.HasPrefix(name, "istio") && enable { @@ -241,22 +231,39 @@ https://github.com/kubernetes/minikube/issues/7332`, out.V{"driver_name": cc.Dri if cc.CPUs < minCPUs { out.WarningT("Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs", out.V{"minCPUs": minCPUs, "cpus": cc.CPUs}) } + return false, nil } if name == "registry" { if driver.NeedsPortForward(cc.Driver) { port, err := oci.ForwardedPort(cc.Driver, cc.Name, constants.RegistryAddonPort) if err != nil { - return errors.Wrap(err, "registry port") + return false, errors.Wrap(err, "registry port") } if enable { out.Boxed(`Registry addon with {{.driver}} driver uses port {{.port}} please use that instead of default port 5000`, out.V{"driver": cc.Driver, "port": port}) } out.Styled(style.Documentation, `For more information see: https://minikube.sigs.k8s.io/docs/drivers/{{.driver}}`, out.V{"driver": cc.Driver}) } + return false, nil } - return nil + if name == "auto-pause" && !enable { // needs to be disabled before deleting the service file in the internal disable + if err := sysinit.New(runner).DisableNow("auto-pause"); err != nil { + klog.ErrorS(err, "failed to disable", "service", "auto-pause") + } + return false, nil + } + + // If the gcp-auth credentials haven't been mounted in, don't start the pods + if name == "gcp-auth" { + rr, err := runner.RunCmd(exec.Command("cat", credentialsPath)) + if err != nil || rr.Stdout.String() == "" { + return true, nil + } + } + + return false, nil } func isAddonAlreadySet(cc *config.ClusterConfig, addon *assets.Addon, enable bool) bool { diff --git a/pkg/addons/addons_gcpauth.go b/pkg/addons/addons_gcpauth.go index 4fbbbbb094dd..65b613a2f0e7 100644 --- a/pkg/addons/addons_gcpauth.go +++ b/pkg/addons/addons_gcpauth.go @@ -340,8 +340,9 @@ func verifyGCPAuthAddon(cc *config.ClusterConfig, name string, val string) error } // If we're in GCE and didn't actually start the gcp-auth pods, don't check for them. + // We also don't want to actually set the addon as enabled, so just exit completely. if !Force && detect.IsOnGCE() && os.Getenv("GOOGLE_APPLICATION_CREDENTUALS") == "" { - return nil + os.Exit(0) } err = verifyAddonStatusInternal(cc, name, val, "gcp-auth") From 06ed3378b9e8e7b79ad5e86b0ba35c535ec6a0af Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Fri, 13 Aug 2021 13:42:02 -0700 Subject: [PATCH 012/201] create special error to skip addons without erroring out --- cmd/minikube/cmd/config/enable.go | 8 +++++--- pkg/addons/addons.go | 23 +++++++++++++++++++---- pkg/addons/addons_gcpauth.go | 2 +- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/cmd/minikube/cmd/config/enable.go b/cmd/minikube/cmd/config/enable.go index 788a9477ae91..801e64ec3b7f 100644 --- a/cmd/minikube/cmd/config/enable.go +++ b/cmd/minikube/cmd/config/enable.go @@ -17,6 +17,7 @@ limitations under the License. package config import ( + "errors" "fmt" "github.com/spf13/cobra" @@ -48,7 +49,7 @@ var addonsEnableCmd = &cobra.Command{ viper.Set(config.AddonImages, images) viper.Set(config.AddonRegistries, registries) err := addons.SetAndSave(ClusterFlagValue(), addon, "true") - if err != nil { + if err != nil && !errors.Is(err, addons.ErrSkipThisAddon) { exit.Error(reason.InternalAddonEnable, "enable failed", err) } if addon == "dashboard" { @@ -63,8 +64,9 @@ var addonsEnableCmd = &cobra.Command{ `, out.V{"profileArg": tipProfileArg}) } - - out.Step(style.AddonEnable, "The '{{.addonName}}' addon is enabled", out.V{"addonName": addon}) + if err != nil { + out.Step(style.AddonEnable, "The '{{.addonName}}' addon is enabled", out.V{"addonName": addon}) + } }, } diff --git a/pkg/addons/addons.go b/pkg/addons/addons.go index 47fed71d3c6a..b0a13f81c2c1 100644 --- a/pkg/addons/addons.go +++ b/pkg/addons/addons.go @@ -55,6 +55,9 @@ var Force bool = false // Currently only used for gcp-auth var Refresh bool = false +// ErrSkipThisAddon is a special error that tells us to not error out, but to also not mark the addon as enabled +var ErrSkipThisAddon = errors.New("skipping this addon") + // RunCallbacks runs all actions associated to an addon, but does not set it (thread-safe) func RunCallbacks(cc *config.ClusterConfig, name string, value string) error { klog.Infof("Setting %s=%s in profile %q", name, value, cc.Name) @@ -65,11 +68,17 @@ func RunCallbacks(cc *config.ClusterConfig, name string, value string) error { // Run any additional validations for this property if err := run(cc, name, value, a.validations); err != nil { + if errors.Is(err, ErrSkipThisAddon) { + return err + } return errors.Wrap(err, "running validations") } // Run any callbacks for this property if err := run(cc, name, value, a.callbacks); err != nil { + if errors.Is(err, ErrSkipThisAddon) { + return err + } return errors.Wrap(err, "running callbacks") } return nil @@ -92,6 +101,9 @@ func SetAndSave(profile string, name string, value string) error { } if err := RunCallbacks(cc, name, value); err != nil { + if errors.Is(err, ErrSkipThisAddon) { + return err + } return errors.Wrap(err, "run callbacks") } @@ -105,15 +117,18 @@ func SetAndSave(profile string, name string, value string) error { // Runs all the validation or callback functions and collects errors func run(cc *config.ClusterConfig, name string, value string, fns []setFn) error { - var errors []error + var errs []error for _, fn := range fns { err := fn(cc, name, value) if err != nil { - errors = append(errors, err) + if errors.Is(err, ErrSkipThisAddon) { + return ErrSkipThisAddon + } + errs = append(errs, err) } } - if len(errors) > 0 { - return fmt.Errorf("%v", errors) + if len(errs) > 0 { + return fmt.Errorf("%v", errs) } return nil } diff --git a/pkg/addons/addons_gcpauth.go b/pkg/addons/addons_gcpauth.go index 65b613a2f0e7..23cadfd8973c 100644 --- a/pkg/addons/addons_gcpauth.go +++ b/pkg/addons/addons_gcpauth.go @@ -342,7 +342,7 @@ func verifyGCPAuthAddon(cc *config.ClusterConfig, name string, val string) error // If we're in GCE and didn't actually start the gcp-auth pods, don't check for them. // We also don't want to actually set the addon as enabled, so just exit completely. if !Force && detect.IsOnGCE() && os.Getenv("GOOGLE_APPLICATION_CREDENTUALS") == "" { - os.Exit(0) + return ErrSkipThisAddon } err = verifyAddonStatusInternal(cc, name, val, "gcp-auth") From 756aac7c2119f6ad397d04d58b7fa7a9e0c4b1a2 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Fri, 13 Aug 2021 15:07:25 -0700 Subject: [PATCH 013/201] only skip the addon on enable --- pkg/addons/addons_gcpauth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/addons/addons_gcpauth.go b/pkg/addons/addons_gcpauth.go index 23cadfd8973c..122a7e4cdcae 100644 --- a/pkg/addons/addons_gcpauth.go +++ b/pkg/addons/addons_gcpauth.go @@ -341,7 +341,7 @@ func verifyGCPAuthAddon(cc *config.ClusterConfig, name string, val string) error // If we're in GCE and didn't actually start the gcp-auth pods, don't check for them. // We also don't want to actually set the addon as enabled, so just exit completely. - if !Force && detect.IsOnGCE() && os.Getenv("GOOGLE_APPLICATION_CREDENTUALS") == "" { + if enable && !Force && detect.IsOnGCE() && os.Getenv("GOOGLE_APPLICATION_CREDENTUALS") == "" { return ErrSkipThisAddon } From 1f83aa3ac22b2013ac82847a170beffe830a6652 Mon Sep 17 00:00:00 2001 From: Pablo Caderno Date: Wed, 11 Aug 2021 17:43:38 +1000 Subject: [PATCH 014/201] Added port validation --- cmd/minikube/cmd/start.go | 27 +++++++++++++++++++++++++ cmd/minikube/cmd/start_test.go | 36 ++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index d51fec280a0d..a5546e0aae66 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -1118,6 +1118,14 @@ func validateFlags(cmd *cobra.Command, drvName string) { viper.Set(imageRepository, validateImageRepository(viper.GetString(imageRepository))) } + if cmd.Flags().Changed(ports) { + err := validatePorts(viper.GetStringSlice(ports)) + if err != nil { + exit.Message(reason.Usage, "{{.err}}", out.V{"err": err}) + } + + } + if cmd.Flags().Changed(containerRuntime) { runtime := strings.ToLower(viper.GetString(containerRuntime)) @@ -1314,6 +1322,25 @@ func validateListenAddress(listenAddr string) { } } +// This function validates that the --ports are not below 1024 for the host and not outside range +func validatePorts(ports []string) error { + for _, portDuplet := range ports { + for i, port := range strings.Split(portDuplet, ":") { + p, err := strconv.Atoi(port) + if err != nil { + return errors.Errorf("Sorry, one of the ports provided with --ports flag is not valid %s", ports) + } + if p > 65535 || p < 1 { + return errors.Errorf("Sorry, one of the ports provided with --ports flag is outside range %s", ports) + } + if p < 1024 && i == 0 { + return errors.Errorf("Sorry, you cannot use privileged ports on the host (below 1024) %s", ports) + } + } + } + return nil +} + // This function validates that the --insecure-registry follows one of the following formats: // "[:]" "[:]" "/" func validateInsecureRegistry() { diff --git a/cmd/minikube/cmd/start_test.go b/cmd/minikube/cmd/start_test.go index 30b91b5a3095..8ed305cdfe25 100644 --- a/cmd/minikube/cmd/start_test.go +++ b/cmd/minikube/cmd/start_test.go @@ -363,3 +363,39 @@ func TestValidateImageRepository(t *testing.T) { } } + +func TestValidatePorts(t *testing.T) { + var tests = []struct { + ports []string + errorMsg string + }{ + { + ports: []string{"test:80"}, + errorMsg: "Sorry, one of the ports provided with --ports flag is not valid [test:80]", + }, + { + ports: []string{"0:80"}, + errorMsg: "Sorry, one of the ports provided with --ports flag is outside range [0:80]", + }, + { + ports: []string{"80:80"}, + errorMsg: "Sorry, you cannot use privileged ports on the host (below 1024) [80:80]", + }, + { + ports: []string{"8080:80", "6443:443"}, + errorMsg: "", + }, + } + for _, test := range tests { + t.Run(strings.Join(test.ports, ","), func(t *testing.T) { + gotError := "" + got := validatePorts(test.ports) + if got != nil { + gotError = got.Error() + } + if gotError != test.errorMsg { + t.Errorf("validatePorts(ports=%v): got %v, expected %v", test.ports, got, test.errorMsg) + } + }) + } +} From f74789656bde544d612d4707c58ac5100b9b9df7 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Mon, 16 Aug 2021 16:46:39 -0700 Subject: [PATCH 015/201] remove outdated param in tiller test --- pkg/minikube/detect/detect.go | 4 ++-- test/integration/addons_test.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/minikube/detect/detect.go b/pkg/minikube/detect/detect.go index 7407f2020207..7e4fce08d35e 100644 --- a/pkg/minikube/detect/detect.go +++ b/pkg/minikube/detect/detect.go @@ -68,8 +68,8 @@ func IsOnGCE() bool { // IsCloudShell determines whether minikube is running inside CloudShell func IsCloudShell() bool { - _, e := os.LookupEnv("CLOUDSHELL_ENVIRONMENT") - return e + e := os.Getenv("CLOUD_SHELL") + return e == "true" } // IsAmd64M1Emulation determines whether amd64 minikube binary is running on M1 mac in emulation mode diff --git a/test/integration/addons_test.go b/test/integration/addons_test.go index a52928c1314f..0b3b9003925e 100644 --- a/test/integration/addons_test.go +++ b/test/integration/addons_test.go @@ -434,10 +434,10 @@ func validateHelmTillerAddon(ctx context.Context, t *testing.T, profile string) } want := "Server: &version.Version" - // Test from inside the cluster (`helm version` use pod.list permission. we use tiller serviceaccount in kube-system to list pod) + // Test from inside the cluster (`helm version` use pod.list permission.) checkHelmTiller := func() error { - rr, err := Run(t, exec.CommandContext(ctx, "kubectl", "--context", profile, "run", "--rm", "helm-test", "--restart=Never", "--image=alpine/helm:2.16.3", "-it", "--namespace=kube-system", "--serviceaccount=tiller", "--", "version")) + rr, err := Run(t, exec.CommandContext(ctx, "kubectl", "--context", profile, "run", "--rm", "helm-test", "--restart=Never", "--image=alpine/helm:2.16.3", "-it", "--namespace=kube-system", "--", "version")) if err != nil { return err } From dceb676527fa1b593a0cba28c1327cdc16681c5f Mon Sep 17 00:00:00 2001 From: Raghavendra Talur Date: Tue, 24 Aug 2021 13:58:58 -0400 Subject: [PATCH 016/201] Add extra disks capability to kvm2 driver Having additional disks on the nodes is a requirement for developers working on the storage components in Kubernetes. This commit adds the extra-disks feature to the kvm2 driver. Signed-off-by: Raghavendra Talur --- cmd/minikube/cmd/start_flags.go | 4 +- pkg/drivers/kvm/disks.go | 80 ++++++++++++++++++++++ pkg/drivers/kvm/domain_definition_arm64.go | 3 + pkg/drivers/kvm/domain_definition_x86.go | 3 + pkg/drivers/kvm/kvm.go | 26 +++++++ pkg/minikube/config/types.go | 2 +- pkg/minikube/registry/drvs/kvm2/kvm2.go | 2 + site/content/en/docs/commands/start.md | 2 +- 8 files changed, 118 insertions(+), 4 deletions(-) create mode 100644 pkg/drivers/kvm/disks.go diff --git a/cmd/minikube/cmd/start_flags.go b/cmd/minikube/cmd/start_flags.go index f87fd108e654..80c7edc728f7 100644 --- a/cmd/minikube/cmd/start_flags.go +++ b/cmd/minikube/cmd/start_flags.go @@ -168,7 +168,7 @@ func initMinikubeFlags() { startCmd.Flags().StringP(network, "", "", "network to run minikube with. Now it is used by docker/podman and KVM drivers. If left empty, minikube will create a new network.") startCmd.Flags().StringVarP(&outputFormat, "output", "o", "text", "Format to print stdout in. Options include: [text,json]") startCmd.Flags().StringP(trace, "", "", "Send trace events. Options include: [gcp]") - startCmd.Flags().Int(extraDisks, 0, "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)") + startCmd.Flags().Int(extraDisks, 0, "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit and kvm2 drivers)") } // initKubernetesFlags inits the commandline flags for Kubernetes related options @@ -730,7 +730,7 @@ func interpretWaitFlag(cmd cobra.Command) map[string]bool { } func checkExtraDiskOptions(cmd *cobra.Command, driverName string) { - supportedDrivers := []string{driver.HyperKit} + supportedDrivers := []string{driver.HyperKit, driver.KVM2} if cmd.Flags().Changed(extraDisks) { supported := false diff --git a/pkg/drivers/kvm/disks.go b/pkg/drivers/kvm/disks.go new file mode 100644 index 000000000000..10c9bd5025ae --- /dev/null +++ b/pkg/drivers/kvm/disks.go @@ -0,0 +1,80 @@ +// +build linux + +/* +Copyright 2018 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package kvm + +import ( + "bytes" + "fmt" + "os" + "text/template" + + "github.com/docker/machine/libmachine/log" + "github.com/pkg/errors" + "k8s.io/minikube/pkg/drivers" + "k8s.io/minikube/pkg/util" +) + +// extraDisksTmpl ExtraDisks XML Template +const extraDisksTmpl = ` + + + + + +` + +// ExtraDisks holds the extra disks configuration +type ExtraDisks struct { + DiskPath string + DiskLogicalName string +} + +// getExtraDiskXML returns the XML that can be added to the libvirt domain XML +// for additional disks +func getExtraDiskXML(diskpath string, logicalName string) (string, error) { + var extraDisk ExtraDisks + extraDisk.DiskLogicalName = logicalName + extraDisk.DiskPath = diskpath + tmpl := template.Must(template.New("").Parse(extraDisksTmpl)) + var extraDisksXML bytes.Buffer + if err := tmpl.Execute(&extraDisksXML, extraDisk); err != nil { + return "", fmt.Errorf("couldn't generate extra disks XML: %v", err) + } + return extraDisksXML.String(), nil +} + +// createExtraDisks creates the extra disk files +func createExtraDisk(d *Driver, index int) (string, error) { + diskPath := drivers.ExtraDiskPath(d.BaseDriver, index) + log.Infof("Creating raw disk image: %s of size %v", diskPath, d.DiskSize) + + if _, err := os.Stat(diskPath); os.IsNotExist(err) { + file, err := os.OpenFile(diskPath, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644) + if err != nil { + return "", errors.Wrap(err, "open") + } + defer file.Close() + + if err := file.Truncate(util.ConvertMBToBytes(d.DiskSize)); err != nil { + return "", errors.Wrap(err, "truncate") + } + } + return diskPath, nil + +} diff --git a/pkg/drivers/kvm/domain_definition_arm64.go b/pkg/drivers/kvm/domain_definition_arm64.go index 02575813fe2e..721efbf61a61 100644 --- a/pkg/drivers/kvm/domain_definition_arm64.go +++ b/pkg/drivers/kvm/domain_definition_arm64.go @@ -77,6 +77,9 @@ const domainTmpl = ` {{if .GPU}} {{.DevicesXML}} {{end}} + {{if gt .ExtraDisks 0}} + {{.ExtraDisksXML}} + {{end}} ` diff --git a/pkg/drivers/kvm/domain_definition_x86.go b/pkg/drivers/kvm/domain_definition_x86.go index 2e2627e53c90..9e5c35f193f5 100644 --- a/pkg/drivers/kvm/domain_definition_x86.go +++ b/pkg/drivers/kvm/domain_definition_x86.go @@ -75,6 +75,9 @@ const domainTmpl = ` {{if .GPU}} {{.DevicesXML}} {{end}} + {{if gt .ExtraDisks 0}} + {{.ExtraDisksXML}} + {{end}} ` diff --git a/pkg/drivers/kvm/kvm.go b/pkg/drivers/kvm/kvm.go index 87345505ae4b..9d71ff6359c0 100644 --- a/pkg/drivers/kvm/kvm.go +++ b/pkg/drivers/kvm/kvm.go @@ -88,6 +88,12 @@ type Driver struct { // NUMA XML NUMANodeXML string + + // Extra Disks + ExtraDisks int + + // Extra Disks XML + ExtraDisksXML []string } const ( @@ -352,6 +358,26 @@ func (d *Driver) Create() (err error) { return errors.Wrap(err, "error creating disk") } + if d.ExtraDisks > 20 { + // Limiting the number of disks to 20 arbitrarily. If more disks are + // needed, the logical name generation has to changed to create them if + // the form hdaa, hdab, etc + return errors.Wrap(err, "cannot create more than 20 extra disks") + } + for i := 0; i < d.ExtraDisks; i++ { + diskpath, err := createExtraDisk(d, i) + if err != nil { + return errors.Wrap(err, "creating extra disks") + } + // Starting the logical names for the extra disks from hdd as the cdrom device is set to hdc. + // TODO: Enhance the domain template to use variable for the logical name of the main disk and the cdrom disk. + extraDisksXML, err := getExtraDiskXML(diskpath, fmt.Sprintf("hd%v", string(rune('d'+i)))) + if err != nil { + return errors.Wrap(err, "creating extraDisk XML") + } + d.ExtraDisksXML = append(d.ExtraDisksXML, extraDisksXML) + } + if err := ensureDirPermissions(store); err != nil { log.Errorf("unable to ensure permissions on %s: %v", store, err) } diff --git a/pkg/minikube/config/types.go b/pkg/minikube/config/types.go index e9a858a6c2c5..2fcc3ca69039 100644 --- a/pkg/minikube/config/types.go +++ b/pkg/minikube/config/types.go @@ -83,7 +83,7 @@ type ClusterConfig struct { ListenAddress string // Only used by the docker and podman driver Network string // only used by docker driver MultiNodeRequested bool - ExtraDisks int // currently only implemented for hyperkit + ExtraDisks int // currently only implemented for hyperkit and kvm2 } // KubernetesConfig contains the parameters used to configure the VM Kubernetes. diff --git a/pkg/minikube/registry/drvs/kvm2/kvm2.go b/pkg/minikube/registry/drvs/kvm2/kvm2.go index 619873b4d02a..73916e5f4952 100644 --- a/pkg/minikube/registry/drvs/kvm2/kvm2.go +++ b/pkg/minikube/registry/drvs/kvm2/kvm2.go @@ -70,6 +70,7 @@ type kvmDriver struct { Hidden bool ConnectionURI string NUMANodeCount int + ExtraDisks int } func configure(cc config.ClusterConfig, n config.Node) (interface{}, error) { @@ -92,6 +93,7 @@ func configure(cc config.ClusterConfig, n config.Node) (interface{}, error) { Hidden: cc.KVMHidden, ConnectionURI: cc.KVMQemuURI, NUMANodeCount: cc.KVMNUMACount, + ExtraDisks: cc.ExtraDisks, }, nil } diff --git a/site/content/en/docs/commands/start.md b/site/content/en/docs/commands/start.md index a57cd14c0752..db47d9e0d4a1 100644 --- a/site/content/en/docs/commands/start.md +++ b/site/content/en/docs/commands/start.md @@ -48,7 +48,7 @@ minikube start [flags] The key should be '.' separated, and the first part before the dot is the component to apply the configuration to. Valid components are: kubelet, kubeadm, apiserver, controller-manager, etcd, proxy, scheduler Valid kubeadm parameters: ignore-preflight-errors, dry-run, kubeconfig, kubeconfig-dir, node-name, cri-socket, experimental-upload-certs, certificate-key, rootfs, skip-phases, pod-network-cidr - --extra-disks int Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver) + --extra-disks int Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit and kvm2 drivers) --feature-gates string A set of key=value pairs that describe feature gates for alpha/experimental features. --force Force minikube to perform possibly dangerous operations --force-systemd If set, force the container runtime to use systemd as cgroup manager. Defaults to false. From 1ae3db3253772e8074392638f93acbd9042b2ecc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Aug 2021 18:24:05 +0000 Subject: [PATCH 017/201] Bump k8s.io/apimachinery from 0.22.0 to 0.22.1 Bumps [k8s.io/apimachinery](https://github.com/kubernetes/apimachinery) from 0.22.0 to 0.22.1. - [Release notes](https://github.com/kubernetes/apimachinery/releases) - [Commits](https://github.com/kubernetes/apimachinery/compare/v0.22.0...v0.22.1) --- updated-dependencies: - dependency-name: k8s.io/apimachinery dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index a60ef99342bb..57124aac7ca2 100644 --- a/go.mod +++ b/go.mod @@ -90,7 +90,7 @@ require ( gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.22.1 - k8s.io/apimachinery v0.22.0 + k8s.io/apimachinery v0.22.1 k8s.io/client-go v0.22.0 k8s.io/klog/v2 v2.10.0 k8s.io/kubectl v0.22.1 From 323225483ed87e20a0d2c32b4e02f49afc5a39a3 Mon Sep 17 00:00:00 2001 From: Akihiro Suda Date: Thu, 26 Aug 2021 15:01:07 +0900 Subject: [PATCH 018/201] Support Rootless Docker Requirements: - Install rootless Docker 20.10 or later, see https://rootlesscontaine.rs/getting-started/docker/ - Enable cgroup v2 delegation, see https://rootlesscontaine.rs/getting-started/common/cgroup2/ Usage: `minikube start --driver=docker --container-runtime=containerd`. The `--container-runtime` flag needs to be set to "containerd". CRI-O can be also supported later. Closes issue 10836 ("add support for rootless Docker"). Support for rootless Podman (issue 8719) is not covered in this commit. --- Code reading guide: - `deploy/kicbase/Dockerfile`: updated to install fuse-overlayfs and containerd-fuse-overlayfs, which is used instead of `overlayfs` snapshotter - `deploy/kicbase/entrypoint`: updated to verify cgroup v2 delegation. Mostly from https://github.com/kubernetes-sigs/kind/blob/8a83ee46b28a80ccd47a85e24294b3e149361947/images/base/files/usr/local/bin/entrypoint - `cmd/minikube/cmd/start_flags.go`: updated to set `KubeletInUserNamespace` feature gate when rootless - `pkg/drivers/kic/oci`: updated to use port forwarding, because rootless container IPs are not reachable from the host - `pkg/minikube/cruntime`: updated to generate `/etc/containerd/config.toml` with rootless support. Signed-off-by: Akihiro Suda --- cmd/minikube/cmd/start_flags.go | 28 ++++++++++ deploy/kicbase/Dockerfile | 19 ++++++- .../kicbase/containerd-fuse-overlayfs.service | 13 +++++ deploy/kicbase/entrypoint | 52 ++++++++++++++++--- hack/preload-images/generate.go | 2 +- pkg/drivers/kic/oci/network.go | 27 ++++++++++ pkg/drivers/kic/oci/oci.go | 3 ++ pkg/minikube/cruntime/containerd.go | 29 +++++++++-- pkg/minikube/cruntime/crio.go | 5 +- pkg/minikube/cruntime/cruntime.go | 2 +- pkg/minikube/cruntime/cruntime_test.go | 2 +- pkg/minikube/cruntime/docker.go | 5 +- pkg/minikube/driver/driver.go | 10 +++- pkg/minikube/node/start.go | 3 +- pkg/minikube/registry/drvs/docker/docker.go | 9 +--- site/content/en/docs/drivers/docker.md | 1 - .../en/docs/drivers/includes/docker_usage.inc | 21 ++++++++ 17 files changed, 204 insertions(+), 27 deletions(-) create mode 100644 deploy/kicbase/containerd-fuse-overlayfs.service diff --git a/cmd/minikube/cmd/start_flags.go b/cmd/minikube/cmd/start_flags.go index f87fd108e654..d042258fd8b3 100644 --- a/cmd/minikube/cmd/start_flags.go +++ b/cmd/minikube/cmd/start_flags.go @@ -492,9 +492,37 @@ func generateNewConfigFromFlags(cmd *cobra.Command, k8sVersion string, drvName s } } + if driver.IsKIC(drvName) { + si, err := oci.CachedDaemonInfo(drvName) + if err != nil { + exit.Message(reason.Usage, "Ensure your {{.driver_name}} is running and is healthy.", out.V{"driver_name": driver.FullName(drvName)}) + } + if si.Rootless { + if cc.KubernetesConfig.ContainerRuntime != "containerd" { + exit.Message(reason.Usage, "Container runtime must be set to \"containerd\" for rootless") + // TODO: support cri-o (https://kubernetes.io/docs/tasks/administer-cluster/kubelet-in-userns/#configuring-cri) + } + // KubeletInUserNamespace feature gate is essential for rootless driver. + // See https://kubernetes.io/docs/tasks/administer-cluster/kubelet-in-userns/ + cc.KubernetesConfig.FeatureGates = addFeatureGate(cc.KubernetesConfig.FeatureGates, "KubeletInUserNamespace=true") + } + } + return cc } +func addFeatureGate(featureGates, s string) string { + split := strings.Split(featureGates, ",") + m := make(map[string]struct{}, len(split)) + for _, v := range split { + m[v] = struct{}{} + } + if _, ok := m[s]; !ok { + split = append(split, s) + } + return strings.Join(split, ",") +} + func checkNumaCount(k8sVersion string) { if viper.GetInt(kvmNUMACount) < 1 || viper.GetInt(kvmNUMACount) > 8 { exit.Message(reason.Usage, "--kvm-numa-count range is 1-8") diff --git a/deploy/kicbase/Dockerfile b/deploy/kicbase/Dockerfile index 95a62efccfe0..d76aeecef4d4 100644 --- a/deploy/kicbase/Dockerfile +++ b/deploy/kicbase/Dockerfile @@ -30,6 +30,8 @@ RUN cd ./cmd/auto-pause/ && go build FROM ubuntu:focal-20210401 ARG BUILDKIT_VERSION="v0.9.0" +ARG FUSE_OVERLAYFS_VERSION="v1.7.1" +ARG CONTAINERD_FUSE_OVERLAYFS_VERSION="1.0.3" # copy in static files (configs, scripts) COPY deploy/kicbase/10-network-security.conf /etc/sysctl.d/10-network-security.conf @@ -113,7 +115,9 @@ RUN clean-install \ openssh-server \ dnsutils \ # libglib2.0-0 is required for conmon, which is required for podman - libglib2.0-0 + libglib2.0-0 \ + # fuse3 is required for fuse-overlayfs + fuse3 # install docker RUN sh -c "echo 'deb https://download.docker.com/linux/ubuntu focal stable' > /etc/apt/sources.list.d/docker.list" && \ @@ -121,6 +125,19 @@ RUN sh -c "echo 'deb https://download.docker.com/linux/ubuntu focal stable' > /e apt-key add - < docker.key && \ clean-install docker-ce docker-ce-cli containerd.io +# install fuse-overlayfs (used by rootless; apt-get version is old) +RUN curl -sSL --retry 5 --output /usr/local/bin/fuse-overlayfs https://github.com/containers/fuse-overlayfs/releases/download/${FUSE_OVERLAYFS_VERSION}/fuse-overlayfs-$(uname -m) \ + && chmod +x /usr/local/bin/fuse-overlayfs + +# install containerd-fuse-overlayfs (used by rootless) +RUN export ARCH=$(dpkg --print-architecture | sed 's/ppc64el/ppc64le/' | sed 's/armhf/arm-v7/') \ + && echo "Installing containerd-fuse-overlayfs..." \ + && export CONTAINERD_FUSE_OVERLAYFS_BASE_URL="https://github.com/containerd/fuse-overlayfs-snapshotter/releases/download/v${CONTAINERD_FUSE_OVERLAYFS_VERSION}" \ + && curl -sSL --retry 5 --output /tmp/containerd-fuse-overlayfs.tgz "${CONTAINERD_FUSE_OVERLAYFS_BASE_URL}/containerd-fuse-overlayfs-${CONTAINERD_FUSE_OVERLAYFS_VERSION}-linux-${ARCH}.tar.gz" \ + && tar -C /usr/local/bin -xzvf /tmp/containerd-fuse-overlayfs.tgz \ + && rm -rf /tmp/containerd-fuse-overlayfs.tgz +COPY deploy/kicbase/containerd-fuse-overlayfs.service /etc/systemd/system/containerd-fuse-overlayfs.service + # install buildkit RUN export ARCH=$(dpkg --print-architecture | sed 's/ppc64el/ppc64le/' | sed 's/armhf/arm-v7/') \ && echo "Installing buildkit ..." \ diff --git a/deploy/kicbase/containerd-fuse-overlayfs.service b/deploy/kicbase/containerd-fuse-overlayfs.service new file mode 100644 index 000000000000..a3d12bd5677a --- /dev/null +++ b/deploy/kicbase/containerd-fuse-overlayfs.service @@ -0,0 +1,13 @@ +# From https://github.com/kubernetes-sigs/kind/blob/0d3780371091b2dc9ff6eea1b6054f14ff5d970a/images/base/files/etc/systemd/system/containerd-fuse-overlayfs.service +[Unit] +Description=containerd fuse-overlayfs snapshotter +PartOf=containerd.service + +[Service] +ExecStart=/usr/local/bin/containerd-fuse-overlayfs-grpc /run/containerd-fuse-overlayfs.sock /var/lib/containerd-fuse-overlayfs +Type=notify +Restart=always +RestartSec=1 + +[Install] +WantedBy=multi-user.target diff --git a/deploy/kicbase/entrypoint b/deploy/kicbase/entrypoint index cc6a9338a054..0a0a26641c3a 100755 --- a/deploy/kicbase/entrypoint +++ b/deploy/kicbase/entrypoint @@ -19,6 +19,39 @@ set -o nounset set -o pipefail set -x +# If /proc/self/uid_map 4294967295 mappings, we are in the initial user namespace, i.e. the host. +# Otherwise we are in a non-initial user namespace. +# https://github.com/opencontainers/runc/blob/v1.0.0-rc92/libcontainer/system/linux.go#L109-L118 +userns="" +if grep -Eqv "0[[:space:]]+0[[:space:]]+4294967295" /proc/self/uid_map; then + userns="1" + echo 'INFO: running in a user namespace (experimental)' +fi + +validate_userns() { + if [[ -z "${userns}" ]]; then + return + fi + + local nofile_hard + nofile_hard="$(ulimit -Hn)" + local nofile_hard_expected="64000" + if [[ "${nofile_hard}" -lt "${nofile_hard_expected}" ]]; then + echo "WARN: UserNS: expected RLIMIT_NOFILE to be at least ${nofile_hard_expected}, got ${nofile_hard}" >&2 + fi + + if [[ ! -f "/sys/fs/cgroup/cgroup.controllers" ]]; then + echo "ERROR: UserNS: cgroup v2 needs to be enabled, see https://rootlesscontaine.rs/getting-started/common/cgroup2/" >&2 + exit 1 + fi + for f in cpu memory pids; do + if ! grep -qw $f /sys/fs/cgroup/cgroup.controllers; then + echo "ERROR: UserNS: $f controller needs to be delegated, see https://rootlesscontaine.rs/getting-started/common/cgroup2/" >&2 + exit 1 + fi + done +} + configure_containerd() { # we need to switch to the 'native' snapshotter on zfs if [[ "$(stat -f -c %T /kind)" == 'zfs' ]]; then @@ -73,12 +106,16 @@ fix_mount() { sync fi - echo 'INFO: remounting /sys read-only' - # systemd-in-a-container should have read only /sys - # https://systemd.io/CONTAINER_INTERFACE/ - # however, we need other things from `docker run --privileged` ... - # and this flag also happens to make /sys rw, amongst other things - mount -o remount,ro /sys + if [[ -z "${userns}" ]]; then + echo 'INFO: remounting /sys read-only' + # systemd-in-a-container should have read only /sys + # https://systemd.io/CONTAINER_INTERFACE/ + # however, we need other things from `docker run --privileged` ... + # and this flag also happens to make /sys rw, amongst other things + # + # This step is skipped when running inside UserNS, because it fails with EACCES. + mount -o remount,ro /sys + fi echo 'INFO: making mounts shared' >&2 # for mount propagation @@ -334,6 +371,9 @@ enable_network_magic(){ fi } +# validate state +validate_userns + # run pre-init fixups # NOTE: it's important that we do configure* first in this order to avoid races configure_containerd diff --git a/hack/preload-images/generate.go b/hack/preload-images/generate.go index 88ac9024635a..25e98d2b7794 100644 --- a/hack/preload-images/generate.go +++ b/hack/preload-images/generate.go @@ -93,7 +93,7 @@ func generateTarball(kubernetesVersion, containerRuntime, tarballFilename string if err != nil { return errors.Wrap(err, "failed create new runtime") } - if err := cr.Enable(true, false); err != nil { + if err := cr.Enable(true, false, false); err != nil { return errors.Wrap(err, "enable container runtime") } diff --git a/pkg/drivers/kic/oci/network.go b/pkg/drivers/kic/oci/network.go index b8c34533404b..a1cff1762f25 100644 --- a/pkg/drivers/kic/oci/network.go +++ b/pkg/drivers/kic/oci/network.go @@ -34,6 +34,33 @@ import ( // RoutableHostIPFromInside returns the ip/dns of the host that container lives on // is routable from inside the container func RoutableHostIPFromInside(ociBin string, clusterName string, containerName string) (net.IP, error) { + si, err := CachedDaemonInfo(ociBin) + if err != nil { + return nil, err + } + if si.Rootless { + if IsExternalDaemonHost(ociBin) { + return nil, fmt.Errorf("function RoutableHostIPFromInside is not implemented for external rootless daemons") + // TODO: parse DaemonHost() + } + addrs, err := net.InterfaceAddrs() + if err != nil { + return nil, err + } + for _, addr := range addrs { + var ip net.IP + switch v := addr.(type) { + case *net.IPAddr: + ip = v.IP + case *net.IPNet: + ip = v.IP + } + if ip != nil && !ip.IsLoopback() { + return ip, nil + } + } + return nil, fmt.Errorf("could not detect host IP, tried %v", addrs) + } if ociBin == Docker { if runtime.GOOS == "linux" { info, err := containerNetworkInspect(ociBin, clusterName) diff --git a/pkg/drivers/kic/oci/oci.go b/pkg/drivers/kic/oci/oci.go index 258c62c860fb..cacb16a9cc82 100644 --- a/pkg/drivers/kic/oci/oci.go +++ b/pkg/drivers/kic/oci/oci.go @@ -162,6 +162,9 @@ func CreateContainerNode(p CreateParams) error { // including some ones docker would otherwise do by default. // for now this is what we want. in the future we may revisit this. "--privileged", + // enable /dev/fuse explicitly for fuse-overlayfs + // (Rootless Docker does not automatically mount /dev/fuse with --privileged) + "--device", "/dev/fuse", "--security-opt", "seccomp=unconfined", // ignore seccomp "--tmpfs", "/tmp", // various things depend on working /tmp "--tmpfs", "/run", // systemd wants a writable /run diff --git a/pkg/minikube/cruntime/containerd.go b/pkg/minikube/cruntime/containerd.go index aba79f668f8e..ca50cd9892ef 100644 --- a/pkg/minikube/cruntime/containerd.go +++ b/pkg/minikube/cruntime/containerd.go @@ -69,6 +69,12 @@ oom_score = 0 [cgroup] path = "" +[proxy_plugins] +# fuse-overlayfs is used for rootless +[proxy_plugins."fuse-overlayfs"] + type = "snapshot" + address = "/run/containerd-fuse-overlayfs.sock" + [plugins] [plugins.cgroups] no_prometheus = false @@ -80,6 +86,7 @@ oom_score = 0 stats_collect_period = 10 enable_tls_streaming = false max_container_log_line_size = 16384 + restrict_oom_score_adj = {{ .RestrictOOMScoreAdj }} [plugins."io.containerd.grpc.v1.cri"] [plugins."io.containerd.grpc.v1.cri".containerd] @@ -90,7 +97,7 @@ oom_score = 0 SystemdCgroup = {{ .SystemdCgroup }} [plugins.cri.containerd] - snapshotter = "overlayfs" + snapshotter = "{{ .Snapshotter }}" [plugins.cri.containerd.default_runtime] runtime_type = "io.containerd.runc.v2" [plugins.cri.containerd.untrusted_workload_runtime] @@ -193,23 +200,31 @@ func (r *Containerd) Available() error { } // generateContainerdConfig sets up /etc/containerd/config.toml -func generateContainerdConfig(cr CommandRunner, imageRepository string, kv semver.Version, forceSystemd bool, insecureRegistry []string) error { +func generateContainerdConfig(cr CommandRunner, imageRepository string, kv semver.Version, forceSystemd bool, insecureRegistry []string, inUserNamespace bool) error { cPath := containerdConfigFile t, err := template.New("containerd.config.toml").Parse(containerdConfigTemplate) if err != nil { return err } pauseImage := images.Pause(kv, imageRepository) + snapshotter := "overlayfs" + if inUserNamespace { + snapshotter = "fuse-overlayfs" + } opts := struct { PodInfraContainerImage string SystemdCgroup bool InsecureRegistry []string CNIConfDir string + RestrictOOMScoreAdj bool + Snapshotter string }{ PodInfraContainerImage: pauseImage, SystemdCgroup: forceSystemd, InsecureRegistry: insecureRegistry, CNIConfDir: cni.ConfDir, + RestrictOOMScoreAdj: inUserNamespace, + Snapshotter: snapshotter, } var b bytes.Buffer if err := t.Execute(&b, opts); err != nil { @@ -223,7 +238,7 @@ func generateContainerdConfig(cr CommandRunner, imageRepository string, kv semve } // Enable idempotently enables containerd on a host -func (r *Containerd) Enable(disOthers, forceSystemd bool) error { +func (r *Containerd) Enable(disOthers, forceSystemd, inUserNamespace bool) error { if disOthers { if err := disableOthers(r, r.Runner); err != nil { klog.Warningf("disableOthers: %v", err) @@ -232,13 +247,19 @@ func (r *Containerd) Enable(disOthers, forceSystemd bool) error { if err := populateCRIConfig(r.Runner, r.SocketPath()); err != nil { return err } - if err := generateContainerdConfig(r.Runner, r.ImageRepository, r.KubernetesVersion, forceSystemd, r.InsecureRegistry); err != nil { + if err := generateContainerdConfig(r.Runner, r.ImageRepository, r.KubernetesVersion, forceSystemd, r.InsecureRegistry, inUserNamespace); err != nil { return err } if err := enableIPForwarding(r.Runner); err != nil { return err } + if inUserNamespace { + if err := r.Init.EnableNow("containerd-fuse-overlayfs"); err != nil { + return err + } + } + // Otherwise, containerd will fail API requests with 'Unimplemented' return r.Init.Restart("containerd") } diff --git a/pkg/minikube/cruntime/crio.go b/pkg/minikube/cruntime/crio.go index 1bca1c5eeb95..6ea8a8413f94 100644 --- a/pkg/minikube/cruntime/crio.go +++ b/pkg/minikube/cruntime/crio.go @@ -139,7 +139,10 @@ func enableIPForwarding(cr CommandRunner) error { } // Enable idempotently enables CRIO on a host -func (r *CRIO) Enable(disOthers, _ bool) error { +func (r *CRIO) Enable(disOthers, _, inUserNamespace bool) error { + if inUserNamespace { + return errors.New("inUserNamespace must not be true for cri-o (yet)") + } if disOthers { if err := disableOthers(r, r.Runner); err != nil { klog.Warningf("disableOthers: %v", err) diff --git a/pkg/minikube/cruntime/cruntime.go b/pkg/minikube/cruntime/cruntime.go index d736d809ce6b..4d42c65f8579 100644 --- a/pkg/minikube/cruntime/cruntime.go +++ b/pkg/minikube/cruntime/cruntime.go @@ -78,7 +78,7 @@ type Manager interface { // Version retrieves the current version of this runtime Version() (string, error) // Enable idempotently enables this runtime on a host - Enable(bool, bool) error + Enable(bool, bool, bool) error // Disable idempotently disables this runtime on a host Disable() error // Active returns whether or not a runtime is active on a host diff --git a/pkg/minikube/cruntime/cruntime_test.go b/pkg/minikube/cruntime/cruntime_test.go index 3a55059cc4fe..b87212b4a738 100644 --- a/pkg/minikube/cruntime/cruntime_test.go +++ b/pkg/minikube/cruntime/cruntime_test.go @@ -668,7 +668,7 @@ func TestEnable(t *testing.T) { if err != nil { t.Fatalf("New(%s): %v", tc.runtime, err) } - err = cr.Enable(true, false) + err = cr.Enable(true, false, false) if err != nil { t.Errorf("%s disable unexpected error: %v", tc.runtime, err) } diff --git a/pkg/minikube/cruntime/docker.go b/pkg/minikube/cruntime/docker.go index d3de483deee6..30772658122a 100644 --- a/pkg/minikube/cruntime/docker.go +++ b/pkg/minikube/cruntime/docker.go @@ -107,7 +107,10 @@ func (r *Docker) Active() bool { } // Enable idempotently enables Docker on a host -func (r *Docker) Enable(disOthers, forceSystemd bool) error { +func (r *Docker) Enable(disOthers, forceSystemd, inUserNamespace bool) error { + if inUserNamespace { + return errors.New("inUserNamespace must not be true for docker") + } containerdWasActive := r.Init.Active("containerd") if disOthers { diff --git a/pkg/minikube/driver/driver.go b/pkg/minikube/driver/driver.go index 6481ff632f78..3a76001a00a6 100644 --- a/pkg/minikube/driver/driver.go +++ b/pkg/minikube/driver/driver.go @@ -185,7 +185,15 @@ func NeedsPortForward(name string) bool { return true } // Docker for Desktop - return runtime.GOOS == "darwin" || runtime.GOOS == "windows" || detect.IsMicrosoftWSL() + if runtime.GOOS == "darwin" || runtime.GOOS == "windows" || detect.IsMicrosoftWSL() { + return true + } + + si, err := oci.CachedDaemonInfo(name) + if err != nil { + panic(err) + } + return si.Rootless } // HasResourceLimits returns true if driver can set resource limits such as memory size or CPU count. diff --git a/pkg/minikube/node/start.go b/pkg/minikube/node/start.go index 1361c67ebb06..2d45fabbaf20 100644 --- a/pkg/minikube/node/start.go +++ b/pkg/minikube/node/start.go @@ -349,7 +349,8 @@ func configureRuntimes(runner cruntime.CommandRunner, cc config.ClusterConfig, k } } - err = cr.Enable(disableOthers, forceSystemd()) + inUserNamespace := strings.Contains(cc.KubernetesConfig.FeatureGates, "KubeletInUserNamespace=true") + err = cr.Enable(disableOthers, forceSystemd(), inUserNamespace) if err != nil { exit.Error(reason.RuntimeEnable, "Failed to enable container runtime", err) } diff --git a/pkg/minikube/registry/drvs/docker/docker.go b/pkg/minikube/registry/drvs/docker/docker.go index a7aaea2ac89f..cc6bb558b8e4 100644 --- a/pkg/minikube/registry/drvs/docker/docker.go +++ b/pkg/minikube/registry/drvs/docker/docker.go @@ -146,14 +146,7 @@ func status() (retState registry.State) { return suggestFix("info", -1, serr, fmt.Errorf("docker info error: %s", serr)) } - if si.Rootless { - return registry.State{ - Reason: "PROVIDER_DOCKER_ROOTLESS", - Error: errors.New("rootless Docker not supported yet"), - Installed: true, - Healthy: false, - Doc: "https://github.com/kubernetes/minikube/issues/10836"} - } + // TODO: validate cgroup v2 delegation when si.Rootless is true return checkNeedsImprovement() } diff --git a/site/content/en/docs/drivers/docker.md b/site/content/en/docs/drivers/docker.md index 1300cd086715..4dad78879b96 100644 --- a/site/content/en/docs/drivers/docker.md +++ b/site/content/en/docs/drivers/docker.md @@ -21,7 +21,6 @@ The Docker driver allows you to install Kubernetes into an existing Docker insta - The following Docker runtime security options are currently *unsupported and will not work* with the Docker driver (see [#9607](https://github.com/kubernetes/minikube/issues/9607)): - [userns-remap](https://docs.docker.com/engine/security/userns-remap/) - - [rootless](https://docs.docker.com/engine/security/rootless/) - On macOS, containers might get hung and require a restart of Docker for Desktop. See [docker/for-mac#1835](https://github.com/docker/for-mac/issues/1835) diff --git a/site/content/en/docs/drivers/includes/docker_usage.inc b/site/content/en/docs/drivers/includes/docker_usage.inc index 8b1fd6c694ad..63d50ca323cc 100644 --- a/site/content/en/docs/drivers/includes/docker_usage.inc +++ b/site/content/en/docs/drivers/includes/docker_usage.inc @@ -16,3 +16,24 @@ To make docker the default driver: minikube config set driver docker ``` +## Rootless Docker +### Requirements +- Docker 20.10 or higher, see https://rootlesscontaine.rs/getting-started/docker/ +- Cgroup v2 delegation, see https://rootlesscontaine.rs/getting-started/common/cgroup2/ + +### Usage + +Start a cluster using the rootless docker driver: + +```shell +dockerd-rootless-setuptool.sh install -f +docker context use rootless + +minikube start --driver=docker --container-runtime=containerd +``` + +The `--container-runtime` flag must be currently set to "containerd". + +The restrictions of rootless `kind` apply to minikube with rootless docker as well. + +See https://kind.sigs.k8s.io/docs/user/rootless/ . From 85995e96cdd9f26c4f66ea964d19ff1bfbbcf14d Mon Sep 17 00:00:00 2001 From: Jeff MAURY Date: Mon, 30 Aug 2021 08:47:58 +0200 Subject: [PATCH 019/201] Fix french translation Signed-off-by: Jeff MAURY --- translations/fr.json | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/translations/fr.json b/translations/fr.json index 5f3e35c33a04..66c63006250a 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -76,8 +76,8 @@ "CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)": "Plug-in CNI à utiliser. Options valides : auto, bridge, calico, cilium, flannel, kindnet ou chemin vers un manifeste CNI (par défaut : auto)", "Cache image from docker daemon": "Cacher l'image du démon docker", "Cache image from remote registry": "Cacher l'image du registre distant", - "Cache image to docker daemon": "", - "Cache image to remote registry": "", + "Cache image to docker daemon": "Cacher l'image dans le démon docker", + "Cache image to remote registry": "Cacher l'image dans le registre distant", "Cannot find directory {{.path}} for copy": "Impossible de trouver le répertoire {{.path}} pour la copie", "Cannot find directory {{.path}} for mount": "Impossible de trouver le répertoire {{.path}} pour le montage", "Cannot use both --output and --format options": "Impossible d'utiliser à la fois les options --output et --format", @@ -250,21 +250,21 @@ "Failed to get command runner": "Impossible d'obtenir le lanceur de commandes", "Failed to get image map": "Échec de l'obtention de la carte d'image", "Failed to get service URL: {{.error}}": "Échec de l'obtention de l'URL du service : {{.error}}", - "Failed to get temp": "", + "Failed to get temp": "Impossible d'obtenir le répertoire temporaire", "Failed to kill mount process: {{.error}}": "Échec de l'arrêt du processus d'installation : {{.error}}", "Failed to list cached images": "Échec de l'obtention de la liste des images mises en cache", "Failed to list images": "Échec de l'obtention de la liste des images", "Failed to load image": "Échec du chargement de l'image", "Failed to persist images": "Échec de la persistance des images", "Failed to pull image": "Échec de l'extraction de l'image", - "Failed to pull images": "", - "Failed to push images": "", - "Failed to read temp": "", + "Failed to pull images": "Échec de l'extraction des images", + "Failed to push images": "Échec de la diffusion des images", + "Failed to read temp": "Échec de la lecture du répertoire temporaire", "Failed to reload cached images": "Échec du rechargement des images mises en cache", "Failed to remove image": "Échec de la suppression de l'image", "Failed to save config {{.profile}}": "Échec de l'enregistrement de la configuration {{.profile}}", "Failed to save dir": "Échec de l'enregistrement du répertoire", - "Failed to save image": "", + "Failed to save image": "Échec de l'enregistrement de l'image", "Failed to save stdin": "Échec de l'enregistrement de l'entrée standard", "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}": "Échec de la définition la variable d'environnement NO_PROXY. Veuillez utiliser `export NO_PROXY=$NO_PROXY,{{.ip}}.", "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}`.": "Échec de la définition de la variable d'environnement NO_PROXY. Veuillez utiliser `export NO_PROXY=$NO_PROXY,{{.ip}}`.", @@ -272,7 +272,7 @@ "Failed to start container runtime": "Échec du démarrage de l'exécution du conteneur", "Failed to start {{.driver}} {{.driver_type}}. Running \"{{.cmd}}\" may fix it: {{.error}}": "Échec du démarrage de {{.driver}} {{.driver_type}}. L'exécution de \"{{.cmd}}\" peut résoudre le problème : {{.error}}", "Failed to stop node {{.name}}": "Échec de l'arrêt du nœud {{.name}}", - "Failed to tag images": "", + "Failed to tag images": "Échec du marquage des images", "Failed to update cluster": "Échec de la mise à jour du cluster", "Failed to update config": "Échec de la mise à jour de la configuration", "Failed to verify '{{.driver_name}} info' will try again ...": "Échec de la vérification des informations sur '{{.driver_name}}' va réessayer ...", @@ -447,9 +447,9 @@ "Please install the minikube kvm2 VM driver, or select an alternative --driver": "Veuillez installer le pilote minikube kvm2 VM, ou sélectionnez un --driver alternatif", "Please make sure the service you are looking for is deployed or is in the correct namespace.": "Veuillez vous assurer que le service que vous recherchez est déployé ou se trouve dans le bon espace de noms.", "Please provide a path or url to build": "Veuillez fournir un chemin ou une URL à construire", - "Please provide an image in the container runtime to save from minikube via \u003cminikube image save IMAGE_NAME\u003e": "", + "Please provide an image in the container runtime to save from minikube via \u003cminikube image save IMAGE_NAME\u003e": "Veuillez fournir une image dans l'environnement d'exécution du conteneur à enregistrer à partir de minikube via \u003cminikube image save IMAGE_NAME\u003e", "Please provide an image in your local daemon to load into minikube via \u003cminikube image load IMAGE_NAME\u003e": "Veuillez fournir une image dans votre démon local à charger dans minikube via \u003cminikube image load IMAGE_NAME\u003e", - "Please provide source and target image": "", + "Please provide source and target image": "Veuillez fournir l'image source et cible", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "Veuillez réévaluer votre docker-env, pour vous assurer que vos variables d'environnement ont des ports mis à jour :\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "Veuillez réévaluer votre podman-env, pour vous assurer que vos variables d'environnement ont des ports mis à jour :\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t", "Please see {{.documentation_url}} for more details": "Veuillez consulter {{.documentation_url}} pour plus de détails", @@ -475,11 +475,11 @@ "Profile name '{{.profilename}}' is not valid": "Le nom de profil '{{.profilename}}' n'est pas valide", "Profile name should be unique": "Le nom du profil doit être unique", "Provide VM UUID to restore MAC address (hyperkit driver only)": "Fournit l'identifiant unique universel (UUID) de la VM pour restaurer l'adresse MAC (pilote hyperkit uniquement).", - "Pull images": "", + "Pull images": "Extraction des images", "Pull the remote image (no caching)": "Extraire l'image distante (pas de mise en cache)", "Pulling base image ...": "Extraction de l'image de base...", "Pulling images ...": "Extraction des images... ", - "Push images": "", + "Push images": "Diffusion des images", "Push the new image (requires tag)": "Pousser la nouvelle image (nécessite une balise)", "Reboot to complete VirtualBox installation, verify that VirtualBox is not blocked by your system, and/or use another hypervisor": "Redémarrez pour terminer l'installation de VirtualBox, vérifiez que VirtualBox n'est pas bloqué par votre système et/ou utilisez un autre hyperviseur", "Rebuild libvirt with virt-network support": "Reconstruire libvirt avec le support de virt-network", @@ -537,7 +537,7 @@ "SSH key (ssh driver only)": "Clé SSH (pilote ssh uniquement)", "SSH port (ssh driver only)": "Port SSH (pilote ssh uniquement)", "SSH user (ssh driver only)": "Utilisateur SSH (pilote ssh uniquement)", - "Save a image from minikube": "", + "Save a image from minikube": "Enregistrer une image de minikube", "Select a valid value for --dnsdomain": "Sélectionnez une valeur valide pour --dnsdomain", "Send trace events. Options include: [gcp]": "Envoyer des événements de trace. Les options incluent : [gcp]", "Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "Le service '{{.service}}' n'a pas été trouvé dans l'espace de noms '{{.namespace}}'.\nVous pouvez sélectionner un autre espace de noms en utilisant 'minikube service {{.service}} -n \u003cnamespace\u003e'. Ou répertoriez tous les services à l'aide de 'minikube service list'", @@ -600,7 +600,7 @@ "Successfully stopped node {{.name}}": "Nœud {{.name}} arrêté avec succès", "Suggestion: {{.advice}}": "Suggestion : {{.advice}}", "System only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "Le système n'a que {{.size}} Mio disponibles, moins que les {{.req}} Mio requis pour Kubernetes", - "Tag images": "", + "Tag images": "Marquer des images", "Tag to apply to the new image (optional)": "Tag à appliquer à la nouvelle image (facultatif)", "Target directory {{.path}} must be an absolute path": "Le répertoire cible {{.path}} doit être un chemin absolu", "Target {{.path}} can not be empty": "La cible {{.path}} ne peut pas être vide", @@ -883,7 +883,7 @@ "failed to add node": "échec de l'ajout du nœud", "failed to open browser: {{.error}}": "échec de l'ouverture du navigateur : {{.error}}", "failed to save config": "échec de l'enregistrement de la configuration", - "failed to set cloud shell kubelet config options": "", + "failed to set cloud shell kubelet config options": "échec de la définition des options de configuration cloud shell kubelet", "failed to start node": "échec du démarrage du nœud", "fish completion failed": "la complétion fish a échoué", "fish completion.": "complétion fish.", From eb78bb760255bee4c56e3d6c443251b762c36e71 Mon Sep 17 00:00:00 2001 From: Jayesh Srivastava Date: Mon, 30 Aug 2021 23:23:30 +0530 Subject: [PATCH 020/201] Update version.go --- cmd/minikube/cmd/version.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/minikube/cmd/version.go b/cmd/minikube/cmd/version.go index 6f2a2da02b85..ce73d48043a5 100644 --- a/cmd/minikube/cmd/version.go +++ b/cmd/minikube/cmd/version.go @@ -63,6 +63,7 @@ var versionCmd = &cobra.Command{ "buildctl": exec.Command("buildctl", "--version"), "ctr": exec.Command("ctr", "--version"), "runc": exec.Command("runc", "--version"), + "crun": exec.Command("crun", "--version"), } for k, v := range versionCMDS { rr, err := runner.RunCmd(v) From ecaa3e7dc66ec29c4a88a96c6ca21a211b0efede Mon Sep 17 00:00:00 2001 From: Medya Gh Date: Mon, 30 Aug 2021 14:36:59 -0700 Subject: [PATCH 021/201] update go bump version logic to match kubernetes new image for kube cross --- Makefile | 7 ++++++- hack/update/golang_version/update_golang_version.go | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 9eb0bdba9606..355fc6afa123 100644 --- a/Makefile +++ b/Makefile @@ -34,6 +34,10 @@ RPM_REVISION ?= 0 # used by hack/jenkins/release_build_and_upload.sh and KVM_BUILD_IMAGE, see also BUILD_IMAGE below # update this only by running `make update-golang-version` GO_VERSION ?= 1.16.7 +# Kubernetes uses k8s version in golang image version because: +# https://github.com/kubernetes/kubernetes/pull/103692#issuecomment-908659826 +# TODO: make automation update this #12374 +K8S_GO_VERSION ?= v1.23.0 # replace "x.y.0" => "x.y". kube-cross and golang.org/dl use different formats for x.y.0 go versions KVM_GO_VERSION ?= $(GO_VERSION:.0=) @@ -52,7 +56,8 @@ HYPERKIT_BUILD_IMAGE ?= neilotoole/xcgo:go1.15 # NOTE: "latest" as of 2021-02-06. kube-cross images aren't updated as often as Kubernetes # https://github.com/kubernetes/kubernetes/blob/master/build/build-image/cross/VERSION # -BUILD_IMAGE ?= us.gcr.io/k8s-artifacts-prod/build-image/kube-cross:v$(GO_VERSION)-1 + +BUILD_IMAGE ?= us.gcr.io/k8s-artifacts-prod/build-image/kube-cross:v1.23.0-go$(GO_VERSION)-buster.0 ISO_BUILD_IMAGE ?= $(REGISTRY)/buildroot-image diff --git a/hack/update/golang_version/update_golang_version.go b/hack/update/golang_version/update_golang_version.go index 4978e46b2dc1..4d6c6e647ea7 100644 --- a/hack/update/golang_version/update_golang_version.go +++ b/hack/update/golang_version/update_golang_version.go @@ -163,8 +163,10 @@ func goVersions() (stable, stableMM string, err error) { if err != nil { return "", "", err } + // example response: v1.23.0-go1.17-buster.0 stable = strings.TrimPrefix(string(body), "v") - stable = strings.Split(stable, "-")[0] + stable = strings.Split(stable, "-")[1] + stable = strings.Replace(stable, "go", "", 1) mmp := strings.SplitN(stable, ".", 3) stableMM = strings.Join(mmp[0:2], ".") // . version return stable, stableMM, nil From d092445716978ce9c98ce68fb4e7010e39934f37 Mon Sep 17 00:00:00 2001 From: Medya Gh Date: Mon, 30 Aug 2021 14:42:40 -0700 Subject: [PATCH 022/201] add prefix var --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 355fc6afa123..af54a8bdeaf9 100644 --- a/Makefile +++ b/Makefile @@ -37,7 +37,7 @@ GO_VERSION ?= 1.16.7 # Kubernetes uses k8s version in golang image version because: # https://github.com/kubernetes/kubernetes/pull/103692#issuecomment-908659826 # TODO: make automation update this #12374 -K8S_GO_VERSION ?= v1.23.0 +GO_K8S_VERSION_PREFIX ?= v1.23.0 # replace "x.y.0" => "x.y". kube-cross and golang.org/dl use different formats for x.y.0 go versions KVM_GO_VERSION ?= $(GO_VERSION:.0=) @@ -57,7 +57,7 @@ HYPERKIT_BUILD_IMAGE ?= neilotoole/xcgo:go1.15 # https://github.com/kubernetes/kubernetes/blob/master/build/build-image/cross/VERSION # -BUILD_IMAGE ?= us.gcr.io/k8s-artifacts-prod/build-image/kube-cross:v1.23.0-go$(GO_VERSION)-buster.0 +BUILD_IMAGE ?= us.gcr.io/k8s-artifacts-prod/build-image/kube-cross:$(GO_K8S_VERSION_PREFIX)-go$(GO_VERSION)-buster.0 ISO_BUILD_IMAGE ?= $(REGISTRY)/buildroot-image From 50e14f30c3f6fa12bc06bab3acf7b61539d2f773 Mon Sep 17 00:00:00 2001 From: Medya Gh Date: Mon, 30 Aug 2021 14:53:28 -0700 Subject: [PATCH 023/201] add automation for k8s version --- Makefile | 4 +--- .../golang_version/update_golang_version.go | 16 ++++++++++------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index af54a8bdeaf9..eb3dbb63bb64 100644 --- a/Makefile +++ b/Makefile @@ -34,9 +34,7 @@ RPM_REVISION ?= 0 # used by hack/jenkins/release_build_and_upload.sh and KVM_BUILD_IMAGE, see also BUILD_IMAGE below # update this only by running `make update-golang-version` GO_VERSION ?= 1.16.7 -# Kubernetes uses k8s version in golang image version because: -# https://github.com/kubernetes/kubernetes/pull/103692#issuecomment-908659826 -# TODO: make automation update this #12374 +# update this only by running `make update-golang-version` GO_K8S_VERSION_PREFIX ?= v1.23.0 # replace "x.y.0" => "x.y". kube-cross and golang.org/dl use different formats for x.y.0 go versions diff --git a/hack/update/golang_version/update_golang_version.go b/hack/update/golang_version/update_golang_version.go index 4d6c6e647ea7..7752cfd8fc4e 100644 --- a/hack/update/golang_version/update_golang_version.go +++ b/hack/update/golang_version/update_golang_version.go @@ -119,7 +119,8 @@ var ( "Makefile": { Replace: map[string]string{ // searching for 1.* so it does NOT match "KVM_GO_VERSION ?= $(GO_VERSION:.0=)" in the Makefile - `GO_VERSION \?= 1.*`: `GO_VERSION ?= {{.StableVersion}}`, + `GO_VERSION \?= 1.*`: `GO_VERSION ?= {{.StableVersion}}`, + `GO_K8S_VERSION \?= 1.*`: `GO_K8S_VERSION ?= {{.K8sVersion}}`, }, }, } @@ -134,6 +135,8 @@ var ( type Data struct { StableVersion string `json:"stableVersion"` StableVersionMM string `json:"stableVersionMM"` // go.mod wants go version in . format + K8SVersion string `json:"k8sVersionMM"` // as of v1.23.0 Kubernetes uses k8s version in golang image name because: https://github.com/kubernetes/kubernetes/pull/103692#issuecomment-908659826 + } func main() { @@ -142,18 +145,18 @@ func main() { defer cancel() // get Golang stable version - stable, stableMM, err := goVersions() + stable, stableMM, k8sVersion, err := goVersions() if err != nil || stable == "" || stableMM == "" { klog.Fatalf("Unable to get Golang stable version: %v", err) } - data := Data{StableVersion: stable, StableVersionMM: stableMM} + data := Data{StableVersion: stable, StableVersionMM: stableMM, K8SVersion: k8sVersion} klog.Infof("Golang stable version: %s", data.StableVersion) update.Apply(ctx, schema, data, prBranchPrefix, prTitle, prIssue) } // goVersion returns Golang stable version. -func goVersions() (stable, stableMM string, err error) { +func goVersions() (stable, stableMM, k8sVersion string, err error) { // will update to the same image that kubernetes project uses resp, err := http.Get("https://raw.githubusercontent.com/kubernetes/kubernetes/master/build/build-image/cross/VERSION") if err != nil { @@ -164,10 +167,11 @@ func goVersions() (stable, stableMM string, err error) { return "", "", err } // example response: v1.23.0-go1.17-buster.0 - stable = strings.TrimPrefix(string(body), "v") + stable = string(body) + k8sVersion := strings.Split(stable, "-")[0] stable = strings.Split(stable, "-")[1] stable = strings.Replace(stable, "go", "", 1) mmp := strings.SplitN(stable, ".", 3) stableMM = strings.Join(mmp[0:2], ".") // . version - return stable, stableMM, nil + return stable, stableMM, k8sVersion, nil } From 2e9915dbbf5b8236f73eb092e668145861e6c852 Mon Sep 17 00:00:00 2001 From: Medya Gh Date: Mon, 30 Aug 2021 15:01:56 -0700 Subject: [PATCH 024/201] fix regex --- Makefile | 2 +- hack/update/golang_version/update_golang_version.go | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index eb3dbb63bb64..76bb1dcb6bf2 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ RPM_REVISION ?= 0 # update this only by running `make update-golang-version` GO_VERSION ?= 1.16.7 # update this only by running `make update-golang-version` -GO_K8S_VERSION_PREFIX ?= v1.23.0 +GO_K8S_VERSION_PREFIX ?= v1.21.0 # replace "x.y.0" => "x.y". kube-cross and golang.org/dl use different formats for x.y.0 go versions KVM_GO_VERSION ?= $(GO_VERSION:.0=) diff --git a/hack/update/golang_version/update_golang_version.go b/hack/update/golang_version/update_golang_version.go index 7752cfd8fc4e..caff227cea06 100644 --- a/hack/update/golang_version/update_golang_version.go +++ b/hack/update/golang_version/update_golang_version.go @@ -119,8 +119,8 @@ var ( "Makefile": { Replace: map[string]string{ // searching for 1.* so it does NOT match "KVM_GO_VERSION ?= $(GO_VERSION:.0=)" in the Makefile - `GO_VERSION \?= 1.*`: `GO_VERSION ?= {{.StableVersion}}`, - `GO_K8S_VERSION \?= 1.*`: `GO_K8S_VERSION ?= {{.K8sVersion}}`, + `GO_VERSION \?= 1.*`: `GO_VERSION ?= {{.StableVersion}}`, + `GO_K8S_VERSION \?= v1.*`: `GO_K8S_VERSION ?= {{.K8SVersion}}`, }, }, } @@ -135,7 +135,7 @@ var ( type Data struct { StableVersion string `json:"stableVersion"` StableVersionMM string `json:"stableVersionMM"` // go.mod wants go version in . format - K8SVersion string `json:"k8sVersionMM"` // as of v1.23.0 Kubernetes uses k8s version in golang image name because: https://github.com/kubernetes/kubernetes/pull/103692#issuecomment-908659826 + K8SVersion string `json:"k8sVersion"` // as of v1.23.0 Kubernetes uses k8s version in golang image name because: https://github.com/kubernetes/kubernetes/pull/103692#issuecomment-908659826 } @@ -160,15 +160,15 @@ func goVersions() (stable, stableMM, k8sVersion string, err error) { // will update to the same image that kubernetes project uses resp, err := http.Get("https://raw.githubusercontent.com/kubernetes/kubernetes/master/build/build-image/cross/VERSION") if err != nil { - return "", "", err + return "", "", "", err } body, err := ioutil.ReadAll(resp.Body) if err != nil { - return "", "", err + return "", "", "", err } // example response: v1.23.0-go1.17-buster.0 stable = string(body) - k8sVersion := strings.Split(stable, "-")[0] + k8sVersion = strings.Split(stable, "-")[0] stable = strings.Split(stable, "-")[1] stable = strings.Replace(stable, "go", "", 1) mmp := strings.SplitN(stable, ".", 3) From b6dfcd53e5ee554beff18a89f6ca9c903d0546cb Mon Sep 17 00:00:00 2001 From: Medya Gh Date: Mon, 30 Aug 2021 15:04:41 -0700 Subject: [PATCH 025/201] fix regex --- hack/update/golang_version/update_golang_version.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hack/update/golang_version/update_golang_version.go b/hack/update/golang_version/update_golang_version.go index caff227cea06..245c801db157 100644 --- a/hack/update/golang_version/update_golang_version.go +++ b/hack/update/golang_version/update_golang_version.go @@ -119,8 +119,8 @@ var ( "Makefile": { Replace: map[string]string{ // searching for 1.* so it does NOT match "KVM_GO_VERSION ?= $(GO_VERSION:.0=)" in the Makefile - `GO_VERSION \?= 1.*`: `GO_VERSION ?= {{.StableVersion}}`, - `GO_K8S_VERSION \?= v1.*`: `GO_K8S_VERSION ?= {{.K8SVersion}}`, + `GO_VERSION \?= 1.*`: `GO_VERSION ?= {{.StableVersion}}`, + `GO_K8S_VERSION_PREFIX \?= v1.*`: `GO_K8S_VERSION_PREFIX ?= {{.K8SVersion}}`, }, }, } From 402994d99ea5daf7d1846fd554f711427f46aeb7 Mon Sep 17 00:00:00 2001 From: Medya Gh Date: Mon, 30 Aug 2021 15:05:08 -0700 Subject: [PATCH 026/201] fix regex --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 76bb1dcb6bf2..eb3dbb63bb64 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ RPM_REVISION ?= 0 # update this only by running `make update-golang-version` GO_VERSION ?= 1.16.7 # update this only by running `make update-golang-version` -GO_K8S_VERSION_PREFIX ?= v1.21.0 +GO_K8S_VERSION_PREFIX ?= v1.23.0 # replace "x.y.0" => "x.y". kube-cross and golang.org/dl use different formats for x.y.0 go versions KVM_GO_VERSION ?= $(GO_VERSION:.0=) From 69a5a9383c67db944cd1abe7cefecf3962f9cf67 Mon Sep 17 00:00:00 2001 From: Pablo Caderno Date: Tue, 31 Aug 2021 09:16:37 +1000 Subject: [PATCH 027/201] Refactored code into functions. Added tests --- cmd/minikube/cmd/start.go | 109 ++++++++++++++++++--------------- cmd/minikube/cmd/start_test.go | 67 ++++++++++++++++++++ 2 files changed, 128 insertions(+), 48 deletions(-) diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index a5546e0aae66..c9b2cc9a8060 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -1088,13 +1088,9 @@ func validateCPUCount(drvName string) { // validateFlags validates the supplied flags against known bad combinations func validateFlags(cmd *cobra.Command, drvName string) { if cmd.Flags().Changed(humanReadableDiskSize) { - diskSizeMB, err := util.CalculateSizeInMB(viper.GetString(humanReadableDiskSize)) + err := validateDiskSize(viper.GetString(humanReadableDiskSize)) if err != nil { - exitIfNotForced(reason.Usage, "Validation unable to parse disk size '{{.diskSize}}': {{.error}}", out.V{"diskSize": viper.GetString(humanReadableDiskSize), "error": err}) - } - - if diskSizeMB < minimumDiskSize { - exitIfNotForced(reason.RsrcInsufficientStorage, "Requested disk size {{.requested_size}} is less than minimum of {{.minimum_size}}", out.V{"requested_size": diskSizeMB, "minimum_size": minimumDiskSize}) + exit.Message(reason.Usage, "{{.err}}", out.V{"err": err}) } } @@ -1117,7 +1113,6 @@ func validateFlags(cmd *cobra.Command, drvName string) { if cmd.Flags().Changed(imageRepository) { viper.Set(imageRepository, validateImageRepository(viper.GetString(imageRepository))) } - if cmd.Flags().Changed(ports) { err := validatePorts(viper.GetStringSlice(ports)) if err != nil { @@ -1127,29 +1122,11 @@ func validateFlags(cmd *cobra.Command, drvName string) { } if cmd.Flags().Changed(containerRuntime) { - runtime := strings.ToLower(viper.GetString(containerRuntime)) - - validOptions := cruntime.ValidRuntimes() - // `crio` is accepted as an alternative spelling to `cri-o` - validOptions = append(validOptions, constants.CRIO) - - var validRuntime bool - for _, option := range validOptions { - if runtime == option { - validRuntime = true - } - - // Convert `cri-o` to `crio` as the K8s config uses the `crio` spelling - if runtime == "cri-o" { - viper.Set(containerRuntime, constants.CRIO) - } - } - - if !validRuntime { - exit.Message(reason.Usage, `Invalid Container Runtime: "{{.runtime}}". Valid runtimes are: {{.validOptions}}`, out.V{"runtime": runtime, "validOptions": strings.Join(cruntime.ValidRuntimes(), ", ")}) + err := validateRuntime(viper.GetString(containerRuntime)) + if err != nil { + exit.Message(reason.Usage, "{{.err}}", out.V{"err": err}) } - - validateCNI(cmd, runtime) + validateCNI(cmd, viper.GetString(containerRuntime)) } if driver.BareMetal(drvName) { @@ -1214,6 +1191,61 @@ func validateFlags(cmd *cobra.Command, drvName string) { validateInsecureRegistry() } +// This function validates that the --ports are not below 1024 for the host and not outside range +func validatePorts(ports []string) error { + for _, portDuplet := range ports { + for i, port := range strings.Split(portDuplet, ":") { + p, err := strconv.Atoi(port) + if err != nil { + return errors.Errorf("Sorry, one of the ports provided with --ports flag is not valid %s", ports) + } + if p > 65535 || p < 1 { + return errors.Errorf("Sorry, one of the ports provided with --ports flag is outside range %s", ports) + } + if p < 1024 && i == 0 { + return errors.Errorf("Sorry, you cannot use privileged ports on the host (below 1024) %s", ports) + } + } + } + return nil +} + +// validateDiskSize validates the supplied disk size +func validateDiskSize(diskSize string) error { + diskSizeMB, err := util.CalculateSizeInMB(diskSize) + if err != nil { + return errors.Errorf("Validation unable to parse disk size %v: %v", diskSize, err) + } + if diskSizeMB < minimumDiskSize { + return errors.Errorf("Requested disk size %v is less than minimum of %v", diskSizeMB, minimumDiskSize) + } + return nil +} + +// validateRuntime validates the supplied runtime +func validateRuntime(runtime string) error { + validOptions := cruntime.ValidRuntimes() + // `crio` is accepted as an alternative spelling to `cri-o` + validOptions = append(validOptions, constants.CRIO) + + var validRuntime bool + for _, option := range validOptions { + if runtime == option { + validRuntime = true + } + + // Convert `cri-o` to `crio` as the K8s config uses the `crio` spelling + if runtime == "cri-o" { + viper.Set(containerRuntime, constants.CRIO) + } + } + + if !validRuntime { + return errors.Errorf("Invalid Container Runtime: %s. Valid runtimes are: %s", runtime, cruntime.ValidRuntimes()) + } + return nil +} + // if container runtime is not docker, check that cni is not disabled func validateCNI(cmd *cobra.Command, runtime string) { if runtime == "docker" { @@ -1322,25 +1354,6 @@ func validateListenAddress(listenAddr string) { } } -// This function validates that the --ports are not below 1024 for the host and not outside range -func validatePorts(ports []string) error { - for _, portDuplet := range ports { - for i, port := range strings.Split(portDuplet, ":") { - p, err := strconv.Atoi(port) - if err != nil { - return errors.Errorf("Sorry, one of the ports provided with --ports flag is not valid %s", ports) - } - if p > 65535 || p < 1 { - return errors.Errorf("Sorry, one of the ports provided with --ports flag is outside range %s", ports) - } - if p < 1024 && i == 0 { - return errors.Errorf("Sorry, you cannot use privileged ports on the host (below 1024) %s", ports) - } - } - } - return nil -} - // This function validates that the --insecure-registry follows one of the following formats: // "[:]" "[:]" "/" func validateInsecureRegistry() { diff --git a/cmd/minikube/cmd/start_test.go b/cmd/minikube/cmd/start_test.go index 8ed305cdfe25..fef084f0c837 100644 --- a/cmd/minikube/cmd/start_test.go +++ b/cmd/minikube/cmd/start_test.go @@ -17,6 +17,7 @@ limitations under the License. package cmd import ( + "fmt" "os" "strings" "testing" @@ -27,6 +28,7 @@ import ( cfg "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/constants" + "k8s.io/minikube/pkg/minikube/cruntime" "k8s.io/minikube/pkg/minikube/driver" "k8s.io/minikube/pkg/minikube/proxy" ) @@ -364,6 +366,71 @@ func TestValidateImageRepository(t *testing.T) { } +func TestValidateDiskSize(t *testing.T) { + var tests = []struct { + diskSize string + errorMsg string + }{ + { + diskSize: "2G", + errorMsg: "", + }, + { + diskSize: "test", + errorMsg: "Validation unable to parse disk size test: FromHumanSize: invalid size: 'test'", + }, + { + diskSize: "6M", + errorMsg: fmt.Sprintf("Requested disk size 6 is less than minimum of %v", minimumDiskSize), + }, + } + for _, test := range tests { + t.Run(test.diskSize, func(t *testing.T) { + got := validateDiskSize(test.diskSize) + gotError := "" + if got != nil { + gotError = got.Error() + } + if gotError != test.errorMsg { + t.Errorf("validateDiskSize(diskSize=%v): got %v, expected %v", test.diskSize, got, test.errorMsg) + } + }) + } +} + +func TestValidateRuntime(t *testing.T) { + var tests = []struct { + runtime string + errorMsg string + }{ + { + runtime: "cri-o", + errorMsg: "", + }, + { + runtime: "docker", + errorMsg: "", + }, + + { + runtime: "test", + errorMsg: fmt.Sprintf("Invalid Container Runtime: test. Valid runtimes are: %v", cruntime.ValidRuntimes()), + }, + } + for _, test := range tests { + t.Run(test.runtime, func(t *testing.T) { + got := validateRuntime(test.runtime) + gotError := "" + if got != nil { + gotError = got.Error() + } + if gotError != test.errorMsg { + t.Errorf("ValidateRuntime(runtime=%v): got %v, expected %v", test.runtime, got, test.errorMsg) + } + }) + } +} + func TestValidatePorts(t *testing.T) { var tests = []struct { ports []string From a622f50c5dbe8addfae8ae9c3c71c411d9e6b917 Mon Sep 17 00:00:00 2001 From: Medya Gh Date: Mon, 30 Aug 2021 16:42:44 -0700 Subject: [PATCH 028/201] fix depricated image in helm addon --- pkg/minikube/assets/addons.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/minikube/assets/addons.go b/pkg/minikube/assets/addons.go index 3987104f71f1..a2c536c6a6c3 100755 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -467,9 +467,9 @@ var Addons = map[string]*Addon{ "helm-tiller-svc.yaml", "0640"), }, false, "helm-tiller", "", map[string]string{ - "Tiller": "kubernetes-helm/tiller:v2.16.12@sha256:6003775d503546087266eda39418d221f9afb5ccfe35f637c32a1161619a3f9c", + "Tiller": "helm/tiller:v2.16.12@sha256:6003775d503546087266eda39418d221f9afb5ccfe35f637c32a1161619a3f9c", }, map[string]string{ - "Tiller": "gcr.io", + "Tiller": "ghcr.io", }), "ingress-dns": NewAddon([]*BinAsset{ MustBinAsset(addons.IngressDNSAssets, From 8c096cc3a7127a4f1f3710f44e5ea4fa1c6d58c0 Mon Sep 17 00:00:00 2001 From: Medya Gh Date: Mon, 30 Aug 2021 16:44:13 -0700 Subject: [PATCH 029/201] fix depricated image in helm addon --- pkg/minikube/assets/addons.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/minikube/assets/addons.go b/pkg/minikube/assets/addons.go index a2c536c6a6c3..8f1ae2f64553 100755 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -469,6 +469,8 @@ var Addons = map[string]*Addon{ }, false, "helm-tiller", "", map[string]string{ "Tiller": "helm/tiller:v2.16.12@sha256:6003775d503546087266eda39418d221f9afb5ccfe35f637c32a1161619a3f9c", }, map[string]string{ + // GCR is deprecated in helm + // https://github.com/helm/helm/issues/10004#issuecomment-894478908 "Tiller": "ghcr.io", }), "ingress-dns": NewAddon([]*BinAsset{ From bf5f081a53830ec6eb333ca710fa3eaa29f8b5fe Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 30 Aug 2021 23:49:19 +0000 Subject: [PATCH 030/201] bump golang versions --- .github/workflows/build.yml | 2 +- .github/workflows/docs.yml | 2 +- .github/workflows/leaderboard.yml | 2 +- .github/workflows/master.yml | 2 +- .github/workflows/pr.yml | 2 +- .github/workflows/pr_verified.yaml | 2 +- .github/workflows/time-to-k8s-public-chart.yml | 2 +- .github/workflows/time-to-k8s.yml | 2 +- .github/workflows/translations.yml | 2 +- .github/workflows/update-golang-version.yml | 2 +- .github/workflows/update-golint-version.yml | 2 +- .github/workflows/update-k8s-versions.yml | 2 +- Makefile | 2 +- go.mod | 2 +- hack/jenkins/common.sh | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c9c14c92dd83..4ae5346ae073 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ on: - "!deploy/iso/**" env: GOPROXY: https://proxy.golang.org - GO_VERSION: '1.16.7' + GO_VERSION: '1.17' jobs: build_minikube: runs-on: ubuntu-18.04 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 10415104ef26..2f441d05727d 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -6,7 +6,7 @@ on: - master env: GOPROXY: https://proxy.golang.org - GO_VERSION: '1.16.7' + GO_VERSION: '1.17' jobs: generate-docs: runs-on: ubuntu-18.04 diff --git a/.github/workflows/leaderboard.yml b/.github/workflows/leaderboard.yml index 0c78b6e87e1c..72ad32260ebd 100644 --- a/.github/workflows/leaderboard.yml +++ b/.github/workflows/leaderboard.yml @@ -7,7 +7,7 @@ on: release: types: [published] env: - GO_VERSION: '1.16.7' + GO_VERSION: '1.17' jobs: update-leaderboard: runs-on: ubuntu-latest diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index d735338d83a3..480c8d703c65 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -14,7 +14,7 @@ on: - "!deploy/iso/**" env: GOPROXY: https://proxy.golang.org - GO_VERSION: '1.16.7' + GO_VERSION: '1.17' jobs: # Runs before all other jobs # builds the minikube binaries diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 1b1c36b1734f..28806473702b 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -12,7 +12,7 @@ on: - "!deploy/iso/**" env: GOPROXY: https://proxy.golang.org - GO_VERSION: '1.16.7' + GO_VERSION: '1.17' jobs: # Runs before all other jobs # builds the minikube binaries diff --git a/.github/workflows/pr_verified.yaml b/.github/workflows/pr_verified.yaml index 5dabbfd60f87..c922a6d40ca5 100644 --- a/.github/workflows/pr_verified.yaml +++ b/.github/workflows/pr_verified.yaml @@ -21,7 +21,7 @@ on: - deleted env: GOPROXY: https://proxy.golang.org - GO_VERSION: '1.16.7' + GO_VERSION: '1.17' jobs: # Runs before all other jobs diff --git a/.github/workflows/time-to-k8s-public-chart.yml b/.github/workflows/time-to-k8s-public-chart.yml index a41de2aa068b..841605c49bab 100644 --- a/.github/workflows/time-to-k8s-public-chart.yml +++ b/.github/workflows/time-to-k8s-public-chart.yml @@ -6,7 +6,7 @@ on: - cron: "0 2,14 * * *" env: GOPROXY: https://proxy.golang.org - GO_VERSION: '1.16.7' + GO_VERSION: '1.17' jobs: time-to-k8s-public-chart: runs-on: ubuntu-latest diff --git a/.github/workflows/time-to-k8s.yml b/.github/workflows/time-to-k8s.yml index 791b2a19c9fc..348207041fa0 100644 --- a/.github/workflows/time-to-k8s.yml +++ b/.github/workflows/time-to-k8s.yml @@ -5,7 +5,7 @@ on: types: [released] env: GOPROXY: https://proxy.golang.org - GO_VERSION: '1.16.7' + GO_VERSION: '1.17' jobs: benchmark: runs-on: ubuntu-20.04 diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml index 98605138e656..d4266707573d 100644 --- a/.github/workflows/translations.yml +++ b/.github/workflows/translations.yml @@ -6,7 +6,7 @@ on: - "translations/**" env: GOPROXY: https://proxy.golang.org - GO_VERSION: '1.16.7' + GO_VERSION: '1.17' jobs: unit_test: runs-on: ubuntu-20.04 diff --git a/.github/workflows/update-golang-version.yml b/.github/workflows/update-golang-version.yml index 18cc51b982fb..ce62d66b104c 100644 --- a/.github/workflows/update-golang-version.yml +++ b/.github/workflows/update-golang-version.yml @@ -6,7 +6,7 @@ on: - cron: "0 9 * * 1" env: GOPROXY: https://proxy.golang.org - GO_VERSION: '1.16.7' + GO_VERSION: '1.17' jobs: bump-golang-version: runs-on: ubuntu-latest diff --git a/.github/workflows/update-golint-version.yml b/.github/workflows/update-golint-version.yml index 3b21d6da968c..53504e300560 100644 --- a/.github/workflows/update-golint-version.yml +++ b/.github/workflows/update-golint-version.yml @@ -6,7 +6,7 @@ on: - cron: "0 10 * * 1" env: GOPROXY: https://proxy.golang.org - GO_VERSION: '1.16.7' + GO_VERSION: '1.17' jobs: bump-golint-version: runs-on: ubuntu-latest diff --git a/.github/workflows/update-k8s-versions.yml b/.github/workflows/update-k8s-versions.yml index d94302a62a5f..ae2fe4432638 100644 --- a/.github/workflows/update-k8s-versions.yml +++ b/.github/workflows/update-k8s-versions.yml @@ -6,7 +6,7 @@ on: - cron: "0 8 * * 1" env: GOPROXY: https://proxy.golang.org - GO_VERSION: '1.16.7' + GO_VERSION: '1.17' jobs: bump-k8s-versions: runs-on: ubuntu-20.04 diff --git a/Makefile b/Makefile index eb3dbb63bb64..53df20ee2978 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ RPM_REVISION ?= 0 # used by hack/jenkins/release_build_and_upload.sh and KVM_BUILD_IMAGE, see also BUILD_IMAGE below # update this only by running `make update-golang-version` -GO_VERSION ?= 1.16.7 +GO_VERSION ?= 1.17 # update this only by running `make update-golang-version` GO_K8S_VERSION_PREFIX ?= v1.23.0 diff --git a/go.mod b/go.mod index 57124aac7ca2..6c607f9afbcd 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module k8s.io/minikube -go 1.16 +go 1.17 require ( cloud.google.com/go/storage v1.15.0 diff --git a/hack/jenkins/common.sh b/hack/jenkins/common.sh index 2c795da101c7..d1e1d9929cc8 100755 --- a/hack/jenkins/common.sh +++ b/hack/jenkins/common.sh @@ -91,7 +91,7 @@ else fi # installing golang so we could do go get for gopogh -./installers/check_install_golang.sh "1.16.7" "/usr/local" || true +./installers/check_install_golang.sh "1.17" "/usr/local" || true # install docker and kubectl if not present sudo ARCH="$ARCH" ./installers/check_install_docker.sh || true From 30f7220ad18a5ac58e94de08f62c54866d06cfa5 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 30 Aug 2021 23:53:12 +0000 Subject: [PATCH 031/201] Update auto-generated docs and translations --- translations/de.json | 3 ++- translations/es.json | 3 ++- translations/fr.json | 2 ++ translations/ja.json | 3 ++- translations/ko.json | 3 ++- translations/pl.json | 3 ++- translations/strings.txt | 3 ++- translations/zh-CN.json | 3 ++- 8 files changed, 16 insertions(+), 7 deletions(-) diff --git a/translations/de.json b/translations/de.json index 79b79eac6fdb..4c52b30ad921 100644 --- a/translations/de.json +++ b/translations/de.json @@ -102,6 +102,7 @@ "Connect to LoadBalancer services": "", "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "", "Consider increasing Docker Desktop's memory size.": "", + "Container runtime must be set to \\\"containerd\\\" for rootless": "", "Continuously listing/getting the status with optional interval duration.": "", "Control Plane could not update, try minikube delete --all --purge": "", "Copy the specified file into minikube": "", @@ -407,7 +408,7 @@ "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "", "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "", "Number of CPUs allocated to the minikube VM": "Anzahl der CPUs, die der minikube-VM zugeordnet sind", - "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit and kvm2 drivers)": "", "Number of lines back to go within the log": "", "OS release is {{.pretty_name}}": "", "One of 'text', 'yaml' or 'json'.": "", diff --git a/translations/es.json b/translations/es.json index 1c3db32d9b2a..d665eb1d508d 100644 --- a/translations/es.json +++ b/translations/es.json @@ -103,6 +103,7 @@ "Connect to LoadBalancer services": "Conectar a los servicios LoadBalancer", "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "Considera crear un cluster con más memoria usando `minikube start --memory CANT_MB`", "Consider increasing Docker Desktop's memory size.": "Considera incrementar la memoria asignada a Docker Desktop", + "Container runtime must be set to \\\"containerd\\\" for rootless": "", "Continuously listing/getting the status with optional interval duration.": "", "Control Plane could not update, try minikube delete --all --purge": "", "Copy the specified file into minikube": "", @@ -413,7 +414,7 @@ "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "", "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "", "Number of CPUs allocated to the minikube VM": "Número de CPU asignadas a la VM de minikube", - "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit and kvm2 drivers)": "", "Number of lines back to go within the log": "", "OS release is {{.pretty_name}}": "", "One of 'text', 'yaml' or 'json'.": "", diff --git a/translations/fr.json b/translations/fr.json index 66c63006250a..662c52458efe 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -105,6 +105,7 @@ "Connect to LoadBalancer services": "Se connecter aux services LoadBalancer", "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "Envisagez de créer un cluster avec une plus grande taille de mémoire en utilisant `minikube start --memory SIZE_MB`", "Consider increasing Docker Desktop's memory size.": "Envisagez d'augmenter la taille de la mémoire de Docker Desktop.", + "Container runtime must be set to \\\"containerd\\\" for rootless": "", "Continuously listing/getting the status with optional interval duration.": "Répertorier/obtenir le statut en continu avec une durée d'intervalle facultative.", "Control Plane could not update, try minikube delete --all --purge": "Le plan de contrôle n'a pas pu mettre à jour, essayez minikube delete --all --purge", "Copy the specified file into minikube": "Copiez le fichier spécifié dans minikube", @@ -413,6 +414,7 @@ "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "Vous avez remarqué que vous avez un docker-env activé sur le pilote {{.driver_name}} dans ce terminal :", "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "Vous avez remarqué que vous avez un pilote podman-env activé sur {{.driver_name}} dans ce terminal :", "Number of CPUs allocated to the minikube VM": "Nombre de processeurs alloués à la VM minikube.", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit and kvm2 drivers)": "", "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "Nombre de disques supplémentaires créés et attachés à la machine virtuelle minikube (actuellement implémenté uniquement pour le pilote hyperkit)", "Number of lines back to go within the log": "Nombre de lignes à remonter dans le journal", "OS release is {{.pretty_name}}": "La version du système d'exploitation est {{.pretty_name}}", diff --git a/translations/ja.json b/translations/ja.json index 3c8d2d6dcb3b..a13338788ee5 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -102,6 +102,7 @@ "Connect to LoadBalancer services": "LoadBalancer サービスに接続します", "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "", "Consider increasing Docker Desktop's memory size.": "", + "Container runtime must be set to \\\"containerd\\\" for rootless": "", "Continuously listing/getting the status with optional interval duration.": "", "Control Plane could not update, try minikube delete --all --purge": "", "Copy the specified file into minikube": "", @@ -403,7 +404,7 @@ "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "", "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "", "Number of CPUs allocated to the minikube VM": "minikube VM に割り当てられた CPU の数", - "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit and kvm2 drivers)": "", "Number of lines back to go within the log": "", "OS release is {{.pretty_name}}": "OS は {{.pretty_name}} です。", "One of 'text', 'yaml' or 'json'.": "", diff --git a/translations/ko.json b/translations/ko.json index 7193f1085af9..c4311d27f367 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -109,6 +109,7 @@ "Connect to LoadBalancer services": "", "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "", "Consider increasing Docker Desktop's memory size.": "", + "Container runtime must be set to \\\"containerd\\\" for rootless": "", "Continuously listing/getting the status with optional interval duration.": "", "Control Plane could not update, try minikube delete --all --purge": "", "Copy the specified file into minikube": "", @@ -428,7 +429,7 @@ "None of the known repositories in your location are accessible. Using {{.image_repository_name}} as fallback.": "", "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "", "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "", - "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit and kvm2 drivers)": "", "Number of lines back to go within the log": "", "OS release is {{.pretty_name}}": "", "One of 'text', 'yaml' or 'json'.": "", diff --git a/translations/pl.json b/translations/pl.json index a5d9f3016717..4c8bc37aca27 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -106,6 +106,7 @@ "Connect to LoadBalancer services": "Połącz się do serwisów LoadBalancer'a", "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "", "Consider increasing Docker Desktop's memory size.": "Rozważ przydzielenie większej ilości pamięci RAM dla programu Docker Desktop", + "Container runtime must be set to \\\"containerd\\\" for rootless": "", "Continuously listing/getting the status with optional interval duration.": "", "Control Plane could not update, try minikube delete --all --purge": "", "Copy the specified file into minikube": "Skopiuj dany plik do minikube", @@ -420,7 +421,7 @@ "Number of CPUs allocated to Kubernetes.": "Liczba procesorów przypisana do Kubernetesa", "Number of CPUs allocated to the minikube VM": "Liczba procesorów przypisana do maszyny wirtualnej minikube", "Number of CPUs allocated to the minikube VM.": "Liczba procesorów przypisana do maszyny wirtualnej minikube", - "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit and kvm2 drivers)": "", "Number of lines back to go within the log": "", "OS release is {{.pretty_name}}": "Wersja systemu operacyjnego to {{.pretty_name}}", "One of 'text', 'yaml' or 'json'.": "", diff --git a/translations/strings.txt b/translations/strings.txt index e2759bcd63eb..afa97d7a1bce 100644 --- a/translations/strings.txt +++ b/translations/strings.txt @@ -98,6 +98,7 @@ "Connect to LoadBalancer services": "", "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "", "Consider increasing Docker Desktop's memory size.": "", + "Container runtime must be set to \\\"containerd\\\" for rootless": "", "Continuously listing/getting the status with optional interval duration.": "", "Control Plane could not update, try minikube delete --all --purge": "", "Copy the specified file into minikube": "", @@ -382,7 +383,7 @@ "None of the known repositories in your location are accessible. Using {{.image_repository_name}} as fallback.": "", "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "", "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "", - "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit and kvm2 drivers)": "", "Number of lines back to go within the log": "", "OS release is {{.pretty_name}}": "", "One of 'text', 'yaml' or 'json'.": "", diff --git a/translations/zh-CN.json b/translations/zh-CN.json index 7fbfaf21e285..0700b140eb13 100644 --- a/translations/zh-CN.json +++ b/translations/zh-CN.json @@ -125,6 +125,7 @@ "Connect to LoadBalancer services": "连接到 LoadBalancer 服务", "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "", "Consider increasing Docker Desktop's memory size.": "", + "Container runtime must be set to \\\"containerd\\\" for rootless": "", "Continuously listing/getting the status with optional interval duration.": "", "Control Plane could not update, try minikube delete --all --purge": "", "Copy the specified file into minikube": "", @@ -493,7 +494,7 @@ "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "", "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "", "Number of CPUs allocated to the minikube VM": "分配给 minikube 虚拟机的 CPU 的数量", - "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit and kvm2 drivers)": "", "Number of lines back to go within the log": "", "OS release is {{.pretty_name}}": "", "One of 'text', 'yaml' or 'json'.": "", From 4da06f5180bf7d8a0a7e0bb66ff7327fdb4602f3 Mon Sep 17 00:00:00 2001 From: Medya Gh Date: Mon, 30 Aug 2021 16:54:21 -0700 Subject: [PATCH 032/201] go mod tidy --- go.mod | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/go.mod b/go.mod index 6c607f9afbcd..50f599c3bfc8 100644 --- a/go.mod +++ b/go.mod @@ -98,6 +98,115 @@ require ( sigs.k8s.io/sig-storage-lib-external-provisioner/v6 v6.3.0 ) +require ( + cloud.google.com/go v0.88.0 // indirect + github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect + github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd // indirect + github.com/Microsoft/go-winio v0.5.0 // indirect + github.com/StackExchange/wmi v1.2.1 // indirect + github.com/VividCortex/ewma v1.1.1 // indirect + github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af // indirect + github.com/aws/aws-sdk-go v1.35.24 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect + github.com/census-instrumentation/opencensus-proto v0.2.1 // indirect + github.com/cespare/xxhash/v2 v2.1.1 // indirect + github.com/containerd/cgroups v1.0.1 // indirect + github.com/containerd/containerd v1.5.2 // indirect + github.com/containerd/stargz-snapshotter/estargz v0.7.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/docker/cli v20.10.7+incompatible // indirect + github.com/docker/distribution v2.7.1+incompatible // indirect + github.com/docker/docker-credential-helpers v0.6.3 // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/evanphx/json-patch v4.9.0+incompatible // indirect + github.com/fatih/color v1.10.0 // indirect + github.com/fogleman/gg v1.3.0 // indirect + github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/go-fonts/liberation v0.1.1 // indirect + github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07 // indirect + github.com/go-logr/logr v0.4.0 // indirect + github.com/go-ole/go-ole v1.2.5 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/snappy v0.0.3 // indirect + github.com/google/go-querystring v1.0.0 // indirect + github.com/google/gofuzz v1.1.0 // indirect + github.com/googleapis/gax-go/v2 v2.0.5 // indirect + github.com/googleapis/gnostic v0.4.1 // indirect + github.com/gookit/color v1.4.2 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-safetemp v1.0.0 // indirect + github.com/hashicorp/go-version v1.2.1 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/imdario/mergo v0.3.11 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/json-iterator/go v1.1.11 // indirect + github.com/jstemmer/go-junit-report v0.9.1 // indirect + github.com/klauspost/compress v1.13.0 // indirect + github.com/magiconair/properties v1.8.5 // indirect + github.com/mattn/go-colorable v0.1.8 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/miekg/dns v1.1.35 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-testing-interface v1.0.0 // indirect + github.com/mitchellh/go-wordwrap v1.0.0 // indirect + github.com/mitchellh/mapstructure v1.4.1 // indirect + github.com/moby/spdystream v0.2.0 // indirect + github.com/moby/sys/mountinfo v0.4.1 // indirect + github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.1 // indirect + github.com/opencontainers/image-spec v1.0.1 // indirect + github.com/opencontainers/runc v1.0.0-rc95 // indirect + github.com/pelletier/go-toml v1.9.3 // indirect + github.com/phpdave11/gofpdf v1.4.2 // indirect + github.com/prometheus/client_golang v1.7.1 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.10.0 // indirect + github.com/prometheus/procfs v0.6.0 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + github.com/spf13/afero v1.6.0 // indirect + github.com/spf13/cast v1.3.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/subosito/gotenv v1.2.0 // indirect + github.com/tklauser/go-sysconf v0.3.7 // indirect + github.com/tklauser/numcpus v0.2.3 // indirect + github.com/ulikunitz/xz v0.5.8 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect + go.opentelemetry.io/otel/metric v0.17.0 // indirect + go.uber.org/atomic v1.7.0 // indirect + go.uber.org/multierr v1.6.0 // indirect + go.uber.org/zap v1.17.0 // indirect + golang.org/x/image v0.0.0-20210216034530-4410531fe030 // indirect + golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect + golang.org/x/net v0.0.0-20210525063256-abc453219eb5 // indirect + golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect + golang.org/x/tools v0.1.5 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20210722135532-667f2b7c528f // indirect + google.golang.org/grpc v1.39.0 // indirect + google.golang.org/protobuf v1.27.1 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.62.0 // indirect + k8s.io/cluster-bootstrap v0.0.0 // indirect + k8s.io/component-base v0.21.2 // indirect + k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 // indirect + k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect + sigs.k8s.io/yaml v1.2.0 // indirect +) + replace ( git.apache.org/thrift.git => github.com/apache/thrift v0.0.0-20180902110319-2566ecd5d999 github.com/briandowns/spinner => github.com/alonyb/spinner v1.12.7 From 7317746d57a1a680384b7a440bf6530da47bb453 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Tue, 31 Aug 2021 12:21:09 -0700 Subject: [PATCH 033/201] check for special error everywhere --- pkg/addons/addons.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/addons/addons.go b/pkg/addons/addons.go index b627487b8342..5580cf198a8f 100644 --- a/pkg/addons/addons.go +++ b/pkg/addons/addons.go @@ -449,7 +449,7 @@ func Start(wg *sync.WaitGroup, cc *config.ClusterConfig, toEnable map[string]boo awg.Add(1) go func(name string) { err := RunCallbacks(cc, name, "true") - if err != nil { + if err != nil && !errors.Is(err, ErrSkipThisAddon) { out.WarningT("Enabling '{{.name}}' returned an error: {{.error}}", out.V{"name": name, "error": err}) } else { enabledAddons = append(enabledAddons, name) From 60d9d41ba2f5ef06db0339623f1ec6d1c010def0 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Tue, 31 Aug 2021 15:02:13 -0700 Subject: [PATCH 034/201] omg horrible typo --- pkg/addons/addons_gcpauth.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/pkg/addons/addons_gcpauth.go b/pkg/addons/addons_gcpauth.go index 122a7e4cdcae..e324e78dfc7f 100644 --- a/pkg/addons/addons_gcpauth.go +++ b/pkg/addons/addons_gcpauth.go @@ -93,7 +93,7 @@ func enableAddonGCPAuth(cfg *config.ClusterConfig) error { } // If the env var is explicitly set, even in GCE, then defer to the user and continue - if !Force && detect.IsOnGCE() && os.Getenv("GOOGLE_APPLICATION_CREDENTUALS") == "" { + if !Force && detect.IsOnGCE() && os.Getenv("GOOGLE_APPLICATION_CREDENTIALS") == "" { out.WarningT("It seems that you are running in GCE, which means authentication should work without the GCP Auth addon. If you would still like to authenticate using a credentials file, use the --force flag.") return nil } @@ -138,19 +138,19 @@ func createPullSecret(cc *config.ClusterConfig, creds *google.Credentials) error return errors.New("no credentials, skipping creating pull secret") } - client, err := service.K8s.GetCoreClient(cc.Name) - if err != nil { - return err - } - - namespaces, err := client.Namespaces().List(context.TODO(), metav1.ListOptions{}) - if err != nil { - return err - } - token, err := creds.TokenSource.Token() // Only try to add secret if Token was found if err == nil { + client, err := service.K8s.GetCoreClient(cc.Name) + if err != nil { + return err + } + + namespaces, err := client.Namespaces().List(context.TODO(), metav1.ListOptions{}) + if err != nil { + return err + } + dockercfg := "" registries := append(gcr_config.DefaultGCRRegistries[:], gcr_config.DefaultARRegistries[:]...) for _, reg := range registries { @@ -341,7 +341,7 @@ func verifyGCPAuthAddon(cc *config.ClusterConfig, name string, val string) error // If we're in GCE and didn't actually start the gcp-auth pods, don't check for them. // We also don't want to actually set the addon as enabled, so just exit completely. - if enable && !Force && detect.IsOnGCE() && os.Getenv("GOOGLE_APPLICATION_CREDENTUALS") == "" { + if enable && !Force && detect.IsOnGCE() && os.Getenv("GOOGLE_APPLICATION_CREDENTIALS") == "" { return ErrSkipThisAddon } From f0e4aff533e570a431b3f72a8e0d15f65f4f0f81 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Tue, 31 Aug 2021 16:04:47 -0700 Subject: [PATCH 035/201] fix addons test for cloud shell --- test/integration/addons_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/addons_test.go b/test/integration/addons_test.go index fb5bc80aec36..776df76408b8 100644 --- a/test/integration/addons_test.go +++ b/test/integration/addons_test.go @@ -89,7 +89,7 @@ func TestAddons(t *testing.T) { if err != nil { t.Errorf("%s failed: %v", rr.Command(), err) } else { - if !strings.Contains(rr.Output(), "It seems that you are running in GCE") { + if !detect.IsCloudShell() && !strings.Contains(rr.Output(), "It seems that you are running in GCE") { t.Errorf("Unexpected error message: %v", rr.Output()) } else { // ok, use force here since we are in GCE From 71c909a5412f57a7bc52502913efa521e1b282d1 Mon Sep 17 00:00:00 2001 From: Brian Li Date: Tue, 29 Jun 2021 00:23:17 +0800 Subject: [PATCH 036/201] fix addon image for aliyun registry --- pkg/minikube/assets/addons.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/pkg/minikube/assets/addons.go b/pkg/minikube/assets/addons.go index 8f1ae2f64553..85e782a4c34b 100755 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -721,7 +721,7 @@ func overrideDefaults(defaultMap, overrideMap map[string]string) map[string]stri // SelectAndPersistImages selects which images to use based on addon default images, previously persisted images, and newly requested images - which are then persisted for future enables. func SelectAndPersistImages(addon *Addon, cc *config.ClusterConfig) (images, customRegistries map[string]string, err error) { - addonDefaultImages := addon.Images + addonDefaultImages := fixAddonImages(cc.KubernetesConfig.ImageRepository, addon.Images) if addonDefaultImages == nil { addonDefaultImages = make(map[string]string) } @@ -776,6 +776,23 @@ func SelectAndPersistImages(addon *Addon, cc *config.ClusterConfig) (images, cus return images, customRegistries, err } +// fixes addon image names according to image repository used +func fixAddonImages(repo string, images map[string]string) map[string]string { + if repo == "registry.cn-hangzhou.aliyuncs.com/google_containers" { + // for aliyun registry must strip namespace from image name, e.g. + // registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5 will not work + // registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v5 does work + newImages := make(map[string]string) + for name, image := range images { + image = strings.TrimPrefix(image, "k8s-minikube/") + image = strings.TrimPrefix(image, "kubernetesui/") + newImages[name] = image + } + return newImages + } + return images +} + // GenerateTemplateData generates template data for template assets func GenerateTemplateData(addon *Addon, cfg config.KubernetesConfig, netInfo NetworkInfo, images, customRegistries map[string]string) interface{} { From 8b8c96bb6694ed8c9c83cb3989d296f1f89fe969 Mon Sep 17 00:00:00 2001 From: Brian Li Date: Sat, 7 Aug 2021 18:12:58 +0800 Subject: [PATCH 037/201] fix minikube images for aliyun registry --- pkg/minikube/image/image.go | 26 +++++++++++++++++++++++++- pkg/minikube/node/cache.go | 14 +++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/pkg/minikube/image/image.go b/pkg/minikube/image/image.go index 2bbcf919cbf3..e376530d1029 100644 --- a/pkg/minikube/image/image.go +++ b/pkg/minikube/image/image.go @@ -155,11 +155,15 @@ func retrieveImage(ref name.Reference, imgName string) (v1.Image, string, error) } } if useRemote { + ref, canonicalName, err := fixRemoteImageName(ref, imgName) + if err != nil { + return nil, "", err + } img, err = retrieveRemote(ref, defaultPlatform) if err == nil { img, err = fixPlatform(ref, img, defaultPlatform) if err == nil { - return img, canonicalName(ref), nil + return img, canonicalName, nil } } } @@ -317,3 +321,23 @@ func normalizeTagName(image string) string { } return base + ":" + tag } + +func fixRemoteImageName(ref name.Reference, imgName string) (name.Reference, string, error) { + const aliyunMirror = "registry.cn-hangzhou.aliyuncs.com/google_containers/" + if strings.HasPrefix(imgName, aliyunMirror) { + // for aliyun registry must strip namespace from image name, e.g. + // registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.0 will not work + // registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.0 does work + image := strings.TrimPrefix(imgName, aliyunMirror) + image = strings.TrimPrefix(image, "k8s-minikube/") + image = strings.TrimPrefix(image, "kubernetesui/") + image = strings.TrimPrefix(image, "coredns/") + image = strings.ReplaceAll(image, "coredns:v", "coredns:") + remoteRef, err := name.ParseReference(aliyunMirror+image, name.WeakValidation) + if err != nil { + return nil, "", err + } + return remoteRef, canonicalName(ref), nil + } + return ref, canonicalName(ref), nil +} diff --git a/pkg/minikube/node/cache.go b/pkg/minikube/node/cache.go index f68df47142a0..42a965412224 100644 --- a/pkg/minikube/node/cache.go +++ b/pkg/minikube/node/cache.go @@ -19,6 +19,7 @@ package node import ( "fmt" "os" + "path" "runtime" "strings" @@ -120,7 +121,7 @@ func beginDownloadKicBaseImage(g *errgroup.Group, cc *config.ClusterConfig, down g.Go(func() error { baseImg := cc.KicBaseImage if baseImg == kic.BaseImage && len(cc.KubernetesConfig.ImageRepository) != 0 { - baseImg = strings.Replace(baseImg, "gcr.io", cc.KubernetesConfig.ImageRepository, 1) + baseImg = updateKicImageRepo(baseImg, cc.KubernetesConfig.ImageRepository) cc.KicBaseImage = baseImg } var finalImg string @@ -255,3 +256,14 @@ func imagesInConfigFile() ([]string, error) { } return []string{}, nil } + +func updateKicImageRepo(imgName string, repo string) string { + image := strings.TrimPrefix(imgName, "gcr.io/") + if repo == "registry.cn-hangzhou.aliyuncs.com/google_containers" { + // for aliyun registry must strip namespace from image name, e.g. + // registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/kicbase:v0.0.25 will not work + // registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.25 does work + image = strings.TrimPrefix(image, "k8s-minikube/") + } + return path.Join(repo, image) +} From 3e83449bf09c49fda39fdd7b2237d4b21507511b Mon Sep 17 00:00:00 2001 From: Joel Klint Date: Thu, 2 Sep 2021 16:40:10 +0200 Subject: [PATCH 038/201] Added windows instructions for adding a dns-server Added missing instructions for Windows, regarding adding minikube ip as a dns server --- site/content/en/docs/handbook/addons/ingress-dns.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/site/content/en/docs/handbook/addons/ingress-dns.md b/site/content/en/docs/handbook/addons/ingress-dns.md index 5c59e10eda9d..1b10204dfacf 100644 --- a/site/content/en/docs/handbook/addons/ingress-dns.md +++ b/site/content/en/docs/handbook/addons/ingress-dns.md @@ -101,8 +101,15 @@ systemctl restart NetworkManager.service Also see `dns=` in [NetworkManager.conf](https://developer.gnome.org/NetworkManager/stable/NetworkManager.conf.html). #### Windows +Open `Powershell` as Administrator and execute the following +```sh +Add-DnsClientNrptRule -Namespace ".test" -NameServers "$(minikube ip)" +``` -TODO +The following will remove any matching rules, before creating one. This is helpful if your minikube has a new ip +```sh +Get-DnsClientNrptRule | Where-Object {$_.Namespace -eq '.test'} | Remove-DnsClientNrptRule -Force; Add-DnsClientNrptRule -Namespace ".test" -NameServers "$(minikube ip)" +``` ## Testing From 2c6445146afb212c3449b0c44c6286da43f87aa3 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Thu, 2 Sep 2021 10:14:19 -0700 Subject: [PATCH 039/201] update issue template to ask user to attach log file to issue --- .github/ISSUE_TEMPLATE/__en-US.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/__en-US.md b/.github/ISSUE_TEMPLATE/__en-US.md index c930965aa515..310bd6fae42a 100644 --- a/.github/ISSUE_TEMPLATE/__en-US.md +++ b/.github/ISSUE_TEMPLATE/__en-US.md @@ -9,14 +9,10 @@ about: Report an issue 2. 3. -**Full output of `minikube logs` command:** -
- - -
+**Run `minikube logs --file=logs.txt` and attach the log file to this issue:** -**Full output of failed command:** +**Full output of failed command if not `minikube start`:**
From c9862b071f90c7cf6d3cef4d3f72c474194a183b Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Thu, 2 Sep 2021 10:44:22 -0700 Subject: [PATCH 040/201] re-word attach to be more descriptive --- .github/ISSUE_TEMPLATE/__en-US.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/__en-US.md b/.github/ISSUE_TEMPLATE/__en-US.md index 310bd6fae42a..f5f0b81e62f2 100644 --- a/.github/ISSUE_TEMPLATE/__en-US.md +++ b/.github/ISSUE_TEMPLATE/__en-US.md @@ -9,7 +9,7 @@ about: Report an issue 2. 3. -**Run `minikube logs --file=logs.txt` and attach the log file to this issue:** +**Run `minikube logs --file=logs.txt` and drag and drop the log file into this issue** **Full output of failed command if not `minikube start`:** From f11d14de59b9f83a032c6268e03bd380745e4949 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 2 Sep 2021 11:22:53 -0700 Subject: [PATCH 041/201] make sure to install the same version of golang across scripts --- hack/jenkins/build/minikube_build_upload_latest.sh | 3 +-- hack/jenkins/common.sh | 2 +- hack/jenkins/installers/check_install_golang.sh | 10 +++++----- hack/jenkins/kicbase_auto_build.sh | 3 +++ hack/jenkins/minikube_cross_build_and_upload.sh | 3 +-- hack/jenkins/prbot.sh | 2 +- hack/jenkins/preload_generation.sh | 3 +-- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/hack/jenkins/build/minikube_build_upload_latest.sh b/hack/jenkins/build/minikube_build_upload_latest.sh index b6b50cc86ce7..91ec72589bac 100755 --- a/hack/jenkins/build/minikube_build_upload_latest.sh +++ b/hack/jenkins/build/minikube_build_upload_latest.sh @@ -22,8 +22,7 @@ set -eux -o pipefail readonly bucket="minikube/latest" # Make sure the right golang version is installed based on Makefile -WANT_GOLANG_VERSION=$(grep '^GO_VERSION' Makefile | awk '{ print $3 }') -./hack/jenkins/installers/check_install_golang.sh $WANT_GOLANG_VERSION /usr/local +./hack/jenkins/installers/check_install_golang.sh /usr/local declare -rx GOPATH=/var/lib/jenkins/go diff --git a/hack/jenkins/common.sh b/hack/jenkins/common.sh index d1e1d9929cc8..600e51ece06d 100755 --- a/hack/jenkins/common.sh +++ b/hack/jenkins/common.sh @@ -91,7 +91,7 @@ else fi # installing golang so we could do go get for gopogh -./installers/check_install_golang.sh "1.17" "/usr/local" || true +./installers/check_install_golang.sh "/usr/local" || true # install docker and kubectl if not present sudo ARCH="$ARCH" ./installers/check_install_docker.sh || true diff --git a/hack/jenkins/installers/check_install_golang.sh b/hack/jenkins/installers/check_install_golang.sh index 4ee97d5b1c24..9fde9e9e75a3 100755 --- a/hack/jenkins/installers/check_install_golang.sh +++ b/hack/jenkins/installers/check_install_golang.sh @@ -16,14 +16,14 @@ set -eux -o pipefail -if (($# < 2)); then - echo "ERROR: given ! ($#) number of parameters but expect 2." - echo "USAGE: ./check_install_golang.sh VERSION_TO_INSTALL INSTALL_PATH" +if (($# < 1)); then + echo "ERROR: given ! ($#) parameters but expected 1." + echo "USAGE: ./check_install_golang.sh INSTALL_PATH" exit 1 fi -VERSION_TO_INSTALL=${1} -INSTALL_PATH=${2} +VERSION_TO_INSTALL=$(grep '^GO_VERSION' Makefile | awk '{ print $3 }') +INSTALL_PATH=${1} function current_arch() { case $(arch) in diff --git a/hack/jenkins/kicbase_auto_build.sh b/hack/jenkins/kicbase_auto_build.sh index 4a05018dfc35..02b6e215cd9a 100755 --- a/hack/jenkins/kicbase_auto_build.sh +++ b/hack/jenkins/kicbase_auto_build.sh @@ -24,6 +24,9 @@ docker login -u ${DOCKERHUB_USER} -p ${DOCKERHUB_PASS} # Make sure gh is installed and configured ./hack/jenkins/installers/check_install_gh.sh +# Make sure golang is installed and configured +./installers/check_install_golang.sh "/usr/local" || true + # Let's make sure we have the newest kicbase reference curl -L https://github.com/kubernetes/minikube/raw/master/pkg/drivers/kic/types.go --output types-head.go # kicbase tags are of the form VERSION-TIMESTAMP-PR, so this grep finds that TIMESTAMP in the middle diff --git a/hack/jenkins/minikube_cross_build_and_upload.sh b/hack/jenkins/minikube_cross_build_and_upload.sh index 94750f69968b..81381734a1e5 100755 --- a/hack/jenkins/minikube_cross_build_and_upload.sh +++ b/hack/jenkins/minikube_cross_build_and_upload.sh @@ -26,8 +26,7 @@ set -eux -o pipefail readonly bucket="minikube-builds" # Make sure the right golang version is installed based on Makefile -WANT_GOLANG_VERSION=$(grep '^GO_VERSION' Makefile | awk '{ print $3 }') -./hack/jenkins/installers/check_install_golang.sh $WANT_GOLANG_VERSION /usr/local +./hack/jenkins/installers/check_install_golang.sh /usr/local declare -rx BUILD_IN_DOCKER=y diff --git a/hack/jenkins/prbot.sh b/hack/jenkins/prbot.sh index 0f68772e9b81..b88b9878ebdf 100644 --- a/hack/jenkins/prbot.sh +++ b/hack/jenkins/prbot.sh @@ -27,7 +27,7 @@ fi ./installers/check_install_gh.sh # Make sure go is installed and configured -./installers/check_install_golang.sh "1.16" "/usr/local" || true +./installers/check_install_golang.sh "/usr/local" || true # Grab latest code git clone https://github.com/kubernetes/minikube.git diff --git a/hack/jenkins/preload_generation.sh b/hack/jenkins/preload_generation.sh index 66e2ba112543..b019d6f6e12a 100644 --- a/hack/jenkins/preload_generation.sh +++ b/hack/jenkins/preload_generation.sh @@ -21,8 +21,7 @@ set -eux -o pipefail # Make sure the right golang version is installed based on Makefile -WANT_GOLANG_VERSION=$(grep '^GO_VERSION' Makefile | awk '{ print $3 }') -./hack/jenkins/installers/check_install_golang.sh $WANT_GOLANG_VERSION /usr/local +./hack/jenkins/installers/check_install_golang.sh /usr/local make upload-preloaded-images-tar make clean From 9597ac2f89359e0376c6d75ae3fef052c9155186 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Thu, 2 Sep 2021 18:39:41 +0000 Subject: [PATCH 042/201] Update ISO to v1.23.0 --- Makefile | 2 +- pkg/minikube/download/iso.go | 2 +- site/content/en/docs/commands/start.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 53df20ee2978..acd60490cb10 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ KUBERNETES_VERSION ?= $(shell egrep "DefaultKubernetesVersion =" pkg/minikube/co KIC_VERSION ?= $(shell egrep "Version =" pkg/drivers/kic/types.go | cut -d \" -f2) # Default to .0 for higher cache hit rates, as build increments typically don't require new ISO versions -ISO_VERSION ?= v1.22.0-1628974786-12268 +ISO_VERSION ?= v1.23.0 # Dashes are valid in semver, but not Linux packaging. Use ~ to delimit alpha/beta DEB_VERSION ?= $(subst -,~,$(RAW_VERSION)) DEB_REVISION ?= 0 diff --git a/pkg/minikube/download/iso.go b/pkg/minikube/download/iso.go index ca6f42fc4c13..08f4042ba102 100644 --- a/pkg/minikube/download/iso.go +++ b/pkg/minikube/download/iso.go @@ -40,7 +40,7 @@ const fileScheme = "file" // DefaultISOURLs returns a list of ISO URL's to consult by default, in priority order func DefaultISOURLs() []string { v := version.GetISOVersion() - isoBucket := "minikube-builds/iso/12268" + isoBucket := "minikube/iso" return []string{ fmt.Sprintf("https://storage.googleapis.com/%s/minikube-%s.iso", isoBucket, v), fmt.Sprintf("https://github.com/kubernetes/minikube/releases/download/%s/minikube-%s.iso", v, v), diff --git a/site/content/en/docs/commands/start.md b/site/content/en/docs/commands/start.md index fc36a9781120..e35c4367bb46 100644 --- a/site/content/en/docs/commands/start.md +++ b/site/content/en/docs/commands/start.md @@ -65,7 +65,7 @@ minikube start [flags] --insecure-registry strings Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added. --install-addons If set, install addons. Defaults to true. (default true) --interactive Allow user prompts for more information (default true) - --iso-url strings Locations to fetch the minikube ISO from. (default [https://storage.googleapis.com/minikube-builds/iso/12268/minikube-v1.22.0-1628974786-12268.iso,https://github.com/kubernetes/minikube/releases/download/v1.22.0-1628974786-12268/minikube-v1.22.0-1628974786-12268.iso,https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.22.0-1628974786-12268.iso]) + --iso-url strings Locations to fetch the minikube ISO from. (default [https://storage.googleapis.com/minikube/iso/minikube-v1.23.0.iso,https://github.com/kubernetes/minikube/releases/download/v1.23.0/minikube-v1.23.0.iso,https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.23.0.iso]) --keep-context This will keep the existing kubectl context and will create a minikube context. --kubernetes-version string The Kubernetes version that the minikube VM will use (ex: v1.2.3, 'stable' for v1.22.1, 'latest' for v1.22.2-rc.0). Defaults to 'stable'. --kvm-gpu Enable experimental NVIDIA GPU support in minikube From 9d939663a6006569f32f8786721557c36fa370d8 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 2 Sep 2021 11:47:27 -0700 Subject: [PATCH 043/201] correct path to script --- hack/jenkins/kicbase_auto_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/jenkins/kicbase_auto_build.sh b/hack/jenkins/kicbase_auto_build.sh index 02b6e215cd9a..57536132a109 100755 --- a/hack/jenkins/kicbase_auto_build.sh +++ b/hack/jenkins/kicbase_auto_build.sh @@ -25,7 +25,7 @@ docker login -u ${DOCKERHUB_USER} -p ${DOCKERHUB_PASS} ./hack/jenkins/installers/check_install_gh.sh # Make sure golang is installed and configured -./installers/check_install_golang.sh "/usr/local" || true +./hack/jenkins/installers/check_install_golang.sh "/usr/local" || true # Let's make sure we have the newest kicbase reference curl -L https://github.com/kubernetes/minikube/raw/master/pkg/drivers/kic/types.go --output types-head.go From 0b9e97648b6b21647457e2deab88db1e31418043 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 2 Sep 2021 11:58:39 -0700 Subject: [PATCH 044/201] fix go version check --- hack/jenkins/installers/check_install_golang.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/jenkins/installers/check_install_golang.sh b/hack/jenkins/installers/check_install_golang.sh index 9fde9e9e75a3..4d8bf87228de 100755 --- a/hack/jenkins/installers/check_install_golang.sh +++ b/hack/jenkins/installers/check_install_golang.sh @@ -51,7 +51,7 @@ function check_and_install_golang() { fi # golang has been installed and check its version - if [[ $(go version) =~ (([0-9]+)\.([0-9]+).([0-9]+).([\.0-9]*)) ]]; then + if [[ $(go version | cut -d' ' -f 3) =~ go(([0-9]+)\.([0-9]+).([0-9]+).([\.0-9]*)) ]]; then HOST_VERSION=${BASH_REMATCH[1]} if [ $HOST_VERSION = $VERSION_TO_INSTALL ]; then echo "go version on the host looks good : $HOST_VERSION" From ff023382c45b708262133c09149bd228e6277541 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 2 Sep 2021 12:33:36 -0700 Subject: [PATCH 045/201] fix regex --- hack/jenkins/installers/check_install_golang.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/jenkins/installers/check_install_golang.sh b/hack/jenkins/installers/check_install_golang.sh index 4d8bf87228de..e47055364b59 100755 --- a/hack/jenkins/installers/check_install_golang.sh +++ b/hack/jenkins/installers/check_install_golang.sh @@ -51,7 +51,7 @@ function check_and_install_golang() { fi # golang has been installed and check its version - if [[ $(go version | cut -d' ' -f 3) =~ go(([0-9]+)\.([0-9]+).([0-9]+).([\.0-9]*)) ]]; then + if [[ $(go version | cut -d' ' -f 3) =~ go(([0-9]+)\.([0-9]+).([0-9]+)*) ]]; then HOST_VERSION=${BASH_REMATCH[1]} if [ $HOST_VERSION = $VERSION_TO_INSTALL ]; then echo "go version on the host looks good : $HOST_VERSION" From c7a41c70bd02ec01d9febf523156a055cd6799a7 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 2 Sep 2021 13:38:50 -0700 Subject: [PATCH 046/201] remove common.sh from update golang check --- hack/update/golang_version/update_golang_version.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/hack/update/golang_version/update_golang_version.go b/hack/update/golang_version/update_golang_version.go index 245c801db157..d60ecf2f2522 100644 --- a/hack/update/golang_version/update_golang_version.go +++ b/hack/update/golang_version/update_golang_version.go @@ -111,11 +111,6 @@ var ( `(?m)^go .*`: `go {{.StableVersionMM}}`, }, }, - "hack/jenkins/common.sh": { - Replace: map[string]string{ - `\.\/installers\/check_install_golang\.sh \".*\" \"\/usr\/local\" .*`: `./installers/check_install_golang.sh "{{.StableVersion}}" "/usr/local" || true`, - }, - }, "Makefile": { Replace: map[string]string{ // searching for 1.* so it does NOT match "KVM_GO_VERSION ?= $(GO_VERSION:.0=)" in the Makefile From 78febe240de896b6ab928be185e51a68c21d9162 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Thu, 2 Sep 2021 15:09:09 -0700 Subject: [PATCH 047/201] change GitHub issue output to upload `minikube logs` file --- pkg/minikube/out/out.go | 34 ++++++++------ pkg/minikube/out/out_test.go | 86 ++++++++++++++++++++++++++++++------ 2 files changed, 94 insertions(+), 26 deletions(-) diff --git a/pkg/minikube/out/out.go b/pkg/minikube/out/out.go index 4706f9a7063a..01dd5318de26 100644 --- a/pkg/minikube/out/out.go +++ b/pkg/minikube/out/out.go @@ -33,9 +33,9 @@ import ( "github.com/Delta456/box-cli-maker/v2" "github.com/briandowns/spinner" "github.com/mattn/go-isatty" + "github.com/spf13/pflag" "k8s.io/klog/v2" - "k8s.io/minikube/pkg/minikube/localpath" "k8s.io/minikube/pkg/minikube/out/register" "k8s.io/minikube/pkg/minikube/style" "k8s.io/minikube/pkg/minikube/translate" @@ -381,14 +381,6 @@ func displayError(msg string, err error) { } func latestLogFilePath() (string, error) { - if len(os.Args) < 2 { - return "", fmt.Errorf("unable to detect command") - } - cmd := os.Args[1] - if cmd == "start" { - return localpath.LastStartLog(), nil - } - tmpdir := os.TempDir() files, err := ioutil.ReadDir(tmpdir) if err != nil { @@ -411,16 +403,32 @@ func latestLogFilePath() (string, error) { return fullPath, nil } +func command() (string, error) { + if len(pflag.Args()) < 1 { + return "", fmt.Errorf("unable to detect command") + } + + return pflag.Arg(0), nil +} + func displayGitHubIssueMessage() { - logPath, err := latestLogFilePath() + cmd, err := command() if err != nil { - klog.Warningf("failed to diplay GitHub issue message: %v", err) + klog.Warningf("failed to get command: %v", err) } msg := Sprintf(style.Sad, "If the above advice does not help, please let us know:") msg += Sprintf(style.URL, "https://github.com/kubernetes/minikube/issues/new/choose\n") - msg += Sprintf(style.Empty, "Please attach the following file to the GitHub issue:") - msg += Sprintf(style.Empty, "- {{.logPath}}", V{"logPath": logPath}) + msg += Sprintf(style.Empty, "Please run `minikube logs --file=logs.txt` and attach logs.txt to the GitHub issue.") + + if cmd != "start" { + logPath, err := latestLogFilePath() + if err != nil { + klog.Warningf("failed to get latest log file path: %v", err) + } + msg += Sprintf(style.Empty, "Please also attach the following file to the GitHub issue:") + msg += Sprintf(style.Empty, "- {{.logPath}}", V{"logPath": logPath}) + } BoxedErr(msg) } diff --git a/pkg/minikube/out/out_test.go b/pkg/minikube/out/out_test.go index ea0f729c8acd..acaf13ac409c 100644 --- a/pkg/minikube/out/out_test.go +++ b/pkg/minikube/out/out_test.go @@ -21,11 +21,12 @@ import ( "os" "path/filepath" "strconv" + "strings" "testing" "github.com/Delta456/box-cli-maker/v2" + "github.com/spf13/pflag" - "k8s.io/minikube/pkg/minikube/localpath" "k8s.io/minikube/pkg/minikube/style" "k8s.io/minikube/pkg/minikube/tests" "k8s.io/minikube/pkg/minikube/translate" @@ -130,37 +131,96 @@ func createLogFile() (string, error) { return f.Name(), nil } -func TestLatestLogPath(t *testing.T) { - filename, err := createLogFile() +func TestLatestLogFilePath(t *testing.T) { + want, err := createLogFile() if err != nil { t.Fatal(err) } - defer os.Remove(filename) + defer os.Remove(want) + got, err := latestLogFilePath() + if err != nil { + t.Errorf("latestLogFilePath() failed with error = %v", err) + } + if got != want { + t.Errorf("latestLogFilePath() = %q; wanted %q", got, want) + } +} + +func TestCommand(t *testing.T) { testCases := []struct { - args []string - want string + args []string + want string + shouldError bool }{ { []string{"minikube", "start"}, - localpath.LastStartLog(), + "start", + false, + }, + { + []string{"minikube", "--profile", "profile1", "start"}, + "start", + false, }, { - []string{"minikube", "status"}, - filename, + []string{"minikube"}, + "", + true, }, } + pflag.String("profile", "", "") + for _, tt := range testCases { oldArgs := os.Args defer func() { os.Args = oldArgs }() os.Args = tt.args - got, err := latestLogFilePath() - if err != nil { - t.Fatalf("os.Args = %s; latestLogFilePath() failed with error = %v", tt.args, err) + pflag.Parse() + got, err := command() + if err == nil && tt.shouldError { + t.Errorf("os.Args = %s; command() did not fail but was expected to", tt.args) + } + if err != nil && !tt.shouldError { + t.Errorf("os.Args = %s; command() failed with error = %v", tt.args, err) } if got != tt.want { - t.Errorf("os.Args = %s; latestLogFilePath() = %q; wanted %q", tt.args, got, tt.want) + t.Errorf("os.Args = %s; command() = %q; wanted %q", tt.args, got, tt.want) + } + } +} + +func TestDisplayGitHubIssueMessage(t *testing.T) { + testCases := []struct { + args []string + shouldContainMessage bool + }{ + { + []string{"minikube", "start"}, + false, + }, + { + []string{"minikube", "delete"}, + true, + }, + } + + msg := "Please also attach the following file to the GitHub issue:" + + for _, tt := range testCases { + oldArgs := os.Args + defer func() { os.Args = oldArgs }() + os.Args = tt.args + pflag.Parse() + f := tests.NewFakeFile() + SetErrFile(f) + displayGitHubIssueMessage() + output := f.String() + if strings.Contains(output, msg) && !tt.shouldContainMessage { + t.Errorf("os.Args = %s; displayGitHubIssueMessage() output = %q; did not expect it to contain = %q", tt.args, output, msg) + } + if !strings.Contains(output, msg) && tt.shouldContainMessage { + t.Errorf("os.Args = %s; displayGitHubIssueMessage() output = %q; expected to contain = %q", tt.args, output, msg) } } } From 37b6b09255bdb02ca72e2d187fd82aa390ec64af Mon Sep 17 00:00:00 2001 From: phbits Date: Thu, 2 Sep 2021 22:14:25 +0000 Subject: [PATCH 048/201] update windows install using powershell --- site/content/en/docs/start/_index.md | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/site/content/en/docs/start/_index.md b/site/content/en/docs/start/_index.md index 59174dd807e2..5a2729c6a0d8 100644 --- a/site/content/en/docs/start/_index.md +++ b/site/content/en/docs/start/_index.md @@ -425,17 +425,16 @@ choco install minikube {{% quiz_instruction id="/Windows/x86-64/Stable/.exe download" %}} 1. Download the [latest release](https://storage.googleapis.com/minikube/releases/latest/minikube-installer.exe).
- Or if you have `curl` installed, use this command: - ```shell - curl -Lo minikube.exe https://github.com/kubernetes/minikube/releases/latest/download/minikube-windows-amd64.exe - New-Item -Path "c:\" -Name "minikube" -ItemType "directory" -Force - Move-Item .\minikube.exe c:\minikube\minikube.exe -Force + Or if using `PowerShell`, use this command: + ```powershell + New-Item -Path 'c:\' -Name 'minikube' -ItemType Directory -Force + Invoke-WebRequest -OutFile 'c:\minikube\minikube.exe' -Uri 'https://github.com/kubernetes/minikube/releases/latest/download/minikube-windows-amd64.exe' -UseBasicParsing ``` 2. Add the binary in to your `PATH`.
_Make sure to run PowerShell as Administrator._ - ```shell + ```powershell $oldpath=[Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) if($oldpath -notlike "*;C:\minikube*"){` [Environment]::SetEnvironmentVariable("Path", $oldpath+";C:\minikube", [EnvironmentVariableTarget]::Machine)` @@ -447,19 +446,19 @@ choco install minikube {{% quiz_instruction id="/Windows/x86-64/Beta/.exe download" %}} 1. Download the latest beta release.
- Or if you have `curl` installed, use this command: - ```shell - $r='https://api.github.com/repos/kubernetes/minikube/releases' - $u=curl -s $r | Select-String -Pattern 'http.*download/v.*beta.*/minikube-windows-amd64.exe' | Select Matches -First 1 - curl -Lo minikube.exe $u.Matches.Value - New-Item -Path "c:\" -Name "minikube" -ItemType "directory" -Force - Move-Item .\minikube.exe c:\minikube\minikube.exe -Force + Or if using `PowerShell`, use this command: + ```powershell + New-Item -Path 'c:\' -Name 'minikube' -ItemType Directory -Force + $response = Invoke-WebRequest -Uri 'https://api.github.com/repos/kubernetes/minikube/releases' -UseBasicParsing + $json = $response.Content | ConvertFrom-Json + $item = ($json | ?{ $_.prerelease -eq $true })[0].assets | ?{ $_.name -eq 'minikube-windows-amd64.exe' } + Invoke-WebRequest -Uri $item.browser_download_url -OutFile 'c:\minikube\minikube.exe' -UseBasicParsing ``` 2. Add the binary in to your `PATH`.
_Make sure to run PowerShell as Administrator._ - ```shell + ```powershell $oldpath=[Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) if($oldpath -notlike "*;C:\minikube*"){` [Environment]::SetEnvironmentVariable("Path", $oldpath+";C:\minikube", [EnvironmentVariableTarget]::Machine)` From 06f08da4c8bb0ddb0c2f34c923545315b8e67697 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Thu, 2 Sep 2021 22:49:20 +0000 Subject: [PATCH 049/201] Update auto-generated docs and translations --- translations/de.json | 3 ++- translations/es.json | 3 ++- translations/fr.json | 2 ++ translations/ja.json | 3 ++- translations/ko.json | 3 ++- translations/pl.json | 2 ++ translations/strings.txt | 3 ++- translations/zh-CN.json | 3 ++- 8 files changed, 16 insertions(+), 6 deletions(-) diff --git a/translations/de.json b/translations/de.json index 4c52b30ad921..478dc10a59ea 100644 --- a/translations/de.json +++ b/translations/de.json @@ -432,7 +432,7 @@ "Paused {{.count}} containers in: {{.namespaces}}": "", "Pausing node {{.name}} ... ": "", "Permissions: {{.octalMode}} ({{.writtenMode}})": "", - "Please attach the following file to the GitHub issue:": "", + "Please also attach the following file to the GitHub issue:": "", "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "", "Please either authenticate to the registry or use --base-image flag to use a different registry.": "", "Please enter a value:": "", @@ -447,6 +447,7 @@ "Please provide source and target image": "", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "", + "Please run `minikube logs --file=logs.txt` and attach logs.txt to the GitHub issue.": "", "Please see {{.documentation_url}} for more details": "", "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "", "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "", diff --git a/translations/es.json b/translations/es.json index d665eb1d508d..4f5c02ac0a7a 100644 --- a/translations/es.json +++ b/translations/es.json @@ -438,7 +438,7 @@ "Paused {{.count}} containers in: {{.namespaces}}": "", "Pausing node {{.name}} ... ": "", "Permissions: {{.octalMode}} ({{.writtenMode}})": "", - "Please attach the following file to the GitHub issue:": "", + "Please also attach the following file to the GitHub issue:": "", "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "", "Please either authenticate to the registry or use --base-image flag to use a different registry.": "", "Please enter a value:": "", @@ -453,6 +453,7 @@ "Please provide source and target image": "", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "", + "Please run `minikube logs --file=logs.txt` and attach logs.txt to the GitHub issue.": "", "Please see {{.documentation_url}} for more details": "", "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "", "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "", diff --git a/translations/fr.json b/translations/fr.json index 662c52458efe..ceb59135eebf 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -439,6 +439,7 @@ "Paused {{.count}} containers in: {{.namespaces}}": "{{.count}} conteneurs suspendus dans : {{.namespaces}}", "Pausing node {{.name}} ... ": "Suspendre le nœud {{.name}} ...", "Permissions: {{.octalMode}} ({{.writtenMode}})": "Autorisations : {{.octalMode}} ({{.writtenMode}})", + "Please also attach the following file to the GitHub issue:": "", "Please attach the following file to the GitHub issue:": "Veuillez joindre le fichier suivant au problème GitHub :", "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "Veuillez créer un cluster avec une plus grande taille de disque : `minikube start --disk SIZE_MB`", "Please either authenticate to the registry or use --base-image flag to use a different registry.": "Veuillez vous authentifier auprès du registre ou utiliser l'indicateur --base-image pour utiliser un registre différent.", @@ -454,6 +455,7 @@ "Please provide source and target image": "Veuillez fournir l'image source et cible", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "Veuillez réévaluer votre docker-env, pour vous assurer que vos variables d'environnement ont des ports mis à jour :\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "Veuillez réévaluer votre podman-env, pour vous assurer que vos variables d'environnement ont des ports mis à jour :\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t", + "Please run `minikube logs --file=logs.txt` and attach logs.txt to the GitHub issue.": "", "Please see {{.documentation_url}} for more details": "Veuillez consulter {{.documentation_url}} pour plus de détails", "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "Veuillez spécifier le répertoire à monter : \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (exemple : \"/host-home:/vm-home\")", "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "Veuillez spécifier le chemin à copier : \n\tminikube cp \u003cchemin du fichier source\u003e \u003cchemin absolu du fichier cible\u003e (exemple : \"minikube cp a/b.txt /copied.txt\")", diff --git a/translations/ja.json b/translations/ja.json index a13338788ee5..81bd7737b4ee 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -429,7 +429,7 @@ "Pausing node {{.name}} ...": "ノード {{.name}} を一時停止しています ...", "Pausing node {{.name}} ... ": "", "Permissions: {{.octalMode}} ({{.writtenMode}})": "", - "Please attach the following file to the GitHub issue:": "", + "Please also attach the following file to the GitHub issue:": "", "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "", "Please either authenticate to the registry or use --base-image flag to use a different registry.": "", "Please enter a value:": "", @@ -444,6 +444,7 @@ "Please provide source and target image": "", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "", + "Please run `minikube logs --file=logs.txt` and attach logs.txt to the GitHub issue.": "", "Please see {{.documentation_url}} for more details": "", "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "", "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "", diff --git a/translations/ko.json b/translations/ko.json index c4311d27f367..7849bef2b84f 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -453,7 +453,7 @@ "Paused {{.count}} containers in: {{.namespaces}}": "", "Pausing node {{.name}} ... ": "", "Permissions: {{.octalMode}} ({{.writtenMode}})": "", - "Please attach the following file to the GitHub issue:": "", + "Please also attach the following file to the GitHub issue:": "", "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "", "Please either authenticate to the registry or use --base-image flag to use a different registry.": "", "Please enter a value:": "값을 입력하세요", @@ -468,6 +468,7 @@ "Please provide source and target image": "", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "", + "Please run `minikube logs --file=logs.txt` and attach logs.txt to the GitHub issue.": "", "Please see {{.documentation_url}} for more details": "", "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "", "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "", diff --git a/translations/pl.json b/translations/pl.json index 4c8bc37aca27..a88e990b28ef 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -446,6 +446,7 @@ "Paused {{.count}} containers in: {{.namespaces}}": "Zatrzymane kontenery: {{.count}} w przestrzeniach nazw: {{.namespaces}}", "Pausing node {{.name}} ... ": "Zatrzymywanie węzła {{.name}} ... ", "Permissions: {{.octalMode}} ({{.writtenMode}})": "", + "Please also attach the following file to the GitHub issue:": "", "Please attach the following file to the GitHub issue:": "Dołącz następujący plik do zgłoszenia problemu na GitHubie:", "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "Utwórz klaster z większym rozmiarem dysku: `minikube start --disk SIZE_MB`", "Please either authenticate to the registry or use --base-image flag to use a different registry.": "Uwierzytelnij się w rejestrze lub użyć flagi --base-image w celu użycia innego rejestru.", @@ -461,6 +462,7 @@ "Please provide source and target image": "", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "", + "Please run `minikube logs --file=logs.txt` and attach logs.txt to the GitHub issue.": "", "Please see {{.documentation_url}} for more details": "Zobacz {{.documentation_url}} żeby uzyskać więcej informacji", "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "Sprecyzuj katalog, który ma być zamontowany: \n\tminikube mount \u003ckatalog źródłowy\u003e:\u003ckatalog docelowy\u003e (przykład: \"/host-home:/vm-home\")", "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "", diff --git a/translations/strings.txt b/translations/strings.txt index afa97d7a1bce..b943fb9cc206 100644 --- a/translations/strings.txt +++ b/translations/strings.txt @@ -407,7 +407,7 @@ "Paused {{.count}} containers in: {{.namespaces}}": "", "Pausing node {{.name}} ... ": "", "Permissions: {{.octalMode}} ({{.writtenMode}})": "", - "Please attach the following file to the GitHub issue:": "", + "Please also attach the following file to the GitHub issue:": "", "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "", "Please either authenticate to the registry or use --base-image flag to use a different registry.": "", "Please enter a value:": "", @@ -422,6 +422,7 @@ "Please provide source and target image": "", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "", + "Please run `minikube logs --file=logs.txt` and attach logs.txt to the GitHub issue.": "", "Please see {{.documentation_url}} for more details": "", "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "", "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "", diff --git a/translations/zh-CN.json b/translations/zh-CN.json index 0700b140eb13..ab9509fe3780 100644 --- a/translations/zh-CN.json +++ b/translations/zh-CN.json @@ -520,7 +520,7 @@ "Paused {{.count}} containers in: {{.namespaces}}": "", "Pausing node {{.name}} ... ": "", "Permissions: {{.octalMode}} ({{.writtenMode}})": "权限: {{.octalMode}} ({{.writtenMode}})", - "Please attach the following file to the GitHub issue:": "", + "Please also attach the following file to the GitHub issue:": "", "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "", "Please either authenticate to the registry or use --base-image flag to use a different registry.": "", "Please enter a value:": "请输入一个值:", @@ -535,6 +535,7 @@ "Please provide source and target image": "", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "", + "Please run `minikube logs --file=logs.txt` and attach logs.txt to the GitHub issue.": "", "Please see {{.documentation_url}} for more details": "", "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "", "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "", From 27a22b9afccb841c534fdec95a0ca4a2f50841b3 Mon Sep 17 00:00:00 2001 From: phbits Date: Thu, 2 Sep 2021 22:57:56 +0000 Subject: [PATCH 050/201] Update PowerShell path updates --- site/content/en/docs/start/_index.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/site/content/en/docs/start/_index.md b/site/content/en/docs/start/_index.md index 5a2729c6a0d8..6922b0befa1f 100644 --- a/site/content/en/docs/start/_index.md +++ b/site/content/en/docs/start/_index.md @@ -435,9 +435,9 @@ choco install minikube
_Make sure to run PowerShell as Administrator._ ```powershell - $oldpath=[Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) - if($oldpath -notlike "*;C:\minikube*"){` - [Environment]::SetEnvironmentVariable("Path", $oldpath+";C:\minikube", [EnvironmentVariableTarget]::Machine)` + $oldPath = [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine) + if ($oldPath.Split(';') -inotcontains 'C:\minikube'){ ` + [Environment]::SetEnvironmentVariable('Path', $('{0};C:\minikube' -f $oldPath), [EnvironmentVariableTarget]::Machine) ` } ``` _If you used a CLI to perform the installation, you will need to close that CLI and open a new one before proceeding._ @@ -459,9 +459,9 @@ choco install minikube
_Make sure to run PowerShell as Administrator._ ```powershell - $oldpath=[Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) - if($oldpath -notlike "*;C:\minikube*"){` - [Environment]::SetEnvironmentVariable("Path", $oldpath+";C:\minikube", [EnvironmentVariableTarget]::Machine)` + $oldPath = [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine) + if ($oldPath.Split(';') -inotcontains 'C:\minikube'){ ` + [Environment]::SetEnvironmentVariable('Path', $('{0};C:\minikube' -f $oldPath), [EnvironmentVariableTarget]::Machine) ` } ``` _If you used a CLI to perform the installation, you will need to close that CLI and open a new one before proceeding._ From 1da075f927784c67710bdb6d4aa02c1713004578 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 2 Sep 2021 16:41:15 -0700 Subject: [PATCH 051/201] remove ppc64le from kicbase archs --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index acd60490cb10..88a563ef0303 100644 --- a/Makefile +++ b/Makefile @@ -685,7 +685,7 @@ docker-multi-arch-builder: env $(X_BUILD_ENV) docker buildx rm --builder $(X_DOCKER_BUILDER) || true env $(X_BUILD_ENV) docker buildx create --name $(X_DOCKER_BUILDER) --buildkitd-flags '--debug' || true -KICBASE_ARCH = linux/amd64,linux/arm,linux/arm64,linux/ppc64le,linux/s390x +KICBASE_ARCH = linux/amd64,linux/arm,linux/arm64,linux/s390x KICBASE_IMAGE_GCR ?= $(REGISTRY)/kicbase:$(KIC_VERSION) KICBASE_IMAGE_HUB ?= kicbase/stable:$(KIC_VERSION) KICBASE_IMAGE_REGISTRIES ?= $(KICBASE_IMAGE_GCR) $(KICBASE_IMAGE_HUB) From 04873389fa81ae98833285c929801361adbb944f Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 2 Sep 2021 17:54:56 -0700 Subject: [PATCH 052/201] remove armv7 too --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 88a563ef0303..b52eb76b2640 100644 --- a/Makefile +++ b/Makefile @@ -685,7 +685,7 @@ docker-multi-arch-builder: env $(X_BUILD_ENV) docker buildx rm --builder $(X_DOCKER_BUILDER) || true env $(X_BUILD_ENV) docker buildx create --name $(X_DOCKER_BUILDER) --buildkitd-flags '--debug' || true -KICBASE_ARCH = linux/amd64,linux/arm,linux/arm64,linux/s390x +KICBASE_ARCH = linux/amd64,linux/arm64,linux/s390x KICBASE_IMAGE_GCR ?= $(REGISTRY)/kicbase:$(KIC_VERSION) KICBASE_IMAGE_HUB ?= kicbase/stable:$(KIC_VERSION) KICBASE_IMAGE_REGISTRIES ?= $(KICBASE_IMAGE_GCR) $(KICBASE_IMAGE_HUB) From 703324b7c7d94f426108facd897e8aeaa7103caf Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Fri, 3 Sep 2021 01:36:51 +0000 Subject: [PATCH 053/201] Updating kicbase image to v0.0.25-1630631232-12398 --- pkg/drivers/kic/types.go | 4 ++-- site/content/en/docs/commands/start.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/drivers/kic/types.go b/pkg/drivers/kic/types.go index c0af45335624..fdcf39835717 100644 --- a/pkg/drivers/kic/types.go +++ b/pkg/drivers/kic/types.go @@ -24,9 +24,9 @@ import ( const ( // Version is the current version of kic - Version = "v0.0.25-1628619379-12032" + Version = "v0.0.25-1630631232-12398" // SHA of the kic base image - baseImageSHA = "937faef407987cbd8b3cb0a90c6c5dfd664817d5377be0b77a4ecbf0f9f9c1b6" + baseImageSHA = "85a33ebee49136274dfc02e62edee1fca3fd0117c46a98dd4db61e9de2e0319e" // The name of the GCR kicbase repository gcrRepo = "gcr.io/k8s-minikube/kicbase-builds" // The name of the Dockerhub kicbase repository diff --git a/site/content/en/docs/commands/start.md b/site/content/en/docs/commands/start.md index e35c4367bb46..96ac41929bc0 100644 --- a/site/content/en/docs/commands/start.md +++ b/site/content/en/docs/commands/start.md @@ -26,7 +26,7 @@ minikube start [flags] --apiserver-names strings A set of apiserver names which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine --apiserver-port int The apiserver listening port (default 8443) --auto-update-drivers If set, automatically updates drivers to the latest version. Defaults to true. (default true) - --base-image string The base image to use for docker/podman drivers. Intended for local development. (default "gcr.io/k8s-minikube/kicbase-builds:v0.0.25-1628619379-12032@sha256:937faef407987cbd8b3cb0a90c6c5dfd664817d5377be0b77a4ecbf0f9f9c1b6") + --base-image string The base image to use for docker/podman drivers. Intended for local development. (default "gcr.io/k8s-minikube/kicbase-builds:v0.0.25-1630631232-12398@sha256:85a33ebee49136274dfc02e62edee1fca3fd0117c46a98dd4db61e9de2e0319e") --cache-images If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none. (default true) --cni string CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto) --container-runtime string The container runtime to be used (docker, cri-o, containerd). (default "docker") From 67b82f3fe14918f0745bedba10b9cb6340301bae Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Fri, 3 Sep 2021 02:18:31 +0000 Subject: [PATCH 054/201] Update kicbase to v0.0.26 --- pkg/drivers/kic/types.go | 8 ++++---- site/content/en/docs/commands/start.md | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/drivers/kic/types.go b/pkg/drivers/kic/types.go index fdcf39835717..03e7728c554d 100644 --- a/pkg/drivers/kic/types.go +++ b/pkg/drivers/kic/types.go @@ -24,13 +24,13 @@ import ( const ( // Version is the current version of kic - Version = "v0.0.25-1630631232-12398" + Version = "v0.0.26" // SHA of the kic base image - baseImageSHA = "85a33ebee49136274dfc02e62edee1fca3fd0117c46a98dd4db61e9de2e0319e" + baseImageSHA = "d4aa14fbdc3a28a60632c24af937329ec787b02c89983c6f5498d346860a848c" // The name of the GCR kicbase repository - gcrRepo = "gcr.io/k8s-minikube/kicbase-builds" + gcrRepo = "gcr.io/k8s-minikube/kicbase" // The name of the Dockerhub kicbase repository - dockerhubRepo = "docker.io/kicbase/build" + dockerhubRepo = "kicbase/stable" ) var ( diff --git a/site/content/en/docs/commands/start.md b/site/content/en/docs/commands/start.md index 96ac41929bc0..9f02f7024f57 100644 --- a/site/content/en/docs/commands/start.md +++ b/site/content/en/docs/commands/start.md @@ -26,7 +26,7 @@ minikube start [flags] --apiserver-names strings A set of apiserver names which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine --apiserver-port int The apiserver listening port (default 8443) --auto-update-drivers If set, automatically updates drivers to the latest version. Defaults to true. (default true) - --base-image string The base image to use for docker/podman drivers. Intended for local development. (default "gcr.io/k8s-minikube/kicbase-builds:v0.0.25-1630631232-12398@sha256:85a33ebee49136274dfc02e62edee1fca3fd0117c46a98dd4db61e9de2e0319e") + --base-image string The base image to use for docker/podman drivers. Intended for local development. (default "gcr.io/k8s-minikube/kicbase:v0.0.26@sha256:d4aa14fbdc3a28a60632c24af937329ec787b02c89983c6f5498d346860a848c") --cache-images If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none. (default true) --cni string CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto) --container-runtime string The container runtime to be used (docker, cri-o, containerd). (default "docker") From 63d1919c33927fd87b8fd46afcad8ff4450596d9 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Fri, 3 Sep 2021 10:37:42 -0700 Subject: [PATCH 055/201] Update Makefile and CHANGELOG for 1.23.0 release --- CHANGELOG.md | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 2 +- 2 files changed, 106 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab0ded5a073f..eeec05320e67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,110 @@ # Release Notes +## Version 1.23.0 - 2021-09-03 + +Features: +* Add `--extra-disks` capability to kvm2 driver [#12351](https://github.com/kubernetes/minikube/pull/12351) +* Support Rootless Docker [#12359](https://github.com/kubernetes/minikube/pull/12359) +* Add support for tcsh in docker-env subcommand [#12332](https://github.com/kubernetes/minikube/pull/12332) +* Support Ingress on MacOS, driver docker [#12089](https://github.com/kubernetes/minikube/pull/12089) +* KVM2 driver for linux/aarch64 [#11768](https://github.com/kubernetes/minikube/pull/11768) +* Build kicbase image for linux/s390x [#12079](https://github.com/kubernetes/minikube/pull/12079) +* Add configurable port for minikube mount [#11979](https://github.com/kubernetes/minikube/pull/11979) +* Add ability to create extra disks on hyperkit vms [#11483](https://github.com/kubernetes/minikube/pull/11483) +* Add method for customized box output [#11709](https://github.com/kubernetes/minikube/pull/11709) +* Add addon support for portainer [#11933](https://github.com/kubernetes/minikube/pull/11933) +* minikube start --image-repository will now accept URLs with port [#11585](https://github.com/kubernetes/minikube/pull/11585) + +minikube image: +* Add `minikube image` commands for pull and tag and push [#12326](https://github.com/kubernetes/minikube/pull/12326) +* new `image save` command [#12162](https://github.com/kubernetes/minikube/pull/12162) +* Auto start buildkit daemon on `image build` for containerd [#12076](https://github.com/kubernetes/minikube/pull/12076) + +Bug fixes: +* Select WSL VM IP when performing mounting [#12319](https://github.com/kubernetes/minikube/pull/12319) +* Fix minikube restart on Cloud Shell [#12237](https://github.com/kubernetes/minikube/pull/12237) +* pause each container separately [#12318](https://github.com/kubernetes/minikube/pull/12318) +* Add output parameter to the docker-env none shell [#12263](https://github.com/kubernetes/minikube/pull/12263) +* Clean up ssh tunnels during exit. [#11745](https://github.com/kubernetes/minikube/pull/11745) +* Fix loading an image from tar failing on existing delete [#12143](https://github.com/kubernetes/minikube/pull/12143) +* configure gcp-auth addon pull secret to work with all GCR and AR mirrors [#12106](https://github.com/kubernetes/minikube/pull/12106) +* Fix the error output of minikube version --components command [#12085](https://github.com/kubernetes/minikube/pull/12085) +* Added restart command after setting crio options [#11968](https://github.com/kubernetes/minikube/pull/11968) +* Don't set conntrack parameters in kube-proxy [#11957](https://github.com/kubernetes/minikube/pull/11957) +* Fix kvm2 driver arm64 deb package [#11937](https://github.com/kubernetes/minikube/pull/11937) +* Allow to set the dashboard proxyfied port [#11553](https://github.com/kubernetes/minikube/pull/11553) + +Version Upgrades: +* bump golang version to 1.17 [#12378](https://github.com/kubernetes/minikube/pull/12378) +* Bump k8s.io/kubectl from 0.22.0 to 0.22.1 [#12335](https://github.com/kubernetes/minikube/pull/12335) +* Bump default Kubernetes version to v1.22.1 and update addons to with new API (ingress, gcpauth, olm and cilium) [#12325](https://github.com/kubernetes/minikube/pull/12325) +* Add kubeadm image versions for kubernetes 1.22 [#12331](https://github.com/kubernetes/minikube/pull/12331) +* bump calico to v3.20 and move away from v1beta apis [#12230](https://github.com/kubernetes/minikube/pull/12230) +* Upgrade Buildroot to 2021.02 LTS with Linux 4.19 [#12268](https://github.com/kubernetes/minikube/pull/12268) +* Upgrade buildkit from 0.8.2 to 0.9.0 [#12032](https://github.com/kubernetes/minikube/pull/12032) +* ISO: Upgrade Docker, from 20.10.6 to 20.10.8 [#12122](https://github.com/kubernetes/minikube/pull/12122) +* ISO: Upgrade crictl (from cri-tools) to v1.21.0 [#12129](https://github.com/kubernetes/minikube/pull/12129) + +Thank you to our contributors for this release! + +- Akihiro Suda +- Alexandre Garnier +- Anders F Björklund +- Andriy Dzikh +- Blaine Gardner +- Devdutt Shenoi +- Ilya Zuyev +- Jack Zhang +- Jeff MAURY +- Joel Klint +- Julien Breux +- Leopold Schabel +- Matt Dainty +- Medya Ghazizadeh +- Pablo Caderno +- Parthvi Vala +- Peixuan Ding +- Predrag Rogic +- Raghavendra Talur +- Rajwinder Mahal +- Sharif Elgamal +- Steven Powell +- Tejal Desai +- Vishal Jain +- Zhang Shihe +- amit dixit +- balasu +- dmpe +- jayonlau +- m-aciek +- rajdevworks +- なつき + +Thank you to our PR reviewers for this release! + +- medyagh (68 comments) +- sharifelgamal (26 comments) +- afbjorklund (22 comments) +- spowelljr (15 comments) +- andriyDev (7 comments) +- mikebrow (7 comments) +- iliadmitriev (2 comments) +- ilya-zuyev (2 comments) +- azhao155 (1 comments) +- briandealwis (1 comments) +- ncresswell (1 comments) +- shahiddev (1 comments) + +Thank you to our triage members for this release! + +- afbjorklund (47 comments) +- RA489 (36 comments) +- sharifelgamal (32 comments) +- spowelljr (28 comments) +- medyagh (20 comments) + +Check out our [contributions leaderboard](https://minikube.sigs.k8s.io/docs/contrib/leaderboard/v1.23.0/) for this release! + ## Version 1.22.0 - 2021-07-07 Features: diff --git a/Makefile b/Makefile index b52eb76b2640..64d313a710e3 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ # Bump these on release - and please check ISO_VERSION for correctness. VERSION_MAJOR ?= 1 -VERSION_MINOR ?= 22 +VERSION_MINOR ?= 23 VERSION_BUILD ?= 0 RAW_VERSION=$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_BUILD) VERSION ?= v$(RAW_VERSION) From 898fb85524121d5b622289bf3d0a820246cd7337 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Fri, 3 Sep 2021 10:48:29 -0700 Subject: [PATCH 056/201] address comments --- CHANGELOG.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eeec05320e67..7638ea4667fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,17 +3,16 @@ ## Version 1.23.0 - 2021-09-03 Features: -* Add `--extra-disks` capability to kvm2 driver [#12351](https://github.com/kubernetes/minikube/pull/12351) * Support Rootless Docker [#12359](https://github.com/kubernetes/minikube/pull/12359) * Add support for tcsh in docker-env subcommand [#12332](https://github.com/kubernetes/minikube/pull/12332) * Support Ingress on MacOS, driver docker [#12089](https://github.com/kubernetes/minikube/pull/12089) -* KVM2 driver for linux/aarch64 [#11768](https://github.com/kubernetes/minikube/pull/11768) -* Build kicbase image for linux/s390x [#12079](https://github.com/kubernetes/minikube/pull/12079) +* Add support for linux/s390x on docker/podman drivers [#12079](https://github.com/kubernetes/minikube/pull/12079) * Add configurable port for minikube mount [#11979](https://github.com/kubernetes/minikube/pull/11979) -* Add ability to create extra disks on hyperkit vms [#11483](https://github.com/kubernetes/minikube/pull/11483) * Add method for customized box output [#11709](https://github.com/kubernetes/minikube/pull/11709) * Add addon support for portainer [#11933](https://github.com/kubernetes/minikube/pull/11933) * minikube start --image-repository will now accept URLs with port [#11585](https://github.com/kubernetes/minikube/pull/11585) +* Add ability to create extra disks for hyperkit driver [#11483](https://github.com/kubernetes/minikube/pull/11483) +* Add ability to create extra disks for kvm2 driver [#12351](https://github.com/kubernetes/minikube/pull/12351) minikube image: * Add `minikube image` commands for pull and tag and push [#12326](https://github.com/kubernetes/minikube/pull/12326) @@ -36,7 +35,6 @@ Bug fixes: Version Upgrades: * bump golang version to 1.17 [#12378](https://github.com/kubernetes/minikube/pull/12378) -* Bump k8s.io/kubectl from 0.22.0 to 0.22.1 [#12335](https://github.com/kubernetes/minikube/pull/12335) * Bump default Kubernetes version to v1.22.1 and update addons to with new API (ingress, gcpauth, olm and cilium) [#12325](https://github.com/kubernetes/minikube/pull/12325) * Add kubeadm image versions for kubernetes 1.22 [#12331](https://github.com/kubernetes/minikube/pull/12331) * bump calico to v3.20 and move away from v1beta apis [#12230](https://github.com/kubernetes/minikube/pull/12230) From 14e4d072a6b7a4d8aaeae768ae0d5b20e5b38190 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Fri, 3 Sep 2021 13:03:45 -0700 Subject: [PATCH 057/201] Update releases.json to include v1.23.0 --- deploy/minikube/releases.json | 8 ++++++++ site/content/en/docs/_index.md | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/deploy/minikube/releases.json b/deploy/minikube/releases.json index 14d9feb5d365..580bb25290c5 100644 --- a/deploy/minikube/releases.json +++ b/deploy/minikube/releases.json @@ -1,4 +1,12 @@ [ + { + "name": "v1.23.0", + "checksums": { + "darwin": "943f522393e04879bb83d0e484d608dd4086e92c58a0161b4f29dc9691a9ec80", + "linux": "a34f1e46151f3e302b7d92dee680a0cceaba5c5d6ab79baaf695b17c4a61df38", + "windows": "7b7f4c7be4fd954037dbb0f05ef5631f1b453d0d08c8de7c4d402261816b50ac" + } + }, { "name": "v1.22.0", "checksums": { diff --git a/site/content/en/docs/_index.md b/site/content/en/docs/_index.md index 7930785c06b2..77c5d3fc2049 100644 --- a/site/content/en/docs/_index.md +++ b/site/content/en/docs/_index.md @@ -11,7 +11,7 @@ minikube quickly sets up a local Kubernetes cluster on macOS, Linux, and Windows ![Screenshot](/images/screenshot.png) -🎉 Latest Release: v1.22.0 - Jul 07, 2021 ([changelog](https://github.com/kubernetes/minikube/blob/master/CHANGELOG.md)) +🎉 Latest Release: v1.23.0 - Sep 03, 2021 ([changelog](https://github.com/kubernetes/minikube/blob/master/CHANGELOG.md)) ## Highlights From 54adb516851de7cf094bc964a082e5494b3ba5ff Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Fri, 3 Sep 2021 20:25:06 +0000 Subject: [PATCH 058/201] add contribution leaderboard for v1.23.0 --- .../en/docs/contrib/leaderboard/v1.22.0.html | 49 +- .../en/docs/contrib/leaderboard/v1.23.0.html | 512 ++++++++++++++++++ 2 files changed, 537 insertions(+), 24 deletions(-) create mode 100644 site/content/en/docs/contrib/leaderboard/v1.23.0.html diff --git a/site/content/en/docs/contrib/leaderboard/v1.22.0.html b/site/content/en/docs/contrib/leaderboard/v1.22.0.html index 4055e04a32d9..4a89ff27b2a3 100644 --- a/site/content/en/docs/contrib/leaderboard/v1.22.0.html +++ b/site/content/en/docs/contrib/leaderboard/v1.22.0.html @@ -6,6 +6,7 @@ kubernetes/minikube - Leaderboard + @@ -188,9 +189,9 @@

Most Demanding

["sharifelgamal", 16, "16"], ["ilya-zuyev", 8, "8"], ["spowelljr", 7, "7"], - ["prezha", 0, "0"], - ["tharun208", 0, "0"], ["afbjorklund", 0, "0"], + ["tharun208", 0, "0"], + ["prezha", 0, "0"], ]); @@ -236,11 +237,11 @@

Most Active

["jeffmaury", 4, "4"], ["afbjorklund", 3, "3"], ["dinever", 2, "2"], - ["MaximeKjaer", 1, "1"], - ["RA489", 1, "1"], - ["sharmarajdaksh", 1, "1"], ["vishjain", 1, "1"], - ["daehyeok", 1, "1"], + ["zhangdb-git", 1, "1"], + ["sharmarajdaksh", 1, "1"], + ["felipecrescencio", 1, "1"], + ["JacekDuszenko", 1, "1"], ["dongjoon-hyun", 1, "1"], ]); @@ -288,7 +289,7 @@

Big Movers

["MaximeKjaer", 30, "30"], ["JacekDuszenko", 6, "6"], ["felipecrescencio", 4, "4"], - ["RA489", 2, "2"], + ["zhangdb-git", 2, "2"], ]); @@ -372,21 +373,21 @@

Most Active

function drawcomments() { var data = new google.visualization.arrayToDataTable([ [{label:'',type:'string'},{label: '# of comments', type: 'number'}, { role: 'annotation' }], - ["afbjorklund", 36, "36"], - ["sharifelgamal", 22, "22"], - ["medyagh", 22, "22"], - ["spowelljr", 7, "7"], - ["vishjain", 6, "6"], - ["andriyDev", 5, "5"], + ["afbjorklund", 30, "30"], + ["sharifelgamal", 17, "17"], + ["medyagh", 14, "14"], + ["vishjain", 5, "5"], ["JacekDuszenko", 5, "5"], - ["mahalrs", 4, "4"], - ["RA489", 4, "4"], ["mathieuruellan", 4, "4"], - ["rajdevworks", 3, "3"], - ["secmobi", 2, "2"], - ["andrewmiron", 2, "2"], + ["spowelljr", 4, "4"], + ["mahalrs", 3, "3"], ["totore86", 2, "2"], + ["J-Curragh", 2, "2"], ["ilya-zuyev", 2, "2"], + ["andriyDev", 2, "2"], + ["andrewmiron", 2, "2"], + ["secmobi", 2, "2"], + ["dinever", 1, "1"], ]); @@ -419,21 +420,21 @@

Most Helpful

function drawcommentWords() { var data = new google.visualization.arrayToDataTable([ [{label:'',type:'string'},{label: '# of words (excludes authored)', type: 'number'}, { role: 'annotation' }], - ["afbjorklund", 2050, "2050"], - ["medyagh", 897, "897"], - ["spowelljr", 444, "444"], + ["afbjorklund", 1519, "1519"], + ["medyagh", 676, "676"], ["alexio777", 357, "357"], - ["prezha", 314, "314"], + ["spowelljr", 271, "271"], ["annopohjala", 249, "249"], - ["sharifelgamal", 245, "245"], ["andrewmiron", 225, "225"], ["secmobi", 221, "221"], ["J-Curragh", 207, "207"], - ["vmorris", 174, "174"], + ["sharifelgamal", 186, "186"], ["Srikrishnabh", 139, "139"], ["totore86", 127, "127"], ["cscotti", 115, "115"], ["gongpengjun", 106, "106"], + ["vmorris", 101, "101"], + ["mathieuruellan", 94, "94"], ]); diff --git a/site/content/en/docs/contrib/leaderboard/v1.23.0.html b/site/content/en/docs/contrib/leaderboard/v1.23.0.html new file mode 100644 index 000000000000..a1c5c98a8bbb --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.23.0.html @@ -0,0 +1,512 @@ +--- +title: "v1.23.0 - 2021-09-03" +linkTitle: "v1.23.0 - 2021-09-03" +weight: -99 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + + +

kubernetes/minikube

+
2021-07-07 — 2021-09-03
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + From aa8fe49db612cff5a28a0c436cfd66ffa653d68d Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Fri, 3 Sep 2021 20:37:39 +0000 Subject: [PATCH 059/201] add time-to-k8s benchmark for --- .../en/docs/benchmarks/timeToK8s/v1.23.0.md | 7 +++++++ .../images/benchmarks/timeToK8s/v1.23.0.png | Bin 0 -> 35262 bytes 2 files changed, 7 insertions(+) create mode 100644 site/content/en/docs/benchmarks/timeToK8s/v1.23.0.md create mode 100644 site/static/images/benchmarks/timeToK8s/v1.23.0.png diff --git a/site/content/en/docs/benchmarks/timeToK8s/v1.23.0.md b/site/content/en/docs/benchmarks/timeToK8s/v1.23.0.md new file mode 100644 index 000000000000..069af2f44920 --- /dev/null +++ b/site/content/en/docs/benchmarks/timeToK8s/v1.23.0.md @@ -0,0 +1,7 @@ +--- +title: "v1.23.0 Benchmark" +linkTitle: "v1.23.0 Benchmark" +weight: -20210903 +--- + +![time-to-k8s](/images/benchmarks/timeToK8s/v1.23.0.png) diff --git a/site/static/images/benchmarks/timeToK8s/v1.23.0.png b/site/static/images/benchmarks/timeToK8s/v1.23.0.png new file mode 100644 index 0000000000000000000000000000000000000000..ba9e8ab2e6000cce511f6a371f3fe8f0adba4da6 GIT binary patch literal 35262 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 Date: Sat, 4 Sep 2021 09:00:26 +0200 Subject: [PATCH 060/201] Fix french translation Signed-off-by: Jeff MAURY --- translations/fr.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/translations/fr.json b/translations/fr.json index ceb59135eebf..79055b0574a7 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -105,7 +105,7 @@ "Connect to LoadBalancer services": "Se connecter aux services LoadBalancer", "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "Envisagez de créer un cluster avec une plus grande taille de mémoire en utilisant `minikube start --memory SIZE_MB`", "Consider increasing Docker Desktop's memory size.": "Envisagez d'augmenter la taille de la mémoire de Docker Desktop.", - "Container runtime must be set to \\\"containerd\\\" for rootless": "", + "Container runtime must be set to \\\"containerd\\\" for rootless": "L'environnement d'exécution du conteneur doit être défini sur \\\"containerd\\\" pour utilisateur normal", "Continuously listing/getting the status with optional interval duration.": "Répertorier/obtenir le statut en continu avec une durée d'intervalle facultative.", "Control Plane could not update, try minikube delete --all --purge": "Le plan de contrôle n'a pas pu mettre à jour, essayez minikube delete --all --purge", "Copy the specified file into minikube": "Copiez le fichier spécifié dans minikube", @@ -414,7 +414,7 @@ "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "Vous avez remarqué que vous avez un docker-env activé sur le pilote {{.driver_name}} dans ce terminal :", "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "Vous avez remarqué que vous avez un pilote podman-env activé sur {{.driver_name}} dans ce terminal :", "Number of CPUs allocated to the minikube VM": "Nombre de processeurs alloués à la VM minikube.", - "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit and kvm2 drivers)": "", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit and kvm2 drivers)": "Nombre de disques supplémentaires créés et attachés à la machine virtuelle minikube (actuellement implémenté uniquement pour les pilotes hyperkit et kvm2)", "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "Nombre de disques supplémentaires créés et attachés à la machine virtuelle minikube (actuellement implémenté uniquement pour le pilote hyperkit)", "Number of lines back to go within the log": "Nombre de lignes à remonter dans le journal", "OS release is {{.pretty_name}}": "La version du système d'exploitation est {{.pretty_name}}", @@ -439,7 +439,7 @@ "Paused {{.count}} containers in: {{.namespaces}}": "{{.count}} conteneurs suspendus dans : {{.namespaces}}", "Pausing node {{.name}} ... ": "Suspendre le nœud {{.name}} ...", "Permissions: {{.octalMode}} ({{.writtenMode}})": "Autorisations : {{.octalMode}} ({{.writtenMode}})", - "Please also attach the following file to the GitHub issue:": "", + "Please also attach the following file to the GitHub issue:": "Veuillez également joindre le fichier suivant au problème GitHub", "Please attach the following file to the GitHub issue:": "Veuillez joindre le fichier suivant au problème GitHub :", "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "Veuillez créer un cluster avec une plus grande taille de disque : `minikube start --disk SIZE_MB`", "Please either authenticate to the registry or use --base-image flag to use a different registry.": "Veuillez vous authentifier auprès du registre ou utiliser l'indicateur --base-image pour utiliser un registre différent.", @@ -455,7 +455,7 @@ "Please provide source and target image": "Veuillez fournir l'image source et cible", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "Veuillez réévaluer votre docker-env, pour vous assurer que vos variables d'environnement ont des ports mis à jour :\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "Veuillez réévaluer votre podman-env, pour vous assurer que vos variables d'environnement ont des ports mis à jour :\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t", - "Please run `minikube logs --file=logs.txt` and attach logs.txt to the GitHub issue.": "", + "Please run `minikube logs --file=logs.txt` and attach logs.txt to the GitHub issue.": "Veuillez exécuter `minikube logs --file=logs.txt` et attachez logs.txt au problème GitHub.", "Please see {{.documentation_url}} for more details": "Veuillez consulter {{.documentation_url}} pour plus de détails", "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "Veuillez spécifier le répertoire à monter : \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (exemple : \"/host-home:/vm-home\")", "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "Veuillez spécifier le chemin à copier : \n\tminikube cp \u003cchemin du fichier source\u003e \u003cchemin absolu du fichier cible\u003e (exemple : \"minikube cp a/b.txt /copied.txt\")", From 568876bc3e425473972951a3cd4a621ef1930abb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Sep 2021 18:31:07 +0000 Subject: [PATCH 061/201] Bump k8s.io/klog/v2 from 2.10.0 to 2.20.0 Bumps [k8s.io/klog/v2](https://github.com/kubernetes/klog) from 2.10.0 to 2.20.0. - [Release notes](https://github.com/kubernetes/klog/releases) - [Changelog](https://github.com/kubernetes/klog/blob/main/RELEASE.md) - [Commits](https://github.com/kubernetes/klog/compare/v2.10.0...v2.20.0) --- updated-dependencies: - dependency-name: k8s.io/klog/v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 4 ++-- go.sum | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 50f599c3bfc8..950a208a8060 100644 --- a/go.mod +++ b/go.mod @@ -92,7 +92,7 @@ require ( k8s.io/api v0.22.1 k8s.io/apimachinery v0.22.1 k8s.io/client-go v0.22.0 - k8s.io/klog/v2 v2.10.0 + k8s.io/klog/v2 v2.20.0 k8s.io/kubectl v0.22.1 k8s.io/kubernetes v1.21.3 sigs.k8s.io/sig-storage-lib-external-provisioner/v6 v6.3.0 @@ -126,7 +126,7 @@ require ( github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/go-fonts/liberation v0.1.1 // indirect github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07 // indirect - github.com/go-logr/logr v0.4.0 // indirect + github.com/go-logr/logr v1.0.0 // indirect github.com/go-ole/go-ole v1.2.5 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect diff --git a/go.sum b/go.sum index bca11cfce877..1b3819242a61 100644 --- a/go.sum +++ b/go.sum @@ -428,8 +428,9 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.0.0 h1:kH951GinvFVaQgy/ki/B3YYmQtRpExGigSJg6O8z5jo= +github.com/go-logr/logr v1.0.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= @@ -1774,8 +1775,8 @@ k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.3.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.10.0 h1:R2HDMDJsHVTHA2n4RjwbeYXdOcBymXdX/JRb1v0VGhE= -k8s.io/klog/v2 v2.10.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.20.0 h1:tlyxlSvd63k7axjhuchckaRJm+a92z5GSOrTOQY5sHw= +k8s.io/klog/v2 v2.20.0/go.mod h1:Gm8eSIfQN6457haJuPaMxZw4wyP5k+ykPFlrhQDvhvw= k8s.io/kube-aggregator v0.21.2/go.mod h1:7NgmUXJziySAJ7GxMRBBwcJay7MLUoxms31fw/ICpYk= k8s.io/kube-controller-manager v0.21.2/go.mod h1:gu0rV2UWy1k05E3kZxJFQE1F7RR1PZlq83+9J+lWlno= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0= From 98fc1c369dd405743e754f4d7749e8a665d747b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Sep 2021 18:32:13 +0000 Subject: [PATCH 062/201] Bump cloud.google.com/go/storage from 1.15.0 to 1.16.1 Bumps [cloud.google.com/go/storage](https://github.com/googleapis/google-cloud-go) from 1.15.0 to 1.16.1. - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/master/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/pubsub/v1.15.0...storage/v1.16.1) --- updated-dependencies: - dependency-name: cloud.google.com/go/storage dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 18 +++++++++--------- go.sum | 54 ++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index 50f599c3bfc8..1363be521b4f 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module k8s.io/minikube go 1.17 require ( - cloud.google.com/go/storage v1.15.0 + cloud.google.com/go/storage v1.16.1 contrib.go.opencensus.io/exporter/stackdriver v0.12.1 github.com/Delta456/box-cli-maker/v2 v2.2.2 github.com/GoogleCloudPlatform/docker-credential-gcr v0.0.0-20210713212222-faed5e8b8ca2 @@ -80,13 +80,13 @@ require ( golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 golang.org/x/exp v0.0.0-20210220032938-85be41e4509f golang.org/x/mod v0.5.0 - golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 + golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf golang.org/x/term v0.0.0-20210406210042-72f3dc4e9b72 golang.org/x/text v0.3.7 gonum.org/v1/plot v0.9.0 - google.golang.org/api v0.52.0 + google.golang.org/api v0.54.0 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.22.1 @@ -99,7 +99,10 @@ require ( ) require ( - cloud.google.com/go v0.88.0 // indirect + cloud.google.com/go v0.93.3 // indirect + cloud.google.com/go/container v0.1.0 // indirect + cloud.google.com/go/monitoring v0.1.0 // indirect + cloud.google.com/go/trace v0.1.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd // indirect github.com/Microsoft/go-winio v0.5.0 // indirect @@ -146,7 +149,6 @@ require ( github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/json-iterator/go v1.1.11 // indirect - github.com/jstemmer/go-junit-report v0.9.1 // indirect github.com/klauspost/compress v1.13.0 // indirect github.com/magiconair/properties v1.8.5 // indirect github.com/mattn/go-colorable v0.1.8 // indirect @@ -188,14 +190,12 @@ require ( go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.17.0 // indirect golang.org/x/image v0.0.0-20210216034530-4410531fe030 // indirect - golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect golang.org/x/net v0.0.0-20210525063256-abc453219eb5 // indirect golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect - golang.org/x/tools v0.1.5 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20210722135532-667f2b7c528f // indirect - google.golang.org/grpc v1.39.0 // indirect + google.golang.org/genproto v0.0.0-20210825212027-de86158e7fda // indirect + google.golang.org/grpc v1.40.0 // indirect google.golang.org/protobuf v1.27.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.62.0 // indirect diff --git a/go.sum b/go.sum index bca11cfce877..7b0de6dfcc55 100644 --- a/go.sum +++ b/go.sum @@ -24,17 +24,26 @@ cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.88.0 h1:MZ2cf9Elnv1wqccq8ooKO2MqHQLc+ChCp/+QWObCpxg= -cloud.google.com/go v0.88.0/go.mod h1:dnKwfYbP9hQhefiUvpbcAyoGSHUrOxR20JVElLiUvEY= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.92.1/go.mod h1:cMc7asehN84LBi1JGTHo4n8wuaGuNAZ7lR7b1YNJBrE= +cloud.google.com/go v0.92.2/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.92.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.93.3 h1:wPBktZFzYBcCZVARvwVKqH1uEj+aLXofJEtrb4oOsio= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/container v0.1.0 h1:TcvimswG10seya10bbp4Ai4aGJuzUnhSuoOcaPu9UNI= +cloud.google.com/go/container v0.1.0/go.mod h1:1rrp90HFUViXnpvafHiTaaAxNscrHiFgfUCEiEHBlEk= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/monitoring v0.1.0 h1:vssDZ792skH6AWCDH1OogKfs/FzgEVTB/yUAzfgBR24= +cloud.google.com/go/monitoring v0.1.0/go.mod h1:Hpm3XfzJv+UTiXzCG5Ffp0wijzHTC7Cv4eR7o3x/fEE= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -44,8 +53,10 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.15.0 h1:Ljj+ZXVEhCr/1+4ZhvtteN1ND7UUsNTlduGclLh8GO0= -cloud.google.com/go/storage v1.15.0/go.mod h1:mjjQMoxxyGH7Jr8K5qrx6N2O0AHsczI61sMNn03GIZI= +cloud.google.com/go/storage v1.16.1 h1:sMEIc4wxvoY3NXG7Rn9iP7jb/2buJgWR1vNXCR/UPfs= +cloud.google.com/go/storage v1.16.1/go.mod h1:LaNorbty3ehnU3rEjXSNV/NRgQA0O8Y+uh6bPe5UOk4= +cloud.google.com/go/trace v0.1.0 h1:nUGUK79FOkN0UGUXhBmVBkbu1PYsHe0YyFSPLOD9Npg= +cloud.google.com/go/trace v0.1.0/go.mod h1:wxEwsoeRVPbeSkt7ZC9nWCgmoKQRAoySN7XHW2AmI7g= contrib.go.opencensus.io/exporter/stackdriver v0.12.1 h1:Dll2uFfOVI3fa8UzsHyP6z0M6fEc9ZTAMo+Y3z282Xg= contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= @@ -576,7 +587,9 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210715191844-86eeefc3e471/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210804190019-f964ff605595/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/slowjam v1.0.0 h1:dA9flW4oGTJcSy8FpEvdq8JKwPFVgqYwMmjhqlb2L+s= @@ -694,7 +707,6 @@ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -1236,7 +1248,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -1326,10 +1337,10 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 h1:3B43BWw0xEBsLZ/NO1VALz6fppU3481pik+2Ksv45z8= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a h1:4Kd8OPUx1xgUwrHDaviWZO8MsgoZTZYC3g+8m16RBww= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1432,7 +1443,6 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1440,6 +1450,7 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -1532,7 +1543,6 @@ golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1574,12 +1584,12 @@ google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjR google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.45.0/go.mod h1:ISLIJCedJolbZvDfAk+Ctuq5hf+aJ33WgtUsfyFoLXA= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.52.0 h1:m5FLEd6dp5CU1F0tMWyqDi2XjchviIz8ntzOSz7w8As= -google.golang.org/api v0.52.0/go.mod h1:Him/adpjt0sxtkWViy0b6xyKW/SD71CwdJ7HqJo7SrU= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0 h1:ECJUVngj71QI6XEm7b1sAf8BljU5inEhMbKPR8Lxhhk= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1635,16 +1645,18 @@ google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210413151531-c14fb6ef47c3/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210420162539-3c870d7478d2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210721163202-f1cecdd8b78a/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210722135532-667f2b7c528f h1:YORWxaStkWBnWgELOHTmDrqNlFXuVGEbhwbB5iK94bQ= -google.golang.org/genproto v0.0.0-20210722135532-667f2b7c528f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210825212027-de86158e7fda h1:iT5uhT54PtbqUsWddv/nnEWdE5e/MTr+Nv3vjxlBP1A= +google.golang.org/genproto v0.0.0-20210825212027-de86158e7fda/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -1672,8 +1684,10 @@ google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0 h1:Klz8I9kdtkIN6EpHHUOMLCYhTn/2WAe5a0s1hcBkdTI= google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= From 0e7ed89e6fde2e2701608e38332dabb9710120a2 Mon Sep 17 00:00:00 2001 From: Toshiaki Inukai Date: Wed, 8 Sep 2021 04:36:11 +0000 Subject: [PATCH 063/201] Add an issue template for Japanese --- .github/ISSUE_TEMPLATE/ja.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/ja.md diff --git a/.github/ISSUE_TEMPLATE/ja.md b/.github/ISSUE_TEMPLATE/ja.md new file mode 100644 index 000000000000..bbf5d32b6c60 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/ja.md @@ -0,0 +1,20 @@ +--- +name: 日本語 +about: 問題の報告 +labels: l/ja +--- + +**問題を再現するための手順:** + +1. +2. +3. + +**`minikube logs --file=logs.txt` を実行して、このissueにログファイルをドラッグ&ドロップしてください** + + +**`minikube start` ではない場合は、失敗したコマンドの全出力:** +
+ + +
From bffe7c4a60071e76cf698219b6e7e7a077aeb55c Mon Sep 17 00:00:00 2001 From: Hiroya Onoe Date: Wed, 8 Sep 2021 22:00:16 +0900 Subject: [PATCH 064/201] Remove quotes from fields of Windows Installer --- installers/windows/minikube.nsi | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/installers/windows/minikube.nsi b/installers/windows/minikube.nsi index 03fe6d5220c0..941037b8a808 100644 --- a/installers/windows/minikube.nsi +++ b/installers/windows/minikube.nsi @@ -142,11 +142,11 @@ Section "Install" WriteRegStr HKLM "${UNINSTALLDIR}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" WriteRegStr HKLM "${UNINSTALLDIR}" "InstallLocation" "$\"$INSTDIR$\"" WriteRegStr HKLM "${UNINSTALLDIR}" "DisplayIcon" "$\"$INSTDIR\logo.ico$\"" - WriteRegStr HKLM "${UNINSTALLDIR}" "Publisher" "$\"${COMPANYNAME}$\"" - WriteRegStr HKLM "${UNINSTALLDIR}" "HelpLink" "$\"${HELPURL}$\"" - WriteRegStr HKLM "${UNINSTALLDIR}" "URLUpdateInfo" "$\"${UPDATEURL}$\"" - WriteRegStr HKLM "${UNINSTALLDIR}" "URLInfoAbout" "$\"${ABOUTURL}$\"" - WriteRegStr HKLM "${UNINSTALLDIR}" "DisplayVersion" "$\"${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONBUILD}$\"" + WriteRegStr HKLM "${UNINSTALLDIR}" "Publisher" "${COMPANYNAME}" + WriteRegStr HKLM "${UNINSTALLDIR}" "HelpLink" "${HELPURL}" + WriteRegStr HKLM "${UNINSTALLDIR}" "URLUpdateInfo" "${UPDATEURL}" + WriteRegStr HKLM "${UNINSTALLDIR}" "URLInfoAbout" "${ABOUTURL}" + WriteRegStr HKLM "${UNINSTALLDIR}" "DisplayVersion" "${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONBUILD}" WriteRegDWORD HKLM "${UNINSTALLDIR}" "VersionMajor" ${VERSIONMAJOR} WriteRegDWORD HKLM "${UNINSTALLDIR}" "VersionMinor" ${VERSIONMINOR} From aaaf0ceb1cf811634bda23482d498ab6628ccb8d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Sep 2021 17:08:00 +0000 Subject: [PATCH 065/201] Bump google.golang.org/api from 0.52.0 to 0.56.0 Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.52.0 to 0.56.0. - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/master/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.52.0...v0.56.0) --- updated-dependencies: - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 8 ++++---- go.sum | 13 +++++++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index caecd3bb5991..89e2db2f7244 100644 --- a/go.mod +++ b/go.mod @@ -80,13 +80,13 @@ require ( golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 golang.org/x/exp v0.0.0-20210220032938-85be41e4509f golang.org/x/mod v0.5.0 - golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a + golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf golang.org/x/term v0.0.0-20210406210042-72f3dc4e9b72 golang.org/x/text v0.3.7 gonum.org/v1/plot v0.9.0 - google.golang.org/api v0.54.0 + google.golang.org/api v0.56.0 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.22.1 @@ -138,7 +138,7 @@ require ( github.com/golang/snappy v0.0.3 // indirect github.com/google/go-querystring v1.0.0 // indirect github.com/google/gofuzz v1.1.0 // indirect - github.com/googleapis/gax-go/v2 v2.0.5 // indirect + github.com/googleapis/gax-go/v2 v2.1.0 // indirect github.com/googleapis/gnostic v0.4.1 // indirect github.com/gookit/color v1.4.2 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -194,7 +194,7 @@ require ( golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20210825212027-de86158e7fda // indirect + google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71 // indirect google.golang.org/grpc v1.40.0 // indirect google.golang.org/protobuf v1.27.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index ab4591a4b182..9d117ae47704 100644 --- a/go.sum +++ b/go.sum @@ -602,8 +602,9 @@ github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0 h1:6DWmvNpomjL1+3liNSZbVns3zsYzzCjm6pRBO1tLeso= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleinterns/cloud-operations-api-mock v0.0.0-20200709193332-a1e58c29bdd3 h1:eHv/jVY/JNop1xg2J9cBb4EzyMpWZoNCP1BslSAIkOI= @@ -1340,8 +1341,9 @@ golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a h1:4Kd8OPUx1xgUwrHDaviWZO8MsgoZTZYC3g+8m16RBww= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f h1:Qmd2pbz05z7z6lm0DrgQVVPuBm92jqujBKMHMOlOQEw= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1589,8 +1591,9 @@ google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59t google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0 h1:ECJUVngj71QI6XEm7b1sAf8BljU5inEhMbKPR8Lxhhk= google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.56.0 h1:08F9XVYTLOGeSQb3xI9C0gXMuQanhdGed0cWFhDozbI= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1656,8 +1659,10 @@ google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210825212027-de86158e7fda h1:iT5uhT54PtbqUsWddv/nnEWdE5e/MTr+Nv3vjxlBP1A= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210825212027-de86158e7fda/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71 h1:z+ErRPu0+KS02Td3fOAgdX+lnPDh/VyaABEJPD4JRQs= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= From 48eed2aebc9035054975701ffd9155f7323a618d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Sep 2021 17:08:53 +0000 Subject: [PATCH 066/201] Bump github.com/hashicorp/go-getter from 1.5.7 to 1.5.8 Bumps [github.com/hashicorp/go-getter](https://github.com/hashicorp/go-getter) from 1.5.7 to 1.5.8. - [Release notes](https://github.com/hashicorp/go-getter/releases) - [Changelog](https://github.com/hashicorp/go-getter/blob/main/.goreleaser.yml) - [Commits](https://github.com/hashicorp/go-getter/compare/v1.5.7...v1.5.8) --- updated-dependencies: - dependency-name: github.com/hashicorp/go-getter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index caecd3bb5991..5ad215120552 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/google/go-github/v36 v36.0.0 github.com/google/slowjam v1.0.0 github.com/google/uuid v1.3.0 - github.com/hashicorp/go-getter v1.5.7 + github.com/hashicorp/go-getter v1.5.8 github.com/hashicorp/go-retryablehttp v0.7.0 github.com/hashicorp/golang-lru v0.5.3 // indirect github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95 // indirect diff --git a/go.sum b/go.sum index ab4591a4b182..e42e98e499a0 100644 --- a/go.sum +++ b/go.sum @@ -635,8 +635,8 @@ github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brv github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.5.7 h1:HBLsom8eGHLxj78ta+/MVSyct8KWG4B4z6lhBA4vJcg= -github.com/hashicorp/go-getter v1.5.7/go.mod h1:BrrV/1clo8cCYu6mxvboYg+KutTiFnXjMEgDD8+i7ZI= +github.com/hashicorp/go-getter v1.5.8 h1:qx5CZXxXz5YFpALPkbf/F1iZZoRE+f6T1i/AWw/Zkic= +github.com/hashicorp/go-getter v1.5.8/go.mod h1:BrrV/1clo8cCYu6mxvboYg+KutTiFnXjMEgDD8+i7ZI= github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= From 20b5900deb99aed5fbd9993de55447a8546874ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Sep 2021 17:09:06 +0000 Subject: [PATCH 067/201] Bump github.com/shirou/gopsutil/v3 from 3.21.7 to 3.21.8 Bumps [github.com/shirou/gopsutil/v3](https://github.com/shirou/gopsutil) from 3.21.7 to 3.21.8. - [Release notes](https://github.com/shirou/gopsutil/releases) - [Commits](https://github.com/shirou/gopsutil/compare/v3.21.7...v3.21.8) --- updated-dependencies: - dependency-name: github.com/shirou/gopsutil/v3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 6 +++--- go.sum | 13 +++++++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index caecd3bb5991..6c6b9651fb26 100644 --- a/go.mod +++ b/go.mod @@ -66,7 +66,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 github.com/russross/blackfriday v1.5.3-0.20200218234912-41c5fccfd6f6 // indirect github.com/samalba/dockerclient v0.0.0-20160414174713-91d7393ff859 // indirect - github.com/shirou/gopsutil/v3 v3.21.7 + github.com/shirou/gopsutil/v3 v3.21.8 github.com/spf13/cobra v1.2.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.8.1 @@ -179,8 +179,8 @@ require ( github.com/spf13/cast v1.3.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect - github.com/tklauser/go-sysconf v0.3.7 // indirect - github.com/tklauser/numcpus v0.2.3 // indirect + github.com/tklauser/go-sysconf v0.3.9 // indirect + github.com/tklauser/numcpus v0.3.0 // indirect github.com/ulikunitz/xz v0.5.8 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect diff --git a/go.sum b/go.sum index ab4591a4b182..8a6750543dc0 100644 --- a/go.sum +++ b/go.sum @@ -1023,8 +1023,8 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shirou/gopsutil/v3 v3.21.7 h1:PnTqQamUjwEDSgn+nBGu0qSDV/CfvyiR/gwTH3i7HTU= -github.com/shirou/gopsutil/v3 v3.21.7/go.mod h1:RGl11Y7XMTQPmHh8F0ayC6haKNBgH4PXMJuTAcMOlz4= +github.com/shirou/gopsutil/v3 v3.21.8 h1:nKct+uP0TV8DjjNiHanKf8SAuub+GNsbrOtM9Nl9biA= +github.com/shirou/gopsutil/v3 v3.21.8/go.mod h1:YWp/H8Qs5fVmf17v7JNZzA0mPJ+mS2e9JdiUF9LlKzQ= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -1092,10 +1092,10 @@ github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cb github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/thecodeteam/goscaleio v0.1.0/go.mod h1:68sdkZAsK8bvEwBlbQnlLS+xU+hvLYM/iQ8KXej1AwM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tklauser/go-sysconf v0.3.7 h1:HT7h4+536gjqeq1ZIJPgOl1rg1XFatQGVZWp7Py53eg= -github.com/tklauser/go-sysconf v0.3.7/go.mod h1:JZIdXh4RmBvZDBZ41ld2bGxRV3n4daiiqA3skYhAoQ4= -github.com/tklauser/numcpus v0.2.3 h1:nQ0QYpiritP6ViFhrKYsiv6VVxOpum2Gks5GhnJbS/8= -github.com/tklauser/numcpus v0.2.3/go.mod h1:vpEPS/JC+oZGGQ/My/vJnNsvMDQL6PwOqt8dsCw5j+E= +github.com/tklauser/go-sysconf v0.3.9 h1:JeUVdAOWhhxVcU6Eqr/ATFHgXk/mmiItdKeJPev3vTo= +github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= +github.com/tklauser/numcpus v0.3.0 h1:ILuRUQBtssgnxw0XXIjKUC56fgnOrFoQQ/4+DeU2biQ= +github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= @@ -1452,6 +1452,7 @@ golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= From 3b902613668a41b8677de37458a7393c42994700 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Sep 2021 17:09:13 +0000 Subject: [PATCH 068/201] Bump github.com/mattn/go-isatty from 0.0.13 to 0.0.14 Bumps [github.com/mattn/go-isatty](https://github.com/mattn/go-isatty) from 0.0.13 to 0.0.14. - [Release notes](https://github.com/mattn/go-isatty/releases) - [Commits](https://github.com/mattn/go-isatty/compare/v0.0.13...v0.0.14) --- updated-dependencies: - dependency-name: github.com/mattn/go-isatty dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index caecd3bb5991..51dbf25e8a8f 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,7 @@ require ( github.com/libvirt/libvirt-go v3.9.0+incompatible github.com/machine-drivers/docker-machine-driver-vmware v0.1.3 github.com/mattbaird/jsonpatch v0.0.0-20200820163806-098863c1fc24 - github.com/mattn/go-isatty v0.0.13 + github.com/mattn/go-isatty v0.0.14 github.com/mitchellh/go-ps v1.0.0 github.com/moby/hyperkit v0.0.0-20210108224842-2f061e447e14 github.com/moby/sys/mount v0.2.0 // indirect diff --git a/go.sum b/go.sum index ab4591a4b182..ed983d793087 100644 --- a/go.sum +++ b/go.sum @@ -801,8 +801,8 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= From 9d940e234f78c082bde2369b816eeaed8fa912a6 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Wed, 8 Sep 2021 12:19:48 -0700 Subject: [PATCH 069/201] ask user for config values even if already set --- cmd/minikube/cmd/config/configure.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/cmd/minikube/cmd/config/configure.go b/cmd/minikube/cmd/config/configure.go index cfa7dc7a7962..54b2d0df2619 100644 --- a/cmd/minikube/cmd/config/configure.go +++ b/cmd/minikube/cmd/config/configure.go @@ -199,13 +199,9 @@ var addonsConfigureCmd = &cobra.Command{ return net.ParseIP(s) != nil } - if cfg.KubernetesConfig.LoadBalancerStartIP == "" { - cfg.KubernetesConfig.LoadBalancerStartIP = AskForStaticValidatedValue("-- Enter Load Balancer Start IP: ", validator) - } + cfg.KubernetesConfig.LoadBalancerStartIP = AskForStaticValidatedValue("-- Enter Load Balancer Start IP: ", validator) - if cfg.KubernetesConfig.LoadBalancerEndIP == "" { - cfg.KubernetesConfig.LoadBalancerEndIP = AskForStaticValidatedValue("-- Enter Load Balancer End IP: ", validator) - } + cfg.KubernetesConfig.LoadBalancerEndIP = AskForStaticValidatedValue("-- Enter Load Balancer End IP: ", validator) if err := config.SaveProfile(profile, cfg); err != nil { out.ErrT(style.Fatal, "Failed to save config {{.profile}}", out.V{"profile": profile}) From 45512683280615534a0cb0a0fbf804e0ebfa6bab Mon Sep 17 00:00:00 2001 From: Jayesh Srivastava Date: Thu, 9 Sep 2021 03:51:52 +0530 Subject: [PATCH 070/201] Update functional_test.go --- test/integration/functional_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/functional_test.go b/test/integration/functional_test.go index 0e011303726c..998320b4bec5 100644 --- a/test/integration/functional_test.go +++ b/test/integration/functional_test.go @@ -2137,7 +2137,7 @@ func validateVersionCmd(ctx context.Context, t *testing.T, profile string) { t.Errorf("error version: %v", err) } got := rr.Stdout.String() - for _, c := range []string{"buildctl", "commit", "containerd", "crictl", "crio", "ctr", "docker", "minikubeVersion", "podman", "run"} { + for _, c := range []string{"buildctl", "commit", "containerd", "crictl", "crio", "ctr", "docker", "minikubeVersion", "podman", "run", "crun"} { if !strings.Contains(got, c) { t.Errorf("expected to see %q in the minikube version --components but got:\n%s", c, got) } From d3d4f74d8a4c32ff6d25e2b471f0f45d2857ba01 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Wed, 8 Sep 2021 17:14:01 -0700 Subject: [PATCH 071/201] filter out arm64 and macOS from flake reports --- hack/jenkins/test-flake-chart/report_flakes.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hack/jenkins/test-flake-chart/report_flakes.sh b/hack/jenkins/test-flake-chart/report_flakes.sh index e47a49a52e71..de43cf3d1ca7 100755 --- a/hack/jenkins/test-flake-chart/report_flakes.sh +++ b/hack/jenkins/test-flake-chart/report_flakes.sh @@ -85,6 +85,10 @@ awk -F, 'NR>1 { | sort -g -t, -k2,2 \ >> "$TMP_FAILED_RATES" +# Filter out arm64 and macOS tests until they're more stable +grep -v arm64 "$TMP_FAILED_RATES" > "$TMP_FAILED_RATES" +grep -v macOS ""$TMP_FAILED_RATES" > ""$TMP_FAILED_RATES" + FAILED_RATES_LINES=$(wc -l < "$TMP_FAILED_RATES") if [[ "$FAILED_RATES_LINES" -eq 0 ]]; then echo "No failed tests! Aborting without commenting..." 1>&2 From 19979951323ae33312803ef393145bad46a0b944 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Wed, 8 Sep 2021 17:19:06 -0700 Subject: [PATCH 072/201] syntax --- hack/jenkins/test-flake-chart/report_flakes.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/jenkins/test-flake-chart/report_flakes.sh b/hack/jenkins/test-flake-chart/report_flakes.sh index de43cf3d1ca7..3b1066438530 100755 --- a/hack/jenkins/test-flake-chart/report_flakes.sh +++ b/hack/jenkins/test-flake-chart/report_flakes.sh @@ -87,7 +87,7 @@ awk -F, 'NR>1 { # Filter out arm64 and macOS tests until they're more stable grep -v arm64 "$TMP_FAILED_RATES" > "$TMP_FAILED_RATES" -grep -v macOS ""$TMP_FAILED_RATES" > ""$TMP_FAILED_RATES" +grep -v macOS "$TMP_FAILED_RATES" > "$TMP_FAILED_RATES" FAILED_RATES_LINES=$(wc -l < "$TMP_FAILED_RATES") if [[ "$FAILED_RATES_LINES" -eq 0 ]]; then From 9446725acd442185bf0fc6c427d3ebf87954d1ea Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 9 Sep 2021 10:16:13 -0700 Subject: [PATCH 073/201] fix bash syntax for filtering --- hack/jenkins/test-flake-chart/report_flakes.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hack/jenkins/test-flake-chart/report_flakes.sh b/hack/jenkins/test-flake-chart/report_flakes.sh index 3b1066438530..e5a54fc3acd5 100755 --- a/hack/jenkins/test-flake-chart/report_flakes.sh +++ b/hack/jenkins/test-flake-chart/report_flakes.sh @@ -86,10 +86,10 @@ awk -F, 'NR>1 { >> "$TMP_FAILED_RATES" # Filter out arm64 and macOS tests until they're more stable -grep -v arm64 "$TMP_FAILED_RATES" > "$TMP_FAILED_RATES" -grep -v macOS "$TMP_FAILED_RATES" > "$TMP_FAILED_RATES" +TMP_FAILED_RATES_FILTERED=$(mktemp) +grep -v "arm64\|macOS" "$TMP_FAILED_RATES" > "$TMP_FAILED_RATES_FILTERED" -FAILED_RATES_LINES=$(wc -l < "$TMP_FAILED_RATES") +FAILED_RATES_LINES=$(wc -l < "$TMP_FAILED_RATES_FILTERED") if [[ "$FAILED_RATES_LINES" -eq 0 ]]; then echo "No failed tests! Aborting without commenting..." 1>&2 exit 0 @@ -106,7 +106,7 @@ TEST_GOPOGH_LINK_FORMAT='https://storage.googleapis.com/minikube-builds/logs/'${ # 1) Get the first $MAX_REPORTED_TESTS lines. # 2) Print a row in the table with the environment, test name, flake rate, and a link to the flake chart for that test. # 3) Append these rows to file $TMP_COMMENT. -head -n "$MAX_REPORTED_TESTS" "$TMP_FAILED_RATES" \ +head -n "$MAX_REPORTED_TESTS" "$TMP_FAILED_RATES_FILTERED" \ | awk '-F[:,]' '{ if ($3 != "n/a") { rate_text = sprintf("%3$s ([chart]('$TEST_CHART_LINK_FORMAT'))", $1, $2, $3) From 96923883e7caf262a5d3bd8971fc41735a2fc6f2 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 9 Sep 2021 13:47:01 -0700 Subject: [PATCH 074/201] fixes for ingress --- cmd/minikube/cmd/config/enable.go | 2 +- deploy/addons/ingress/ingress-deploy.yaml.tmpl | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/minikube/cmd/config/enable.go b/cmd/minikube/cmd/config/enable.go index 801e64ec3b7f..95de9a92f21f 100644 --- a/cmd/minikube/cmd/config/enable.go +++ b/cmd/minikube/cmd/config/enable.go @@ -64,7 +64,7 @@ var addonsEnableCmd = &cobra.Command{ `, out.V{"profileArg": tipProfileArg}) } - if err != nil { + if err == nil { out.Step(style.AddonEnable, "The '{{.addonName}}' addon is enabled", out.V{"addonName": addon}) } }, diff --git a/deploy/addons/ingress/ingress-deploy.yaml.tmpl b/deploy/addons/ingress/ingress-deploy.yaml.tmpl index bbc2965fe5f0..5f85604d02f1 100644 --- a/deploy/addons/ingress/ingress-deploy.yaml.tmpl +++ b/deploy/addons/ingress/ingress-deploy.yaml.tmpl @@ -225,6 +225,7 @@ rules: - configmaps verbs: - create + - update - apiGroups: - '' resources: From 94891b4704441ab09a515f5c5d0b25f4b08480e6 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 9 Sep 2021 13:47:50 -0700 Subject: [PATCH 075/201] add windows to list --- hack/jenkins/test-flake-chart/report_flakes.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hack/jenkins/test-flake-chart/report_flakes.sh b/hack/jenkins/test-flake-chart/report_flakes.sh index e5a54fc3acd5..eb0aeacd0485 100755 --- a/hack/jenkins/test-flake-chart/report_flakes.sh +++ b/hack/jenkins/test-flake-chart/report_flakes.sh @@ -85,9 +85,9 @@ awk -F, 'NR>1 { | sort -g -t, -k2,2 \ >> "$TMP_FAILED_RATES" -# Filter out arm64 and macOS tests until they're more stable +# Filter out arm64, macOS and windows tests until they're more stable TMP_FAILED_RATES_FILTERED=$(mktemp) -grep -v "arm64\|macOS" "$TMP_FAILED_RATES" > "$TMP_FAILED_RATES_FILTERED" +grep -v "arm64\|macOS\|Windows" "$TMP_FAILED_RATES" > "$TMP_FAILED_RATES_FILTERED" FAILED_RATES_LINES=$(wc -l < "$TMP_FAILED_RATES_FILTERED") if [[ "$FAILED_RATES_LINES" -eq 0 ]]; then From 3636e35098e58bcb049f424836a392a024264a5b Mon Sep 17 00:00:00 2001 From: Joel Jeremy Marquez Date: Fri, 10 Sep 2021 19:42:15 +0800 Subject: [PATCH 076/201] Fix ingress-controller-leader configmap resource name --- deploy/addons/ingress/ingress-deploy.yaml.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/addons/ingress/ingress-deploy.yaml.tmpl b/deploy/addons/ingress/ingress-deploy.yaml.tmpl index bbc2965fe5f0..1d58d862c38f 100644 --- a/deploy/addons/ingress/ingress-deploy.yaml.tmpl +++ b/deploy/addons/ingress/ingress-deploy.yaml.tmpl @@ -215,7 +215,7 @@ rules: resources: - configmaps resourceNames: - - ingress-controller-leader-nginx + - ingress-controller-leader verbs: - get - update From 18df54221d945b3470508865494ea08ae8e74113 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Fri, 10 Sep 2021 16:00:17 -0700 Subject: [PATCH 077/201] change test names to fix flake reports --- test/integration/pkg_install_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/integration/pkg_install_test.go b/test/integration/pkg_install_test.go index ca500e41a4ab..ee300730550a 100644 --- a/test/integration/pkg_install_test.go +++ b/test/integration/pkg_install_test.go @@ -24,6 +24,7 @@ import ( "os/exec" "path/filepath" "runtime" + "strings" "testing" ) @@ -67,7 +68,7 @@ func TestDebPackageInstall(t *testing.T) { for _, distro := range distros { distroImg := distro - testName := fmt.Sprintf("install_%s_%s", runtime.GOARCH, distroImg) + testName := fmt.Sprintf("install_%s_%s", runtime.GOARCH, strings.ReplaceAll(distroImg, ":", "_")) t.Run(testName, func(t *testing.T) { // apt-get update; dpkg -i minikube_${ver}_${arch}.deb t.Run("minikube", func(t *testing.T) { From f882135b54f95787e3d7b16bf2cbda905b6889e8 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 13 Sep 2021 10:02:11 +0000 Subject: [PATCH 078/201] bump golaint versions --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 64d313a710e3..0ce4cad8e237 100644 --- a/Makefile +++ b/Makefile @@ -72,7 +72,7 @@ MINIKUBE_RELEASES_URL=https://github.com/kubernetes/minikube/releases/download KERNEL_VERSION ?= 4.19.202 # latest from https://github.com/golangci/golangci-lint/releases # update this only by running `make update-golint-version` -GOLINT_VERSION ?= v1.42.0 +GOLINT_VERSION ?= v1.42.1 # Limit number of default jobs, to avoid the CI builds running out of memory GOLINT_JOBS ?= 4 # see https://github.com/golangci/golangci-lint#memory-usage-of-golangci-lint From 145f9fc9ab4d98db40b58b6512a0aa7ed8d81d14 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Mon, 13 Sep 2021 11:58:43 -0700 Subject: [PATCH 079/201] run `go fmt` --- cmd/drivers/hyperkit/main.go | 1 + cmd/drivers/kvm/main-nolinux.go | 1 + cmd/drivers/kvm/main.go | 1 + pkg/drivers/hyperkit/driver.go | 1 + pkg/drivers/hyperkit/driver_test.go | 1 + pkg/drivers/hyperkit/network.go | 1 + pkg/drivers/hyperkit/network_test.go | 1 + pkg/drivers/hyperkit/vmnet.go | 1 + pkg/drivers/hyperkit/vmnet_stub.go | 1 + pkg/drivers/kic/oci/cgroups_linux.go | 1 + pkg/drivers/kic/oci/cgroups_other.go | 1 + pkg/drivers/kvm/disks.go | 1 + pkg/drivers/kvm/domain.go | 1 + pkg/drivers/kvm/domain_definition_arm64.go | 1 + pkg/drivers/kvm/domain_definition_x86.go | 1 + pkg/drivers/kvm/gpu.go | 1 + pkg/drivers/kvm/kvm.go | 1 + pkg/drivers/kvm/network.go | 1 + pkg/minikube/constants/constants_darwin.go | 3 ++- pkg/minikube/constants/constants_freebsd.go | 3 ++- pkg/minikube/constants/constants_gendocs.go | 1 + pkg/minikube/constants/constants_linux.go | 3 ++- pkg/minikube/constants/constants_windows.go | 3 ++- pkg/minikube/perf/logs_test.go | 1 + pkg/minikube/registry/drvs/hyperkit/hyperkit.go | 1 + pkg/minikube/registry/drvs/hyperkit/hyperkit_test.go | 1 + pkg/minikube/registry/drvs/hyperv/hyperv.go | 1 + pkg/minikube/registry/drvs/hyperv/powershell.go | 1 + pkg/minikube/registry/drvs/hyperv/vswitch.go | 1 + pkg/minikube/registry/drvs/kvm2/kvm2.go | 1 + pkg/minikube/registry/drvs/none/none.go | 1 + pkg/minikube/registry/drvs/parallels/parallels.go | 1 + pkg/minikube/registry/drvs/vmwarefusion/vmwarefusion.go | 1 + pkg/minikube/schedule/daemonize_unix.go | 1 + pkg/minikube/schedule/daemonize_windows.go | 1 + pkg/minikube/tunnel/route_darwin_test.go | 1 + pkg/minikube/tunnel/route_linux_test.go | 1 + pkg/minikube/tunnel/route_windows_test.go | 1 + test/integration/aaa_download_only_test.go | 1 + test/integration/aab_offline_test.go | 1 + test/integration/addons_test.go | 1 + test/integration/cert_options_test.go | 1 + test/integration/docker_test.go | 1 + test/integration/error_spam_test.go | 1 + test/integration/functional_test.go | 1 + test/integration/functional_test_mount_test.go | 1 + test/integration/functional_test_pvc_test.go | 1 + test/integration/functional_test_tunnel_test.go | 1 + test/integration/guest_env_test.go | 1 + test/integration/gvisor_addon_test.go | 1 + test/integration/kic_custom_network_test.go | 1 + test/integration/multinode_test.go | 1 + test/integration/net_test.go | 1 + test/integration/none_test.go | 4 ++-- test/integration/pause_test.go | 1 + test/integration/pkg_install_test.go | 1 + test/integration/preload_test.go | 1 + test/integration/scheduled_stop_test.go | 1 + test/integration/skaffold_test.go | 1 + test/integration/start_stop_delete_test.go | 1 + test/integration/status_test.go | 1 + 61 files changed, 66 insertions(+), 6 deletions(-) diff --git a/cmd/drivers/hyperkit/main.go b/cmd/drivers/hyperkit/main.go index ca8f90ce6a48..c281bffb143f 100644 --- a/cmd/drivers/hyperkit/main.go +++ b/cmd/drivers/hyperkit/main.go @@ -1,3 +1,4 @@ +//go:build darwin && !arm64 // +build darwin,!arm64 /* diff --git a/cmd/drivers/kvm/main-nolinux.go b/cmd/drivers/kvm/main-nolinux.go index 8e466cd8e8ac..68567605e329 100644 --- a/cmd/drivers/kvm/main-nolinux.go +++ b/cmd/drivers/kvm/main-nolinux.go @@ -1,3 +1,4 @@ +//go:build !linux // +build !linux /* diff --git a/cmd/drivers/kvm/main.go b/cmd/drivers/kvm/main.go index 455404b7c2ef..579138eb4b9d 100644 --- a/cmd/drivers/kvm/main.go +++ b/cmd/drivers/kvm/main.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux /* diff --git a/pkg/drivers/hyperkit/driver.go b/pkg/drivers/hyperkit/driver.go index d074b490177f..3c908d6c75df 100644 --- a/pkg/drivers/hyperkit/driver.go +++ b/pkg/drivers/hyperkit/driver.go @@ -1,3 +1,4 @@ +//go:build darwin // +build darwin /* diff --git a/pkg/drivers/hyperkit/driver_test.go b/pkg/drivers/hyperkit/driver_test.go index 22d4ddbd39c0..40cbb6bdd0fd 100644 --- a/pkg/drivers/hyperkit/driver_test.go +++ b/pkg/drivers/hyperkit/driver_test.go @@ -1,3 +1,4 @@ +//go:build darwin // +build darwin /* diff --git a/pkg/drivers/hyperkit/network.go b/pkg/drivers/hyperkit/network.go index 2f5c46bfcbd1..445948c84755 100644 --- a/pkg/drivers/hyperkit/network.go +++ b/pkg/drivers/hyperkit/network.go @@ -1,3 +1,4 @@ +//go:build darwin // +build darwin /* diff --git a/pkg/drivers/hyperkit/network_test.go b/pkg/drivers/hyperkit/network_test.go index c8b6d1283a4b..4c6b27ac1f30 100644 --- a/pkg/drivers/hyperkit/network_test.go +++ b/pkg/drivers/hyperkit/network_test.go @@ -1,3 +1,4 @@ +//go:build darwin // +build darwin /* diff --git a/pkg/drivers/hyperkit/vmnet.go b/pkg/drivers/hyperkit/vmnet.go index fb1a7d02421a..8e3509f398df 100644 --- a/pkg/drivers/hyperkit/vmnet.go +++ b/pkg/drivers/hyperkit/vmnet.go @@ -1,3 +1,4 @@ +//go:build darwin && cgo // +build darwin,cgo /* diff --git a/pkg/drivers/hyperkit/vmnet_stub.go b/pkg/drivers/hyperkit/vmnet_stub.go index 6a9f93d7608f..ef4578d63471 100644 --- a/pkg/drivers/hyperkit/vmnet_stub.go +++ b/pkg/drivers/hyperkit/vmnet_stub.go @@ -1,3 +1,4 @@ +//go:build darwin && !cgo // +build darwin,!cgo /* diff --git a/pkg/drivers/kic/oci/cgroups_linux.go b/pkg/drivers/kic/oci/cgroups_linux.go index c56251fa18d8..3a2bb3c573a3 100644 --- a/pkg/drivers/kic/oci/cgroups_linux.go +++ b/pkg/drivers/kic/oci/cgroups_linux.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux /* diff --git a/pkg/drivers/kic/oci/cgroups_other.go b/pkg/drivers/kic/oci/cgroups_other.go index 7d91d8d2c345..1f856054f55f 100644 --- a/pkg/drivers/kic/oci/cgroups_other.go +++ b/pkg/drivers/kic/oci/cgroups_other.go @@ -1,3 +1,4 @@ +//go:build !linux // +build !linux /* diff --git a/pkg/drivers/kvm/disks.go b/pkg/drivers/kvm/disks.go index 10c9bd5025ae..dc684c0170aa 100644 --- a/pkg/drivers/kvm/disks.go +++ b/pkg/drivers/kvm/disks.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux /* diff --git a/pkg/drivers/kvm/domain.go b/pkg/drivers/kvm/domain.go index a19428cdf9ee..59be23761401 100644 --- a/pkg/drivers/kvm/domain.go +++ b/pkg/drivers/kvm/domain.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux /* diff --git a/pkg/drivers/kvm/domain_definition_arm64.go b/pkg/drivers/kvm/domain_definition_arm64.go index 721efbf61a61..676fa5b733d0 100644 --- a/pkg/drivers/kvm/domain_definition_arm64.go +++ b/pkg/drivers/kvm/domain_definition_arm64.go @@ -1,3 +1,4 @@ +//go:build linux && arm64 // +build linux,arm64 /* diff --git a/pkg/drivers/kvm/domain_definition_x86.go b/pkg/drivers/kvm/domain_definition_x86.go index 9e5c35f193f5..e10fc0c44194 100644 --- a/pkg/drivers/kvm/domain_definition_x86.go +++ b/pkg/drivers/kvm/domain_definition_x86.go @@ -1,3 +1,4 @@ +//go:build linux && amd64 // +build linux,amd64 /* diff --git a/pkg/drivers/kvm/gpu.go b/pkg/drivers/kvm/gpu.go index 2e2376f4942e..534c0d94d49e 100644 --- a/pkg/drivers/kvm/gpu.go +++ b/pkg/drivers/kvm/gpu.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux /* diff --git a/pkg/drivers/kvm/kvm.go b/pkg/drivers/kvm/kvm.go index 9d71ff6359c0..886e40152991 100644 --- a/pkg/drivers/kvm/kvm.go +++ b/pkg/drivers/kvm/kvm.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux /* diff --git a/pkg/drivers/kvm/network.go b/pkg/drivers/kvm/network.go index 1fdebd17f2de..0723948228d5 100644 --- a/pkg/drivers/kvm/network.go +++ b/pkg/drivers/kvm/network.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux /* diff --git a/pkg/minikube/constants/constants_darwin.go b/pkg/minikube/constants/constants_darwin.go index a10fe2be02bc..f59146093586 100644 --- a/pkg/minikube/constants/constants_darwin.go +++ b/pkg/minikube/constants/constants_darwin.go @@ -1,4 +1,5 @@ -// +build darwin, !gendocs +//go:build (darwin && ignore) || !gendocs +// +build darwin,ignore !gendocs /* Copyright 2016 The Kubernetes Authors All rights reserved. diff --git a/pkg/minikube/constants/constants_freebsd.go b/pkg/minikube/constants/constants_freebsd.go index 77a47a765f9e..c767e4b21e66 100644 --- a/pkg/minikube/constants/constants_freebsd.go +++ b/pkg/minikube/constants/constants_freebsd.go @@ -1,4 +1,5 @@ -// +build linux, !gendocs +//go:build (linux && ignore) || !gendocs +// +build linux,ignore !gendocs /* Copyright 2016 The Kubernetes Authors All rights reserved. diff --git a/pkg/minikube/constants/constants_gendocs.go b/pkg/minikube/constants/constants_gendocs.go index fae58648eba8..faf04f5265ba 100644 --- a/pkg/minikube/constants/constants_gendocs.go +++ b/pkg/minikube/constants/constants_gendocs.go @@ -1,3 +1,4 @@ +//go:build gendocs // +build gendocs /* diff --git a/pkg/minikube/constants/constants_linux.go b/pkg/minikube/constants/constants_linux.go index 77a47a765f9e..c767e4b21e66 100644 --- a/pkg/minikube/constants/constants_linux.go +++ b/pkg/minikube/constants/constants_linux.go @@ -1,4 +1,5 @@ -// +build linux, !gendocs +//go:build (linux && ignore) || !gendocs +// +build linux,ignore !gendocs /* Copyright 2016 The Kubernetes Authors All rights reserved. diff --git a/pkg/minikube/constants/constants_windows.go b/pkg/minikube/constants/constants_windows.go index da58387eb91f..c17278dab527 100644 --- a/pkg/minikube/constants/constants_windows.go +++ b/pkg/minikube/constants/constants_windows.go @@ -1,4 +1,5 @@ -// +build windows, !gendocs +//go:build (windows && ignore) || !gendocs +// +build windows,ignore !gendocs /* Copyright 2016 The Kubernetes Authors All rights reserved. diff --git a/pkg/minikube/perf/logs_test.go b/pkg/minikube/perf/logs_test.go index 65b2eae52fd9..31a8d8c9022a 100644 --- a/pkg/minikube/perf/logs_test.go +++ b/pkg/minikube/perf/logs_test.go @@ -1,3 +1,4 @@ +//go:build linux || darwin // +build linux darwin /* diff --git a/pkg/minikube/registry/drvs/hyperkit/hyperkit.go b/pkg/minikube/registry/drvs/hyperkit/hyperkit.go index 2f5fea101b25..3ac958c72e80 100644 --- a/pkg/minikube/registry/drvs/hyperkit/hyperkit.go +++ b/pkg/minikube/registry/drvs/hyperkit/hyperkit.go @@ -1,3 +1,4 @@ +//go:build darwin // +build darwin /* diff --git a/pkg/minikube/registry/drvs/hyperkit/hyperkit_test.go b/pkg/minikube/registry/drvs/hyperkit/hyperkit_test.go index 4e89276f9462..da59599c7b1a 100644 --- a/pkg/minikube/registry/drvs/hyperkit/hyperkit_test.go +++ b/pkg/minikube/registry/drvs/hyperkit/hyperkit_test.go @@ -1,3 +1,4 @@ +//go:build darwin // +build darwin /* diff --git a/pkg/minikube/registry/drvs/hyperv/hyperv.go b/pkg/minikube/registry/drvs/hyperv/hyperv.go index f8ce19f98fbf..f711c6c92bb5 100644 --- a/pkg/minikube/registry/drvs/hyperv/hyperv.go +++ b/pkg/minikube/registry/drvs/hyperv/hyperv.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows /* diff --git a/pkg/minikube/registry/drvs/hyperv/powershell.go b/pkg/minikube/registry/drvs/hyperv/powershell.go index e54e1686dd4e..10809aabb6ca 100644 --- a/pkg/minikube/registry/drvs/hyperv/powershell.go +++ b/pkg/minikube/registry/drvs/hyperv/powershell.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows /* diff --git a/pkg/minikube/registry/drvs/hyperv/vswitch.go b/pkg/minikube/registry/drvs/hyperv/vswitch.go index 012b169025c6..726a4c1a4d10 100644 --- a/pkg/minikube/registry/drvs/hyperv/vswitch.go +++ b/pkg/minikube/registry/drvs/hyperv/vswitch.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows /* diff --git a/pkg/minikube/registry/drvs/kvm2/kvm2.go b/pkg/minikube/registry/drvs/kvm2/kvm2.go index 73916e5f4952..7e071616f697 100644 --- a/pkg/minikube/registry/drvs/kvm2/kvm2.go +++ b/pkg/minikube/registry/drvs/kvm2/kvm2.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux /* diff --git a/pkg/minikube/registry/drvs/none/none.go b/pkg/minikube/registry/drvs/none/none.go index e2fcf11b0691..4bef620f089b 100644 --- a/pkg/minikube/registry/drvs/none/none.go +++ b/pkg/minikube/registry/drvs/none/none.go @@ -1,3 +1,4 @@ +//go:build linux // +build linux /* diff --git a/pkg/minikube/registry/drvs/parallels/parallels.go b/pkg/minikube/registry/drvs/parallels/parallels.go index a9b22ae36ab1..728da968b665 100644 --- a/pkg/minikube/registry/drvs/parallels/parallels.go +++ b/pkg/minikube/registry/drvs/parallels/parallels.go @@ -1,3 +1,4 @@ +//go:build darwin // +build darwin /* diff --git a/pkg/minikube/registry/drvs/vmwarefusion/vmwarefusion.go b/pkg/minikube/registry/drvs/vmwarefusion/vmwarefusion.go index d2197f077845..7c7e6304d528 100644 --- a/pkg/minikube/registry/drvs/vmwarefusion/vmwarefusion.go +++ b/pkg/minikube/registry/drvs/vmwarefusion/vmwarefusion.go @@ -1,3 +1,4 @@ +//go:build darwin // +build darwin /* diff --git a/pkg/minikube/schedule/daemonize_unix.go b/pkg/minikube/schedule/daemonize_unix.go index 96777a178b54..7c38e80ddb3a 100644 --- a/pkg/minikube/schedule/daemonize_unix.go +++ b/pkg/minikube/schedule/daemonize_unix.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows /* diff --git a/pkg/minikube/schedule/daemonize_windows.go b/pkg/minikube/schedule/daemonize_windows.go index d4660f6897dc..4b21455ba9f8 100644 --- a/pkg/minikube/schedule/daemonize_windows.go +++ b/pkg/minikube/schedule/daemonize_windows.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows /* diff --git a/pkg/minikube/tunnel/route_darwin_test.go b/pkg/minikube/tunnel/route_darwin_test.go index 5d6c421b444c..b2cc6370d03e 100644 --- a/pkg/minikube/tunnel/route_darwin_test.go +++ b/pkg/minikube/tunnel/route_darwin_test.go @@ -1,3 +1,4 @@ +//go:build darwin && integration // +build darwin,integration /* diff --git a/pkg/minikube/tunnel/route_linux_test.go b/pkg/minikube/tunnel/route_linux_test.go index 52f549fa8a8b..549aef04a9e9 100644 --- a/pkg/minikube/tunnel/route_linux_test.go +++ b/pkg/minikube/tunnel/route_linux_test.go @@ -1,3 +1,4 @@ +//go:build linux && integration // +build linux,integration /* diff --git a/pkg/minikube/tunnel/route_windows_test.go b/pkg/minikube/tunnel/route_windows_test.go index b95d96cd8482..10e99d5a71f8 100644 --- a/pkg/minikube/tunnel/route_windows_test.go +++ b/pkg/minikube/tunnel/route_windows_test.go @@ -1,3 +1,4 @@ +//go:build windows && integration // +build windows,integration /* diff --git a/test/integration/aaa_download_only_test.go b/test/integration/aaa_download_only_test.go index 0037c98bd629..fca29ccb170c 100644 --- a/test/integration/aaa_download_only_test.go +++ b/test/integration/aaa_download_only_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/aab_offline_test.go b/test/integration/aab_offline_test.go index 2b2f29eae2ba..e9f2dbb219e0 100644 --- a/test/integration/aab_offline_test.go +++ b/test/integration/aab_offline_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/addons_test.go b/test/integration/addons_test.go index 776df76408b8..2a0b53734736 100644 --- a/test/integration/addons_test.go +++ b/test/integration/addons_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/cert_options_test.go b/test/integration/cert_options_test.go index 6353eac8797b..0dead5683d1c 100644 --- a/test/integration/cert_options_test.go +++ b/test/integration/cert_options_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/docker_test.go b/test/integration/docker_test.go index c7db90f6c29d..db1f43862138 100644 --- a/test/integration/docker_test.go +++ b/test/integration/docker_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/error_spam_test.go b/test/integration/error_spam_test.go index 6333e5eace6c..95b0c1de0ed6 100644 --- a/test/integration/error_spam_test.go +++ b/test/integration/error_spam_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/functional_test.go b/test/integration/functional_test.go index 998320b4bec5..24cdc938bcae 100644 --- a/test/integration/functional_test.go +++ b/test/integration/functional_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/functional_test_mount_test.go b/test/integration/functional_test_mount_test.go index d7e8a847091f..039df204170e 100644 --- a/test/integration/functional_test_mount_test.go +++ b/test/integration/functional_test_mount_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/functional_test_pvc_test.go b/test/integration/functional_test_pvc_test.go index 744edadbae98..5b5e015e1531 100644 --- a/test/integration/functional_test_pvc_test.go +++ b/test/integration/functional_test_pvc_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/functional_test_tunnel_test.go b/test/integration/functional_test_tunnel_test.go index 8d7b4fcb38d7..4472408778ca 100644 --- a/test/integration/functional_test_tunnel_test.go +++ b/test/integration/functional_test_tunnel_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/guest_env_test.go b/test/integration/guest_env_test.go index 21f274b4777f..f75f1cd6d754 100644 --- a/test/integration/guest_env_test.go +++ b/test/integration/guest_env_test.go @@ -1,3 +1,4 @@ +//go:build iso // +build iso /* diff --git a/test/integration/gvisor_addon_test.go b/test/integration/gvisor_addon_test.go index 82609843c3e1..5b5e2453d795 100644 --- a/test/integration/gvisor_addon_test.go +++ b/test/integration/gvisor_addon_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/kic_custom_network_test.go b/test/integration/kic_custom_network_test.go index b9e571ff0d0b..b39233653274 100644 --- a/test/integration/kic_custom_network_test.go +++ b/test/integration/kic_custom_network_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/multinode_test.go b/test/integration/multinode_test.go index b1e74c9bb3d4..9a70a7aa2292 100644 --- a/test/integration/multinode_test.go +++ b/test/integration/multinode_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/net_test.go b/test/integration/net_test.go index e3eb1a49d0e4..60dc1cd443f4 100644 --- a/test/integration/net_test.go +++ b/test/integration/net_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/none_test.go b/test/integration/none_test.go index b1219de8cd69..a5e4f96e3c05 100644 --- a/test/integration/none_test.go +++ b/test/integration/none_test.go @@ -1,5 +1,5 @@ -// +build integration -// +build linux +//go:build integration && linux +// +build integration,linux /* Copyright 2019 The Kubernetes Authors All rights reserved. diff --git a/test/integration/pause_test.go b/test/integration/pause_test.go index e4706aaa6fde..b125c7dc4e5c 100644 --- a/test/integration/pause_test.go +++ b/test/integration/pause_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/pkg_install_test.go b/test/integration/pkg_install_test.go index ca500e41a4ab..d3e3d4ae41d8 100644 --- a/test/integration/pkg_install_test.go +++ b/test/integration/pkg_install_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/preload_test.go b/test/integration/preload_test.go index 1a6d0c8836b2..6ce94bfbc569 100644 --- a/test/integration/preload_test.go +++ b/test/integration/preload_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/scheduled_stop_test.go b/test/integration/scheduled_stop_test.go index b01bcca91383..177528c37dae 100644 --- a/test/integration/scheduled_stop_test.go +++ b/test/integration/scheduled_stop_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/skaffold_test.go b/test/integration/skaffold_test.go index f801b6117c92..9a10f93c071c 100644 --- a/test/integration/skaffold_test.go +++ b/test/integration/skaffold_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/start_stop_delete_test.go b/test/integration/start_stop_delete_test.go index c756965d0376..3b00b5d6ed6a 100644 --- a/test/integration/start_stop_delete_test.go +++ b/test/integration/start_stop_delete_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* diff --git a/test/integration/status_test.go b/test/integration/status_test.go index 3b78642a96c8..924d69e545c5 100644 --- a/test/integration/status_test.go +++ b/test/integration/status_test.go @@ -1,3 +1,4 @@ +//go:build integration // +build integration /* From d2de1aac02e93c4c4fc549677281a70f0c139167 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Mon, 13 Sep 2021 12:50:40 -0700 Subject: [PATCH 080/201] update build tag regex --- hack/boilerplate/boilerplate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/boilerplate/boilerplate.go b/hack/boilerplate/boilerplate.go index 3bd06b4da2a4..bb7e411bd40f 100644 --- a/hack/boilerplate/boilerplate.go +++ b/hack/boilerplate/boilerplate.go @@ -35,7 +35,7 @@ var ( skippedPaths = regexp.MustCompile(`Godeps|third_party|_gopath|_output|\.git|cluster/env.sh|vendor|test/e2e/generated/bindata.go|site/themes/docsy|test/integration/testdata`) windowdNewLine = regexp.MustCompile(`\r`) txtExtension = regexp.MustCompile(`\.txt`) - goBuildTag = regexp.MustCompile(`(?m)^(// \+build.*\n)+\n`) + goBuildTag = regexp.MustCompile(`(?m)^(//go:build.*\n// \+build.*\n)+\n`) shebang = regexp.MustCompile(`(?m)^(#!.*\n)\n*`) copyright = regexp.MustCompile(`Copyright YEAR`) copyrightReal = regexp.MustCompile(`Copyright \d{4}`) From 5672d40eecb97e00418e6b1185635e93bb56cc88 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Mon, 13 Sep 2021 14:05:30 -0700 Subject: [PATCH 081/201] account for GCE service account for GCP auth --- pkg/addons/addons_gcpauth.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/addons/addons_gcpauth.go b/pkg/addons/addons_gcpauth.go index e324e78dfc7f..4228918fc8c1 100644 --- a/pkg/addons/addons_gcpauth.go +++ b/pkg/addons/addons_gcpauth.go @@ -72,7 +72,7 @@ func enableAddonGCPAuth(cfg *config.ClusterConfig) error { // Grab credentials from where GCP would normally look ctx := context.Background() creds, err := google.FindDefaultCredentials(ctx) - if err != nil || creds.JSON == nil { + if err != nil { if detect.IsCloudShell() { if c := os.Getenv("CLOUDSDK_CONFIG"); c != "" { f, err := ioutil.ReadFile(path.Join(c, "application_default_credentials.json")) @@ -98,6 +98,11 @@ func enableAddonGCPAuth(cfg *config.ClusterConfig) error { return nil } + if creds.JSON == nil { + out.WarningT("You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.") + return nil + } + // Actually copy the creds over f := assets.NewMemoryAssetTarget(creds.JSON, credentialsPath, "0444") From cd05ababead9fae484b5c0f9abfa5491ad9232c5 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Mon, 13 Sep 2021 16:38:35 -0700 Subject: [PATCH 082/201] filter crio instead of windows --- hack/jenkins/test-flake-chart/report_flakes.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/jenkins/test-flake-chart/report_flakes.sh b/hack/jenkins/test-flake-chart/report_flakes.sh index eb0aeacd0485..891ed6f6f5f2 100755 --- a/hack/jenkins/test-flake-chart/report_flakes.sh +++ b/hack/jenkins/test-flake-chart/report_flakes.sh @@ -87,7 +87,7 @@ awk -F, 'NR>1 { # Filter out arm64, macOS and windows tests until they're more stable TMP_FAILED_RATES_FILTERED=$(mktemp) -grep -v "arm64\|macOS\|Windows" "$TMP_FAILED_RATES" > "$TMP_FAILED_RATES_FILTERED" +grep -v "arm64\|macOS\|crio" "$TMP_FAILED_RATES" > "$TMP_FAILED_RATES_FILTERED" FAILED_RATES_LINES=$(wc -l < "$TMP_FAILED_RATES_FILTERED") if [[ "$FAILED_RATES_LINES" -eq 0 ]]; then From c31db4fd99053b8555b9fab9c2290e75bba49a3f Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Tue, 7 Sep 2021 15:53:29 -0700 Subject: [PATCH 083/201] update cri-o from v1.20.0 to 1.22.0 --- deploy/iso/minikube-iso/package/crio-bin/crio-bin.hash | 1 + deploy/iso/minikube-iso/package/crio-bin/crio-bin.mk | 6 +++--- deploy/kicbase/Dockerfile | 7 ++++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/deploy/iso/minikube-iso/package/crio-bin/crio-bin.hash b/deploy/iso/minikube-iso/package/crio-bin/crio-bin.hash index 11dd505068f1..36451957fa5b 100644 --- a/deploy/iso/minikube-iso/package/crio-bin/crio-bin.hash +++ b/deploy/iso/minikube-iso/package/crio-bin/crio-bin.hash @@ -22,3 +22,4 @@ sha256 fc8a8e61375e3ce30563eeb0fd6534c4f48fc20300a72e6ff51cc99cb2703516 v1.19.0. sha256 6165c5b8212ea03be2a465403177318bfe25a54c3e8d66d720344643913a0223 v1.19.1.tar.gz sha256 76fd7543bc92d4364a11060f43a5131893a76c6e6e9d6de3a6bb6292c110b631 v1.20.0.tar.gz sha256 1c01d4a76cdcfe3ac24147eb1d5f6ebd782bd98fb0ac0c19b79bd5a6560b1481 v1.20.2.tar.gz +sha256 bc53ea8977e252bd9812974c33ff654ee22076598e901464468c5c105a5ef773 v1.22.0.tar.gz diff --git a/deploy/iso/minikube-iso/package/crio-bin/crio-bin.mk b/deploy/iso/minikube-iso/package/crio-bin/crio-bin.mk index 21d7f76556c7..b303c59043f9 100644 --- a/deploy/iso/minikube-iso/package/crio-bin/crio-bin.mk +++ b/deploy/iso/minikube-iso/package/crio-bin/crio-bin.mk @@ -4,9 +4,9 @@ # ################################################################################ -CRIO_BIN_VERSION = v1.20.2 -CRIO_BIN_COMMIT = d5a999ad0a35d895ded554e1e18c142075501a98 -CRIO_BIN_SITE = https://github.com/cri-o/cri-o/archive +CRIO_BIN_VERSION = v1.22.0 +CRIO_BIN_COMMIT = 6becad23eadd7dfdd25fd8df386bf3b706cf7758 +CRIO_BIN_SITE = https://github.com/cri-o/cri-o/archive/refs/tags/ CRIO_BIN_SOURCE = $(CRIO_BIN_VERSION).tar.gz CRIO_BIN_DEPENDENCIES = host-go libgpgme CRIO_BIN_GOPATH = $(@D)/_output diff --git a/deploy/kicbase/Dockerfile b/deploy/kicbase/Dockerfile index d76aeecef4d4..f7092a32d70b 100644 --- a/deploy/kicbase/Dockerfile +++ b/deploy/kicbase/Dockerfile @@ -32,6 +32,7 @@ FROM ubuntu:focal-20210401 ARG BUILDKIT_VERSION="v0.9.0" ARG FUSE_OVERLAYFS_VERSION="v1.7.1" ARG CONTAINERD_FUSE_OVERLAYFS_VERSION="1.0.3" +ARG CRIO_VERSION="1.22" # copy in static files (configs, scripts) COPY deploy/kicbase/10-network-security.conf /etc/sysctl.d/10-network-security.conf @@ -156,9 +157,9 @@ RUN sh -c "echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/li apt-key add - < Release.key && \ clean-install containers-common catatonit conmon containernetworking-plugins cri-tools podman-plugins crun -# install cri-o based on https://github.com/cri-o/cri-o/blob/release-1.20/README.md#installing-cri-o -RUN sh -c "echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.20/xUbuntu_20.04/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:1.20.list" && \ - curl -LO https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.20/xUbuntu_20.04/Release.key && \ +# install cri-o based on https://github.com/cri-o/cri-o/blob/release-1.22/README.md#installing-cri-o +RUN sh -c "echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/${CRIO_VERSION}/xUbuntu_20.04/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:${CRIO_VERSION}.list" && \ + curl -LO https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/${CRIO_VERSION}/xUbuntu_20.04/Release.key && \ apt-key add - < Release.key && \ clean-install cri-o cri-o-runc From 623c01c23a9315a20df2f7bf68fa4326e0f8561f Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Tue, 7 Sep 2021 17:45:01 -0700 Subject: [PATCH 084/201] remove var --- deploy/iso/minikube-iso/package/crio-bin/crio-bin.mk | 2 +- deploy/kicbase/Dockerfile | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/deploy/iso/minikube-iso/package/crio-bin/crio-bin.mk b/deploy/iso/minikube-iso/package/crio-bin/crio-bin.mk index b303c59043f9..30b1e81468ff 100644 --- a/deploy/iso/minikube-iso/package/crio-bin/crio-bin.mk +++ b/deploy/iso/minikube-iso/package/crio-bin/crio-bin.mk @@ -6,7 +6,7 @@ CRIO_BIN_VERSION = v1.22.0 CRIO_BIN_COMMIT = 6becad23eadd7dfdd25fd8df386bf3b706cf7758 -CRIO_BIN_SITE = https://github.com/cri-o/cri-o/archive/refs/tags/ +CRIO_BIN_SITE = https://github.com/cri-o/cri-o/archive/ CRIO_BIN_SOURCE = $(CRIO_BIN_VERSION).tar.gz CRIO_BIN_DEPENDENCIES = host-go libgpgme CRIO_BIN_GOPATH = $(@D)/_output diff --git a/deploy/kicbase/Dockerfile b/deploy/kicbase/Dockerfile index f7092a32d70b..b61d945d007e 100644 --- a/deploy/kicbase/Dockerfile +++ b/deploy/kicbase/Dockerfile @@ -158,8 +158,8 @@ RUN sh -c "echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/li clean-install containers-common catatonit conmon containernetworking-plugins cri-tools podman-plugins crun # install cri-o based on https://github.com/cri-o/cri-o/blob/release-1.22/README.md#installing-cri-o -RUN sh -c "echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/${CRIO_VERSION}/xUbuntu_20.04/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:${CRIO_VERSION}.list" && \ - curl -LO https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/${CRIO_VERSION}/xUbuntu_20.04/Release.key && \ +RUN sh -c "echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_20.04/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:1.22.list" && \ + curl -LO https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_20.04/Release.key && \ apt-key add - < Release.key && \ clean-install cri-o cri-o-runc From 1bc841108f264141b243fb5768809a462fde051a Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Thu, 9 Sep 2021 12:52:44 -0700 Subject: [PATCH 085/201] skip cri-o installation on unsupported archs --- deploy/kicbase/Dockerfile | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/deploy/kicbase/Dockerfile b/deploy/kicbase/Dockerfile index b61d945d007e..4cf4a001f15a 100644 --- a/deploy/kicbase/Dockerfile +++ b/deploy/kicbase/Dockerfile @@ -158,10 +158,15 @@ RUN sh -c "echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/li clean-install containers-common catatonit conmon containernetworking-plugins cri-tools podman-plugins crun # install cri-o based on https://github.com/cri-o/cri-o/blob/release-1.22/README.md#installing-cri-o -RUN sh -c "echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_20.04/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:1.22.list" && \ - curl -LO https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_20.04/Release.key && \ - apt-key add - < Release.key && \ - clean-install cri-o cri-o-runc +# currently cri-o only supports amd64 & arm64, so skip installation on other archs +RUN export ARCH=$(dpkg --print-architecture | sed 's/ppc64el/ppc64le/' | sed 's/armhf/arm-v7/') && \ + if [ "$ARCH" = "amd64" ] || [ "$ARCH" = "arm64" ]; \ + then \ + sh -c "echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_20.04/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:1.22.list" && \ + curl -LO https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_20.04/Release.key && \ + apt-key add - < Release.key && \ + clean-install cri-o cri-o-runc; \ + fi # install podman RUN sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_20.04/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list" && \ From 8304e525391041759e2bd64911e3bdbfa9160fae Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Thu, 9 Sep 2021 13:59:23 -0700 Subject: [PATCH 086/201] prevent user from using crio on unsupported hardware --- cmd/minikube/cmd/start.go | 56 ++++++++++++------- .../minikube-iso/package/crio-bin/crio-bin.mk | 2 +- deploy/kicbase/Dockerfile | 1 - 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index d51fec280a0d..4bc9becbae8a 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -1121,25 +1121,7 @@ func validateFlags(cmd *cobra.Command, drvName string) { if cmd.Flags().Changed(containerRuntime) { runtime := strings.ToLower(viper.GetString(containerRuntime)) - validOptions := cruntime.ValidRuntimes() - // `crio` is accepted as an alternative spelling to `cri-o` - validOptions = append(validOptions, constants.CRIO) - - var validRuntime bool - for _, option := range validOptions { - if runtime == option { - validRuntime = true - } - - // Convert `cri-o` to `crio` as the K8s config uses the `crio` spelling - if runtime == "cri-o" { - viper.Set(containerRuntime, constants.CRIO) - } - } - - if !validRuntime { - exit.Message(reason.Usage, `Invalid Container Runtime: "{{.runtime}}". Valid runtimes are: {{.validOptions}}`, out.V{"runtime": runtime, "validOptions": strings.Join(cruntime.ValidRuntimes(), ", ")}) - } + validateContainerRuntime(runtime, drvName) validateCNI(cmd, runtime) } @@ -1206,6 +1188,42 @@ func validateFlags(cmd *cobra.Command, drvName string) { validateInsecureRegistry() } +func validateContainerRuntime(runtime string, drvName string) { + validOptions := cruntime.ValidRuntimes() + // `crio` is accepted as an alternative spelling to `cri-o` + validOptions = append(validOptions, constants.CRIO) + + var validRuntime bool + for _, option := range validOptions { + if runtime == option { + validRuntime = true + } + + // Convert `cri-o` to `crio` as the K8s config uses the `crio` spelling + if runtime == "cri-o" { + viper.Set(containerRuntime, constants.CRIO) + } + } + + if !validRuntime { + exit.Message(reason.Usage, `Invalid Container Runtime: "{{.runtime}}". Valid runtimes are: {{.validOptions}}`, out.V{"runtime": runtime, "validOptions": strings.Join(cruntime.ValidRuntimes(), ", ")}) + } + + // cri-o runtime only supports amd64 & arm64 if kicbase driver is used + if runtime != "cri-o" && runtime != constants.CRIO { + return + } + if !driver.IsKIC(drvName) { + return + } + arch := detect.RuntimeArch() + if arch != "amd64" && arch != "arm64" { + return + } + + exit.Message(reason.Usage, `Invalid Container Runtime: "{{.runtime}}". When using a kicbase driver (docker & podman), {{.runtime}} is only supported on amd64 & arm64, use docker or containerd instead.`, out.V{"runtime": runtime}) +} + // if container runtime is not docker, check that cni is not disabled func validateCNI(cmd *cobra.Command, runtime string) { if runtime == "docker" { diff --git a/deploy/iso/minikube-iso/package/crio-bin/crio-bin.mk b/deploy/iso/minikube-iso/package/crio-bin/crio-bin.mk index 30b1e81468ff..48b3977ef660 100644 --- a/deploy/iso/minikube-iso/package/crio-bin/crio-bin.mk +++ b/deploy/iso/minikube-iso/package/crio-bin/crio-bin.mk @@ -6,7 +6,7 @@ CRIO_BIN_VERSION = v1.22.0 CRIO_BIN_COMMIT = 6becad23eadd7dfdd25fd8df386bf3b706cf7758 -CRIO_BIN_SITE = https://github.com/cri-o/cri-o/archive/ +CRIO_BIN_SITE = https://github.com/cri-o/cri-o/archive CRIO_BIN_SOURCE = $(CRIO_BIN_VERSION).tar.gz CRIO_BIN_DEPENDENCIES = host-go libgpgme CRIO_BIN_GOPATH = $(@D)/_output diff --git a/deploy/kicbase/Dockerfile b/deploy/kicbase/Dockerfile index 4cf4a001f15a..7d9f8f502edd 100644 --- a/deploy/kicbase/Dockerfile +++ b/deploy/kicbase/Dockerfile @@ -32,7 +32,6 @@ FROM ubuntu:focal-20210401 ARG BUILDKIT_VERSION="v0.9.0" ARG FUSE_OVERLAYFS_VERSION="v1.7.1" ARG CONTAINERD_FUSE_OVERLAYFS_VERSION="1.0.3" -ARG CRIO_VERSION="1.22" # copy in static files (configs, scripts) COPY deploy/kicbase/10-network-security.conf /etc/sysctl.d/10-network-security.conf From 5243af5d58e5660ede27fa7794bbeb5dcd92f1be Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Thu, 9 Sep 2021 14:22:57 -0700 Subject: [PATCH 087/201] only disable crio if installed --- deploy/kicbase/Dockerfile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/deploy/kicbase/Dockerfile b/deploy/kicbase/Dockerfile index 7d9f8f502edd..1876d12f2c15 100644 --- a/deploy/kicbase/Dockerfile +++ b/deploy/kicbase/Dockerfile @@ -192,7 +192,12 @@ COPY deploy/kicbase/scheduled-stop/minikube-scheduled-stop.service /usr/lib/syst RUN chmod +x /var/lib/minikube/scheduled-stop/minikube-scheduled-stop # disable non-docker runtimes by default -RUN systemctl disable containerd && systemctl disable crio && rm /etc/crictl.yaml +RUN systemctl disable containerd && \ + export ARCH=$(dpkg --print-architecture | sed 's/ppc64el/ppc64le/' | sed 's/armhf/arm-v7/') && \ + if [ "$ARCH" = "amd64" ] || [ "$ARCH" = "arm64" ]; \ + then \ + systemctl disable crio && rm /etc/crictl.yaml; \ + fi # enable docker which is default RUN systemctl enable docker.service && systemctl enable podman.socket # making SSH work for docker container From debae036667b18c396a1f746672f8e2500c98d2d Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Fri, 10 Sep 2021 10:35:34 -0700 Subject: [PATCH 088/201] crio enabled s390x arch --- deploy/kicbase/Dockerfile | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/deploy/kicbase/Dockerfile b/deploy/kicbase/Dockerfile index 1876d12f2c15..f7092a32d70b 100644 --- a/deploy/kicbase/Dockerfile +++ b/deploy/kicbase/Dockerfile @@ -32,6 +32,7 @@ FROM ubuntu:focal-20210401 ARG BUILDKIT_VERSION="v0.9.0" ARG FUSE_OVERLAYFS_VERSION="v1.7.1" ARG CONTAINERD_FUSE_OVERLAYFS_VERSION="1.0.3" +ARG CRIO_VERSION="1.22" # copy in static files (configs, scripts) COPY deploy/kicbase/10-network-security.conf /etc/sysctl.d/10-network-security.conf @@ -157,15 +158,10 @@ RUN sh -c "echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/li clean-install containers-common catatonit conmon containernetworking-plugins cri-tools podman-plugins crun # install cri-o based on https://github.com/cri-o/cri-o/blob/release-1.22/README.md#installing-cri-o -# currently cri-o only supports amd64 & arm64, so skip installation on other archs -RUN export ARCH=$(dpkg --print-architecture | sed 's/ppc64el/ppc64le/' | sed 's/armhf/arm-v7/') && \ - if [ "$ARCH" = "amd64" ] || [ "$ARCH" = "arm64" ]; \ - then \ - sh -c "echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_20.04/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:1.22.list" && \ - curl -LO https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22/xUbuntu_20.04/Release.key && \ - apt-key add - < Release.key && \ - clean-install cri-o cri-o-runc; \ - fi +RUN sh -c "echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/${CRIO_VERSION}/xUbuntu_20.04/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:${CRIO_VERSION}.list" && \ + curl -LO https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/${CRIO_VERSION}/xUbuntu_20.04/Release.key && \ + apt-key add - < Release.key && \ + clean-install cri-o cri-o-runc # install podman RUN sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_20.04/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list" && \ @@ -192,12 +188,7 @@ COPY deploy/kicbase/scheduled-stop/minikube-scheduled-stop.service /usr/lib/syst RUN chmod +x /var/lib/minikube/scheduled-stop/minikube-scheduled-stop # disable non-docker runtimes by default -RUN systemctl disable containerd && \ - export ARCH=$(dpkg --print-architecture | sed 's/ppc64el/ppc64le/' | sed 's/armhf/arm-v7/') && \ - if [ "$ARCH" = "amd64" ] || [ "$ARCH" = "arm64" ]; \ - then \ - systemctl disable crio && rm /etc/crictl.yaml; \ - fi +RUN systemctl disable containerd && systemctl disable crio && rm /etc/crictl.yaml # enable docker which is default RUN systemctl enable docker.service && systemctl enable podman.socket # making SSH work for docker container From 030b3837aba26d6d836301451d373affd4ac378e Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Fri, 10 Sep 2021 18:11:51 +0000 Subject: [PATCH 089/201] Updating kicbase image to v0.0.26-1631295795-12425 --- pkg/drivers/kic/types.go | 8 ++++---- site/content/en/docs/commands/start.md | 2 +- translations/de.json | 1 + translations/es.json | 1 + translations/fr.json | 1 + translations/ja.json | 1 + translations/ko.json | 1 + translations/pl.json | 1 + translations/strings.txt | 1 + translations/zh-CN.json | 1 + 10 files changed, 13 insertions(+), 5 deletions(-) diff --git a/pkg/drivers/kic/types.go b/pkg/drivers/kic/types.go index 03e7728c554d..90edf821fe64 100644 --- a/pkg/drivers/kic/types.go +++ b/pkg/drivers/kic/types.go @@ -24,13 +24,13 @@ import ( const ( // Version is the current version of kic - Version = "v0.0.26" + Version = "v0.0.26-1631295795-12425" // SHA of the kic base image - baseImageSHA = "d4aa14fbdc3a28a60632c24af937329ec787b02c89983c6f5498d346860a848c" + baseImageSHA = "7d61c0b6cf6832c8015ada78640635c5ab74b72f12f51bcc4c7660b0be01af56" // The name of the GCR kicbase repository - gcrRepo = "gcr.io/k8s-minikube/kicbase" + gcrRepo = "gcr.io/k8s-minikube/kicbase-builds" // The name of the Dockerhub kicbase repository - dockerhubRepo = "kicbase/stable" + dockerhubRepo = "docker.io/kicbase/build" ) var ( diff --git a/site/content/en/docs/commands/start.md b/site/content/en/docs/commands/start.md index 9f02f7024f57..9d7f8ded5a3d 100644 --- a/site/content/en/docs/commands/start.md +++ b/site/content/en/docs/commands/start.md @@ -26,7 +26,7 @@ minikube start [flags] --apiserver-names strings A set of apiserver names which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine --apiserver-port int The apiserver listening port (default 8443) --auto-update-drivers If set, automatically updates drivers to the latest version. Defaults to true. (default true) - --base-image string The base image to use for docker/podman drivers. Intended for local development. (default "gcr.io/k8s-minikube/kicbase:v0.0.26@sha256:d4aa14fbdc3a28a60632c24af937329ec787b02c89983c6f5498d346860a848c") + --base-image string The base image to use for docker/podman drivers. Intended for local development. (default "gcr.io/k8s-minikube/kicbase-builds:v0.0.26-1631295795-12425@sha256:7d61c0b6cf6832c8015ada78640635c5ab74b72f12f51bcc4c7660b0be01af56") --cache-images If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none. (default true) --cni string CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto) --container-runtime string The container runtime to be used (docker, cri-o, containerd). (default "docker") diff --git a/translations/de.json b/translations/de.json index 478dc10a59ea..a13eb6dc9fd7 100644 --- a/translations/de.json +++ b/translations/de.json @@ -346,6 +346,7 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", + "Invalid Container Runtime: \"{{.runtime}}\". When using a kicbase driver (docker \u0026 podman), {{.runtime}} is only supported on amd64 \u0026 arm64, use docker or containerd instead.": "", "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", diff --git a/translations/es.json b/translations/es.json index 4f5c02ac0a7a..d8686a8a4dfd 100644 --- a/translations/es.json +++ b/translations/es.json @@ -352,6 +352,7 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", + "Invalid Container Runtime: \"{{.runtime}}\". When using a kicbase driver (docker \u0026 podman), {{.runtime}} is only supported on amd64 \u0026 arm64, use docker or containerd instead.": "", "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", diff --git a/translations/fr.json b/translations/fr.json index 79055b0574a7..2ba27b48ebe1 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -351,6 +351,7 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "Installez VirtualBox et assurez-vous qu'il est dans le chemin, ou sélectionnez une valeur alternative pour --driver", "Install the latest hyperkit binary, and run 'minikube delete'": "Installez le dernier binaire hyperkit et exécutez 'minikube delete'", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "Exécution de conteneur non valide : \"{{.runtime}}\". Les environnements d'exécution valides sont : {{.validOptions}}", + "Invalid Container Runtime: \"{{.runtime}}\". When using a kicbase driver (docker \u0026 podman), {{.runtime}} is only supported on amd64 \u0026 arm64, use docker or containerd instead.": "", "Invalid port": "Port invalide", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "Istio a besoin de {{.minCPUs}} processeurs -- votre configuration n'alloue que {{.cpus}} processeurs", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "Istio a besoin de {{.minMem}}Mo de mémoire -- votre configuration n'alloue que {{.memory}}Mo", diff --git a/translations/ja.json b/translations/ja.json index 81bd7737b4ee..fc90115e2b32 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -337,6 +337,7 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", + "Invalid Container Runtime: \"{{.runtime}}\". When using a kicbase driver (docker \u0026 podman), {{.runtime}} is only supported on amd64 \u0026 arm64, use docker or containerd instead.": "", "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", diff --git a/translations/ko.json b/translations/ko.json index 7849bef2b84f..f1ee4c92cc81 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -368,6 +368,7 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", + "Invalid Container Runtime: \"{{.runtime}}\". When using a kicbase driver (docker \u0026 podman), {{.runtime}} is only supported on amd64 \u0026 arm64, use docker or containerd instead.": "", "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", diff --git a/translations/pl.json b/translations/pl.json index a88e990b28ef..f8b475a3160f 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -355,6 +355,7 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", + "Invalid Container Runtime: \"{{.runtime}}\". When using a kicbase driver (docker \u0026 podman), {{.runtime}} is only supported on amd64 \u0026 arm64, use docker or containerd instead.": "", "Invalid port": "", "Invalid size passed in argument: {{.error}}": "Nieprawidłowy rozmiar przekazany w argumencie: {{.error}}", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", diff --git a/translations/strings.txt b/translations/strings.txt index b943fb9cc206..19026b2248f4 100644 --- a/translations/strings.txt +++ b/translations/strings.txt @@ -325,6 +325,7 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", + "Invalid Container Runtime: \"{{.runtime}}\". When using a kicbase driver (docker \u0026 podman), {{.runtime}} is only supported on amd64 \u0026 arm64, use docker or containerd instead.": "", "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", diff --git a/translations/zh-CN.json b/translations/zh-CN.json index ab9509fe3780..dcff7a5f8fc6 100644 --- a/translations/zh-CN.json +++ b/translations/zh-CN.json @@ -427,6 +427,7 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", + "Invalid Container Runtime: \"{{.runtime}}\". When using a kicbase driver (docker \u0026 podman), {{.runtime}} is only supported on amd64 \u0026 arm64, use docker or containerd instead.": "", "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", From 7dfb817d0f4a994631f4def1c24d04f824a9a86a Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Fri, 10 Sep 2021 11:26:19 -0700 Subject: [PATCH 090/201] undo validation changes --- cmd/minikube/cmd/start.go | 56 +++++++++++++-------------------------- 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 4bc9becbae8a..d51fec280a0d 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -1121,7 +1121,25 @@ func validateFlags(cmd *cobra.Command, drvName string) { if cmd.Flags().Changed(containerRuntime) { runtime := strings.ToLower(viper.GetString(containerRuntime)) - validateContainerRuntime(runtime, drvName) + validOptions := cruntime.ValidRuntimes() + // `crio` is accepted as an alternative spelling to `cri-o` + validOptions = append(validOptions, constants.CRIO) + + var validRuntime bool + for _, option := range validOptions { + if runtime == option { + validRuntime = true + } + + // Convert `cri-o` to `crio` as the K8s config uses the `crio` spelling + if runtime == "cri-o" { + viper.Set(containerRuntime, constants.CRIO) + } + } + + if !validRuntime { + exit.Message(reason.Usage, `Invalid Container Runtime: "{{.runtime}}". Valid runtimes are: {{.validOptions}}`, out.V{"runtime": runtime, "validOptions": strings.Join(cruntime.ValidRuntimes(), ", ")}) + } validateCNI(cmd, runtime) } @@ -1188,42 +1206,6 @@ func validateFlags(cmd *cobra.Command, drvName string) { validateInsecureRegistry() } -func validateContainerRuntime(runtime string, drvName string) { - validOptions := cruntime.ValidRuntimes() - // `crio` is accepted as an alternative spelling to `cri-o` - validOptions = append(validOptions, constants.CRIO) - - var validRuntime bool - for _, option := range validOptions { - if runtime == option { - validRuntime = true - } - - // Convert `cri-o` to `crio` as the K8s config uses the `crio` spelling - if runtime == "cri-o" { - viper.Set(containerRuntime, constants.CRIO) - } - } - - if !validRuntime { - exit.Message(reason.Usage, `Invalid Container Runtime: "{{.runtime}}". Valid runtimes are: {{.validOptions}}`, out.V{"runtime": runtime, "validOptions": strings.Join(cruntime.ValidRuntimes(), ", ")}) - } - - // cri-o runtime only supports amd64 & arm64 if kicbase driver is used - if runtime != "cri-o" && runtime != constants.CRIO { - return - } - if !driver.IsKIC(drvName) { - return - } - arch := detect.RuntimeArch() - if arch != "amd64" && arch != "arm64" { - return - } - - exit.Message(reason.Usage, `Invalid Container Runtime: "{{.runtime}}". When using a kicbase driver (docker & podman), {{.runtime}} is only supported on amd64 & arm64, use docker or containerd instead.`, out.V{"runtime": runtime}) -} - // if container runtime is not docker, check that cni is not disabled func validateCNI(cmd *cobra.Command, runtime string) { if runtime == "docker" { From 5c2c765015e99c43c1b9888a7af7f20b2cc08820 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Fri, 10 Sep 2021 11:29:13 -0700 Subject: [PATCH 091/201] run make generate-docs --- translations/de.json | 1 - translations/es.json | 1 - translations/fr.json | 1 - translations/ja.json | 1 - translations/ko.json | 1 - translations/pl.json | 1 - translations/strings.txt | 1 - translations/zh-CN.json | 1 - 8 files changed, 8 deletions(-) diff --git a/translations/de.json b/translations/de.json index a13eb6dc9fd7..478dc10a59ea 100644 --- a/translations/de.json +++ b/translations/de.json @@ -346,7 +346,6 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", - "Invalid Container Runtime: \"{{.runtime}}\". When using a kicbase driver (docker \u0026 podman), {{.runtime}} is only supported on amd64 \u0026 arm64, use docker or containerd instead.": "", "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", diff --git a/translations/es.json b/translations/es.json index d8686a8a4dfd..4f5c02ac0a7a 100644 --- a/translations/es.json +++ b/translations/es.json @@ -352,7 +352,6 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", - "Invalid Container Runtime: \"{{.runtime}}\". When using a kicbase driver (docker \u0026 podman), {{.runtime}} is only supported on amd64 \u0026 arm64, use docker or containerd instead.": "", "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", diff --git a/translations/fr.json b/translations/fr.json index 2ba27b48ebe1..79055b0574a7 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -351,7 +351,6 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "Installez VirtualBox et assurez-vous qu'il est dans le chemin, ou sélectionnez une valeur alternative pour --driver", "Install the latest hyperkit binary, and run 'minikube delete'": "Installez le dernier binaire hyperkit et exécutez 'minikube delete'", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "Exécution de conteneur non valide : \"{{.runtime}}\". Les environnements d'exécution valides sont : {{.validOptions}}", - "Invalid Container Runtime: \"{{.runtime}}\". When using a kicbase driver (docker \u0026 podman), {{.runtime}} is only supported on amd64 \u0026 arm64, use docker or containerd instead.": "", "Invalid port": "Port invalide", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "Istio a besoin de {{.minCPUs}} processeurs -- votre configuration n'alloue que {{.cpus}} processeurs", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "Istio a besoin de {{.minMem}}Mo de mémoire -- votre configuration n'alloue que {{.memory}}Mo", diff --git a/translations/ja.json b/translations/ja.json index fc90115e2b32..81bd7737b4ee 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -337,7 +337,6 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", - "Invalid Container Runtime: \"{{.runtime}}\". When using a kicbase driver (docker \u0026 podman), {{.runtime}} is only supported on amd64 \u0026 arm64, use docker or containerd instead.": "", "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", diff --git a/translations/ko.json b/translations/ko.json index f1ee4c92cc81..7849bef2b84f 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -368,7 +368,6 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", - "Invalid Container Runtime: \"{{.runtime}}\". When using a kicbase driver (docker \u0026 podman), {{.runtime}} is only supported on amd64 \u0026 arm64, use docker or containerd instead.": "", "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", diff --git a/translations/pl.json b/translations/pl.json index f8b475a3160f..a88e990b28ef 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -355,7 +355,6 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", - "Invalid Container Runtime: \"{{.runtime}}\". When using a kicbase driver (docker \u0026 podman), {{.runtime}} is only supported on amd64 \u0026 arm64, use docker or containerd instead.": "", "Invalid port": "", "Invalid size passed in argument: {{.error}}": "Nieprawidłowy rozmiar przekazany w argumencie: {{.error}}", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", diff --git a/translations/strings.txt b/translations/strings.txt index 19026b2248f4..b943fb9cc206 100644 --- a/translations/strings.txt +++ b/translations/strings.txt @@ -325,7 +325,6 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", - "Invalid Container Runtime: \"{{.runtime}}\". When using a kicbase driver (docker \u0026 podman), {{.runtime}} is only supported on amd64 \u0026 arm64, use docker or containerd instead.": "", "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", diff --git a/translations/zh-CN.json b/translations/zh-CN.json index dcff7a5f8fc6..ab9509fe3780 100644 --- a/translations/zh-CN.json +++ b/translations/zh-CN.json @@ -427,7 +427,6 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", - "Invalid Container Runtime: \"{{.runtime}}\". When using a kicbase driver (docker \u0026 podman), {{.runtime}} is only supported on amd64 \u0026 arm64, use docker or containerd instead.": "", "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", From 16941e8925d4468fa0023fe844b5ec0b534efe53 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Mon, 13 Sep 2021 17:38:27 -0700 Subject: [PATCH 092/201] make sure current go version is installed --- hack/jenkins/build_iso.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hack/jenkins/build_iso.sh b/hack/jenkins/build_iso.sh index 73ded6d388ae..792281e4026e 100755 --- a/hack/jenkins/build_iso.sh +++ b/hack/jenkins/build_iso.sh @@ -24,6 +24,9 @@ set -x -o pipefail # Make sure gh is installed and configured ./hack/jenkins/installers/check_install_gh.sh +# Make sure golang is installed and configured +./hack/jenkins/installers/check_install_golang.sh "/usr/local" + # Make sure all required packages are installed sudo apt-get update sudo apt-get -y install build-essential unzip rsync bc python2 p7zip-full From 123760e97e4dae27d33a5af5caa349c065dd70c9 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Tue, 14 Sep 2021 12:42:26 -0700 Subject: [PATCH 093/201] update host-go version --- Makefile | 13 ++++++++----- deploy/iso/minikube-iso/go.hash | 4 ++++ 2 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 deploy/iso/minikube-iso/go.hash diff --git a/Makefile b/Makefile index 0ce4cad8e237..3291ef5151e5 100644 --- a/Makefile +++ b/Makefile @@ -43,6 +43,8 @@ KVM_GO_VERSION ?= $(GO_VERSION:.0=) INSTALL_SIZE ?= $(shell du out/minikube-windows-amd64.exe | cut -f1) BUILDROOT_BRANCH ?= 2021.02.4 +GOLANG_OPTIONS = GO_VERSION=1.16.1 GO_HASH_FILE=$(PWD)/deploy/iso/minikube-iso/go.hash +BUILDROOT_OPTIONS = BR2_EXTERNAL=$(PWD)/external $(GOLANG_OPTIONS) REGISTRY ?= gcr.io/k8s-minikube # Get git commit id @@ -283,17 +285,18 @@ minikube_iso: deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/usr/b if [ ! -d $(BUILD_DIR)/buildroot ]; then \ mkdir -p $(BUILD_DIR); \ git clone --depth=1 --branch=$(BUILDROOT_BRANCH) https://github.com/buildroot/buildroot $(BUILD_DIR)/buildroot; \ + @cp $(PWD)/deploy/iso/minikube-iso/go.hash buildroot/package/go/go.hash fi; - $(MAKE) BR2_EXTERNAL=../../deploy/iso/minikube-iso minikube_defconfig -C $(BUILD_DIR)/buildroot - $(MAKE) -C $(BUILD_DIR)/buildroot host-python - $(MAKE) -C $(BUILD_DIR)/buildroot + $(MAKE) BR2_EXTERNAL=../../deploy/iso/minikube-iso minikube_defconfig -C $(BUILD_DIR)/buildroot $(BUILDROOT_OPTIONS) + $(MAKE) -C $(BUILD_DIR)/buildroot $(BUILDROOT_OPTIONS) host-python + $(MAKE) -C $(BUILD_DIR)/buildroot $(BUILDROOT_OPTIONS) mv $(BUILD_DIR)/buildroot/output/images/rootfs.iso9660 $(BUILD_DIR)/minikube.iso # Change buildroot configuration for the minikube ISO .PHONY: iso-menuconfig iso-menuconfig: ## Configure buildroot configuration - $(MAKE) -C $(BUILD_DIR)/buildroot menuconfig - $(MAKE) -C $(BUILD_DIR)/buildroot savedefconfig + $(MAKE) -C $(BUILD_DIR)/buildroot $(BUILDROOT_OPTIONS) menuconfig + $(MAKE) -C $(BUILD_DIR)/buildroot $(BUILDROOT_OPTIONS) savedefconfig # Change the kernel configuration for the minikube ISO .PHONY: linux-menuconfig diff --git a/deploy/iso/minikube-iso/go.hash b/deploy/iso/minikube-iso/go.hash new file mode 100644 index 000000000000..8a04dc3b71a2 --- /dev/null +++ b/deploy/iso/minikube-iso/go.hash @@ -0,0 +1,4 @@ +# From https://golang.org/dl/ +sha256 f25b2441d4c76cf63cde94d59bab237cc33e8a2a139040d904c8630f46d061e5 go1.15.11.src.tar.gz +sha256 680a500cd8048750121677dd4dc055fdfd680ae83edc7ed60a4b927e466228eb go1.16.1.src.tar.gz +sha256 2d36597f7117c38b006835ae7f537487207d8ec407aa9d9980794b2030cbc067 LICENSE From 4156f3df2aa0990fb38d4753dbb889fbfccf32cd Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Tue, 14 Sep 2021 12:57:54 -0700 Subject: [PATCH 094/201] missing slash --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3291ef5151e5..0544112646b9 100644 --- a/Makefile +++ b/Makefile @@ -285,7 +285,7 @@ minikube_iso: deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/usr/b if [ ! -d $(BUILD_DIR)/buildroot ]; then \ mkdir -p $(BUILD_DIR); \ git clone --depth=1 --branch=$(BUILDROOT_BRANCH) https://github.com/buildroot/buildroot $(BUILD_DIR)/buildroot; \ - @cp $(PWD)/deploy/iso/minikube-iso/go.hash buildroot/package/go/go.hash + @cp $(PWD)/deploy/iso/minikube-iso/go.hash buildroot/package/go/go.hash; \ fi; $(MAKE) BR2_EXTERNAL=../../deploy/iso/minikube-iso minikube_defconfig -C $(BUILD_DIR)/buildroot $(BUILDROOT_OPTIONS) $(MAKE) -C $(BUILD_DIR)/buildroot $(BUILDROOT_OPTIONS) host-python From 6acb65ca712ded4f080579387e2b67bb201ca830 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Tue, 14 Sep 2021 13:12:07 -0700 Subject: [PATCH 095/201] make sure to delete image pull secrets on gcp auth addon disable --- pkg/addons/addons_gcpauth.go | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/pkg/addons/addons_gcpauth.go b/pkg/addons/addons_gcpauth.go index 4228918fc8c1..4f8101f1225f 100644 --- a/pkg/addons/addons_gcpauth.go +++ b/pkg/addons/addons_gcpauth.go @@ -99,7 +99,7 @@ func enableAddonGCPAuth(cfg *config.ClusterConfig) error { } if creds.JSON == nil { - out.WarningT("You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.") + out.WarningT("You have authenticated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.") return nil } @@ -333,6 +333,25 @@ func disableAddonGCPAuth(cfg *config.ClusterConfig) error { if err != nil { klog.Infof("error deleting secret: %v", err) } + + serviceaccounts := client.ServiceAccounts(n.Name) + salist, err := serviceaccounts.List(context.TODO(), metav1.ListOptions{}) + if err != nil { + klog.Infof("error getting service accounts: %v", err) + return err + } + for _, sa := range salist.Items { + for i, ps := range sa.ImagePullSecrets { + if ps.Name == secretName { + sa.ImagePullSecrets = append(sa.ImagePullSecrets[:i], sa.ImagePullSecrets[i+1:]...) + _, err := serviceaccounts.Update(context.TODO(), &sa, metav1.UpdateOptions{}) + if err != nil { + return err + } + break + } + } + } } return nil From 1d2e085f1c3181997e2a861a7114c0fe90f42ff2 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Tue, 14 Sep 2021 13:17:04 -0700 Subject: [PATCH 096/201] fix cp command --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0544112646b9..03f77e06d018 100644 --- a/Makefile +++ b/Makefile @@ -285,7 +285,7 @@ minikube_iso: deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/usr/b if [ ! -d $(BUILD_DIR)/buildroot ]; then \ mkdir -p $(BUILD_DIR); \ git clone --depth=1 --branch=$(BUILDROOT_BRANCH) https://github.com/buildroot/buildroot $(BUILD_DIR)/buildroot; \ - @cp $(PWD)/deploy/iso/minikube-iso/go.hash buildroot/package/go/go.hash; \ + cp $(PWD)/deploy/iso/minikube-iso/go.hash buildroot/package/go/go.hash; \ fi; $(MAKE) BR2_EXTERNAL=../../deploy/iso/minikube-iso minikube_defconfig -C $(BUILD_DIR)/buildroot $(BUILDROOT_OPTIONS) $(MAKE) -C $(BUILD_DIR)/buildroot $(BUILDROOT_OPTIONS) host-python From 5c1c7f0deb995fddc4d9b7b0a793c7093512ff76 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Tue, 14 Sep 2021 13:28:26 -0700 Subject: [PATCH 097/201] added build dir to path --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 03f77e06d018..a389caa98ace 100644 --- a/Makefile +++ b/Makefile @@ -285,7 +285,7 @@ minikube_iso: deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/usr/b if [ ! -d $(BUILD_DIR)/buildroot ]; then \ mkdir -p $(BUILD_DIR); \ git clone --depth=1 --branch=$(BUILDROOT_BRANCH) https://github.com/buildroot/buildroot $(BUILD_DIR)/buildroot; \ - cp $(PWD)/deploy/iso/minikube-iso/go.hash buildroot/package/go/go.hash; \ + cp $(PWD)/deploy/iso/minikube-iso/go.hash $(BUILD_DIR)/buildroot/package/go/go.hash; \ fi; $(MAKE) BR2_EXTERNAL=../../deploy/iso/minikube-iso minikube_defconfig -C $(BUILD_DIR)/buildroot $(BUILDROOT_OPTIONS) $(MAKE) -C $(BUILD_DIR)/buildroot $(BUILDROOT_OPTIONS) host-python From fe41ac3d264bb8e5a963d28d9a742a1c2d6bf658 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Tue, 14 Sep 2021 13:37:46 -0700 Subject: [PATCH 098/201] change BR2_EXTERNAL --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a389caa98ace..0ce1bd841e40 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,8 @@ KVM_GO_VERSION ?= $(GO_VERSION:.0=) INSTALL_SIZE ?= $(shell du out/minikube-windows-amd64.exe | cut -f1) BUILDROOT_BRANCH ?= 2021.02.4 GOLANG_OPTIONS = GO_VERSION=1.16.1 GO_HASH_FILE=$(PWD)/deploy/iso/minikube-iso/go.hash -BUILDROOT_OPTIONS = BR2_EXTERNAL=$(PWD)/external $(GOLANG_OPTIONS) +# BUILDROOT_OPTIONS = BR2_EXTERNAL=$(PWD)/external $(GOLANG_OPTIONS) +BUILDROOT_OPTIONS = BR2_EXTERNAL=../../deploy/iso/minikube-iso $(GOLANG_OPTIONS) REGISTRY ?= gcr.io/k8s-minikube # Get git commit id From f21263390c0fc822c82c890b74fa83d673dc2cc5 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Tue, 14 Sep 2021 14:01:07 -0700 Subject: [PATCH 099/201] add warning for ambassador addon --- cmd/minikube/cmd/config/enable.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/minikube/cmd/config/enable.go b/cmd/minikube/cmd/config/enable.go index 95de9a92f21f..fb88e3218865 100644 --- a/cmd/minikube/cmd/config/enable.go +++ b/cmd/minikube/cmd/config/enable.go @@ -46,6 +46,9 @@ var addonsEnableCmd = &cobra.Command{ out.Styled(style.Waiting, "using metrics-server addon, heapster is deprecated") addon = "metrics-server" } + if addon == "ambassador" { + out.Styled(style.Warning, "The ambassador addon has stopped working as of v1.23.0, for more details visit: https://github.com/datawire/ambassador-operator/issues/73") + } viper.Set(config.AddonImages, images) viper.Set(config.AddonRegistries, registries) err := addons.SetAndSave(ClusterFlagValue(), addon, "true") From ea81f090587e76ab7df7d32e0492752d6ac349fe Mon Sep 17 00:00:00 2001 From: Leif Ringstad Date: Tue, 14 Sep 2021 23:44:35 +0200 Subject: [PATCH 100/201] Use newer dashboard, to support ingress extensions This should solve #12402 and issues where ingresses will not show properly in the dashboard. This error shows on kubernetes 1.22 --- pkg/minikube/bootstrapper/images/images.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/minikube/bootstrapper/images/images.go b/pkg/minikube/bootstrapper/images/images.go index f54215d0e53e..d6b10356d6c1 100644 --- a/pkg/minikube/bootstrapper/images/images.go +++ b/pkg/minikube/bootstrapper/images/images.go @@ -146,7 +146,7 @@ func dashboardFrontend(repo string) string { repo = "docker.io" } // See 'kubernetes-dashboard' in deploy/addons/dashboard/dashboard-dp.yaml - return path.Join(repo, "kubernetesui", "dashboard:v2.1.0") + return path.Join(repo, "kubernetesui", "dashboard:v2.3.1") } // dashboardMetrics returns the image used for the dashboard metrics scraper @@ -155,7 +155,7 @@ func dashboardMetrics(repo string) string { repo = "docker.io" } // See 'dashboard-metrics-scraper' in deploy/addons/dashboard/dashboard-dp.yaml - return path.Join(repo, "kubernetesui", "metrics-scraper:v1.0.4") + return path.Join(repo, "kubernetesui", "metrics-scraper:v1.0.7") } // KindNet returns the image used for kindnet From 42064ea87261e40c33f0727f3a3878ab3e7b8815 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Tue, 14 Sep 2021 15:32:28 -0700 Subject: [PATCH 101/201] update go version --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0ce1bd841e40..e5e9e2a7088f 100644 --- a/Makefile +++ b/Makefile @@ -43,7 +43,7 @@ KVM_GO_VERSION ?= $(GO_VERSION:.0=) INSTALL_SIZE ?= $(shell du out/minikube-windows-amd64.exe | cut -f1) BUILDROOT_BRANCH ?= 2021.02.4 -GOLANG_OPTIONS = GO_VERSION=1.16.1 GO_HASH_FILE=$(PWD)/deploy/iso/minikube-iso/go.hash +GOLANG_OPTIONS = GO_VERSION=v1.17 GO_HASH_FILE=$(PWD)/deploy/iso/minikube-iso/go.hash # BUILDROOT_OPTIONS = BR2_EXTERNAL=$(PWD)/external $(GOLANG_OPTIONS) BUILDROOT_OPTIONS = BR2_EXTERNAL=../../deploy/iso/minikube-iso $(GOLANG_OPTIONS) REGISTRY ?= gcr.io/k8s-minikube From 0e02c5f820f559969a002f612b69564c03fc9786 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Tue, 14 Sep 2021 15:36:40 -0700 Subject: [PATCH 102/201] updated hash list --- deploy/iso/minikube-iso/go.hash | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/deploy/iso/minikube-iso/go.hash b/deploy/iso/minikube-iso/go.hash index 8a04dc3b71a2..d35d6ed5722b 100644 --- a/deploy/iso/minikube-iso/go.hash +++ b/deploy/iso/minikube-iso/go.hash @@ -1,4 +1,3 @@ # From https://golang.org/dl/ -sha256 f25b2441d4c76cf63cde94d59bab237cc33e8a2a139040d904c8630f46d061e5 go1.15.11.src.tar.gz -sha256 680a500cd8048750121677dd4dc055fdfd680ae83edc7ed60a4b927e466228eb go1.16.1.src.tar.gz -sha256 2d36597f7117c38b006835ae7f537487207d8ec407aa9d9980794b2030cbc067 LICENSE +sha256 3a70e5055509f347c0fb831ca07a2bf3b531068f349b14a3c652e9b5b67beb5d go1.17.src.tar.gz +sha256 2d36597f7117c38b006835ae7f537487207d8ec407aa9d9980794b2030cbc067 LICENSE From 9155921e35fe9c02a9636184bc5438ea7d51e8ad Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Tue, 14 Sep 2021 16:37:46 -0700 Subject: [PATCH 103/201] remove v from go version --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index e5e9e2a7088f..b3ac2f25dab3 100644 --- a/Makefile +++ b/Makefile @@ -43,7 +43,7 @@ KVM_GO_VERSION ?= $(GO_VERSION:.0=) INSTALL_SIZE ?= $(shell du out/minikube-windows-amd64.exe | cut -f1) BUILDROOT_BRANCH ?= 2021.02.4 -GOLANG_OPTIONS = GO_VERSION=v1.17 GO_HASH_FILE=$(PWD)/deploy/iso/minikube-iso/go.hash +GOLANG_OPTIONS = GO_VERSION=1.17 GO_HASH_FILE=$(PWD)/deploy/iso/minikube-iso/go.hash # BUILDROOT_OPTIONS = BR2_EXTERNAL=$(PWD)/external $(GOLANG_OPTIONS) BUILDROOT_OPTIONS = BR2_EXTERNAL=../../deploy/iso/minikube-iso $(GOLANG_OPTIONS) REGISTRY ?= gcr.io/k8s-minikube From d52130b292d08b0a6095e884aa0df76b8e13fcee Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Wed, 15 Sep 2021 00:37:07 +0000 Subject: [PATCH 104/201] Updating ISO to v1.23.0-1631662909-12425 --- Makefile | 2 +- pkg/minikube/download/iso.go | 2 +- site/content/en/docs/commands/start.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index b3ac2f25dab3..779dcc5f7998 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ KUBERNETES_VERSION ?= $(shell egrep "DefaultKubernetesVersion =" pkg/minikube/co KIC_VERSION ?= $(shell egrep "Version =" pkg/drivers/kic/types.go | cut -d \" -f2) # Default to .0 for higher cache hit rates, as build increments typically don't require new ISO versions -ISO_VERSION ?= v1.23.0 +ISO_VERSION ?= v1.23.0-1631662909-12425 # Dashes are valid in semver, but not Linux packaging. Use ~ to delimit alpha/beta DEB_VERSION ?= $(subst -,~,$(RAW_VERSION)) DEB_REVISION ?= 0 diff --git a/pkg/minikube/download/iso.go b/pkg/minikube/download/iso.go index 08f4042ba102..fb713b0a2e62 100644 --- a/pkg/minikube/download/iso.go +++ b/pkg/minikube/download/iso.go @@ -40,7 +40,7 @@ const fileScheme = "file" // DefaultISOURLs returns a list of ISO URL's to consult by default, in priority order func DefaultISOURLs() []string { v := version.GetISOVersion() - isoBucket := "minikube/iso" + isoBucket := "minikube-builds/iso/12425" return []string{ fmt.Sprintf("https://storage.googleapis.com/%s/minikube-%s.iso", isoBucket, v), fmt.Sprintf("https://github.com/kubernetes/minikube/releases/download/%s/minikube-%s.iso", v, v), diff --git a/site/content/en/docs/commands/start.md b/site/content/en/docs/commands/start.md index 9d7f8ded5a3d..535dd7e73460 100644 --- a/site/content/en/docs/commands/start.md +++ b/site/content/en/docs/commands/start.md @@ -65,7 +65,7 @@ minikube start [flags] --insecure-registry strings Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added. --install-addons If set, install addons. Defaults to true. (default true) --interactive Allow user prompts for more information (default true) - --iso-url strings Locations to fetch the minikube ISO from. (default [https://storage.googleapis.com/minikube/iso/minikube-v1.23.0.iso,https://github.com/kubernetes/minikube/releases/download/v1.23.0/minikube-v1.23.0.iso,https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.23.0.iso]) + --iso-url strings Locations to fetch the minikube ISO from. (default [https://storage.googleapis.com/minikube-builds/iso/12425/minikube-v1.23.0-1631662909-12425.iso,https://github.com/kubernetes/minikube/releases/download/v1.23.0-1631662909-12425/minikube-v1.23.0-1631662909-12425.iso,https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.23.0-1631662909-12425.iso]) --keep-context This will keep the existing kubectl context and will create a minikube context. --kubernetes-version string The Kubernetes version that the minikube VM will use (ex: v1.2.3, 'stable' for v1.22.1, 'latest' for v1.22.2-rc.0). Defaults to 'stable'. --kvm-gpu Enable experimental NVIDIA GPU support in minikube From 803fc43e264005ddd750c128fed56306b9b2a941 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Tue, 14 Sep 2021 17:41:26 -0700 Subject: [PATCH 105/201] fix ingress-dns addon and add test --- .../addons/ingress-dns/example/example.yaml | 4 +- .../addons/ingress/ingress-deploy.yaml.tmpl | 11 +++ pkg/minikube/assets/addons.go | 6 +- test/integration/addons_test.go | 50 +++++++---- .../testdata/ingress-dns-example.yaml | 87 +++++++++++++++++++ 5 files changed, 137 insertions(+), 21 deletions(-) create mode 100644 test/integration/testdata/ingress-dns-example.yaml diff --git a/deploy/addons/ingress-dns/example/example.yaml b/deploy/addons/ingress-dns/example/example.yaml index d166deb3efdf..dfdd9e35a0ba 100644 --- a/deploy/addons/ingress-dns/example/example.yaml +++ b/deploy/addons/ingress-dns/example/example.yaml @@ -38,10 +38,8 @@ kind: Ingress metadata: name: example-ingress namespace: kube-system - annotations: - # use the shared ingress-nginx - kubernetes.io/ingress.class: nginx spec: + ingressClassName: nginx rules: - host: hello-john.test http: diff --git a/deploy/addons/ingress/ingress-deploy.yaml.tmpl b/deploy/addons/ingress/ingress-deploy.yaml.tmpl index cc1ce8405681..264973405245 100644 --- a/deploy/addons/ingress/ingress-deploy.yaml.tmpl +++ b/deploy/addons/ingress/ingress-deploy.yaml.tmpl @@ -253,6 +253,17 @@ subjects: name: ingress-nginx namespace: ingress-nginx --- +apiVersion: networking.k8s.io/v1 +kind: IngressClass +metadata: + labels: + app.kubernetes.io/component: controller + name: nginx + annotations: + ingressclass.kubernetes.io/is-default-class: "true" +spec: + controller: k8s.io/ingress-nginx +--- # Source: ingress-nginx/templates/controller-service-webhook.yaml apiVersion: v1 kind: Service diff --git a/pkg/minikube/assets/addons.go b/pkg/minikube/assets/addons.go index 85e782a4c34b..c6db50f9d650 100755 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -480,8 +480,10 @@ var Addons = map[string]*Addon{ "ingress-dns-pod.yaml", "0640"), }, false, "ingress-dns", "", map[string]string{ - "IngressDNS": "cryptexlabs/minikube-ingress-dns:0.3.0@sha256:e252d2a4c704027342b303cc563e95d2e71d2a0f1404f55d676390e28d5093ab", - }, nil), + "IngressDNS": "k8s-minikube/minikube-ingress-dns:0.0.1@sha256:69dc3c878c2e49ad85b70fdf9e8e6e87a1f961f42c8029e0912bebfa828ade46", + }, map[string]string{ + "IngressDNS": "gcr.io", + }), "metallb": NewAddon([]*BinAsset{ MustBinAsset(addons.MetallbAssets, "metallb/metallb.yaml.tmpl", diff --git a/test/integration/addons_test.go b/test/integration/addons_test.go index 2a0b53734736..8e47b35c0214 100644 --- a/test/integration/addons_test.go +++ b/test/integration/addons_test.go @@ -69,7 +69,7 @@ func TestAddons(t *testing.T) { args := append([]string{"start", "-p", profile, "--wait=true", "--memory=4000", "--alsologtostderr", "--addons=registry", "--addons=metrics-server", "--addons=olm", "--addons=volumesnapshots", "--addons=csi-hostpath-driver"}, StartArgs()...) if !NoneDriver() { // none driver does not support ingress - args = append(args, "--addons=ingress") + args = append(args, "--addons=ingress", "--addons=ingress-dns") } if !arm64Platform() { args = append(args, "--addons=helm-tiller") @@ -156,7 +156,7 @@ func TestAddons(t *testing.T) { func validateIngressAddon(ctx context.Context, t *testing.T, profile string) { defer PostMortemLogs(t, profile) if NoneDriver() { - t.Skipf("skipping: ingress not supported ") + t.Skipf("skipping: ingress not supported") } client, err := kapi.Client(profile) @@ -168,7 +168,7 @@ func validateIngressAddon(ctx context.Context, t *testing.T, profile string) { // Error from server (InternalError): Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": dial tcp 10.107.218.58:443: i/o timeout // Error from server (InternalError): Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": context deadline exceeded if _, err = Run(t, exec.CommandContext(ctx, "kubectl", "--context", profile, "wait", "--for=condition=ready", "--namespace=ingress-nginx", "pod", "--selector=app.kubernetes.io/component=controller", "--timeout=90s")); err != nil { - t.Fatalf("failed waititing for ingress-nginx-controller : %v", err) + t.Fatalf("failed waiting for ingress-nginx-controller : %v", err) } // create networking.k8s.io/v1 ingress @@ -192,7 +192,7 @@ func validateIngressAddon(ctx context.Context, t *testing.T, profile string) { t.Errorf("failed to kubectl replace nginx-pod-svc. args %q. %v", rr.Command(), err) } - if _, err := PodWait(ctx, t, profile, "default", "run=nginx", Minutes(4)); err != nil { + if _, err := PodWait(ctx, t, profile, "default", "run=nginx", Minutes(8)); err != nil { t.Fatalf("failed waiting for ngnix pod: %v", err) } if err := kapi.WaitForService(client, "default", "nginx", true, time.Millisecond*500, Minutes(10)); err != nil { @@ -204,19 +204,11 @@ func validateIngressAddon(ctx context.Context, t *testing.T, profile string) { // check if the ingress can route nginx app with networking.k8s.io/v1 ingress checkv1Ingress := func() error { - var rr *RunResult - var err error - if NoneDriver() { // just run curl directly on the none driver - rr, err = Run(t, exec.CommandContext(ctx, "curl", "-s", addr, "-H", "'Host: nginx.example.com'")) - if err != nil { - return err - } - } else { - rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", fmt.Sprintf("curl -s %s -H 'Host: nginx.example.com'", addr))) - if err != nil { - return err - } + rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", fmt.Sprintf("curl -s %s -H 'Host: nginx.example.com'", addr))) + if err != nil { + return err } + stderr := rr.Stderr.String() if rr.Stderr.String() != "" { t.Logf("debug: unexpected stderr for %v:\n%s", rr.Command(), stderr) @@ -231,6 +223,32 @@ func validateIngressAddon(ctx context.Context, t *testing.T, profile string) { t.Errorf("failed to get expected response from %s within minikube: %v", addr, err) } + // check the ingress-dns addon here as well + rr, err = Run(t, exec.CommandContext(ctx, "kubectl", "--context", profile, "replace", "--force", "-f", filepath.Join(*testdataDir, "ingress-dns-example.yaml"))) + if err != nil { + t.Errorf("failed to kubectl replace ingress-dns-example. args %q. %v", rr.Command(), err) + } + + rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ip")) + if err != nil { + t.Errorf("failed to retrieve minikube ip. args %q : %v", rr.Command(), err) + } + ip := strings.TrimSuffix(rr.Stdout.String(), "\n") + + rr, err = Run(t, exec.CommandContext(ctx, "nslookup", "hello-john.test", ip)) + if err != nil { + t.Errorf("failed to nslookup hello-john.test host. args %q : %v", rr.Command(), err) + } + // nslookup should include info about the hello-john.test host, including minikube's ip + if !strings.Contains(rr.Stdout.String(), ip) { + t.Errorf("unexpected output from nslookup. stdout: %v\nstderr: %v", rr.Stdout.String(), rr.Stderr.String()) + } + + rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "addons", "disable", "ingress-dns", "--alsologtostderr", "-v=1")) + if err != nil { + t.Errorf("failed to disable ingress-dns addon. args %q : %v", rr.Command(), err) + } + rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "addons", "disable", "ingress", "--alsologtostderr", "-v=1")) if err != nil { t.Errorf("failed to disable ingress addon. args %q : %v", rr.Command(), err) diff --git a/test/integration/testdata/ingress-dns-example.yaml b/test/integration/testdata/ingress-dns-example.yaml new file mode 100644 index 000000000000..dfdd9e35a0ba --- /dev/null +++ b/test/integration/testdata/ingress-dns-example.yaml @@ -0,0 +1,87 @@ +# Copyright 2016 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: hello-world-app + namespace: default +spec: + selector: + matchLabels: + app: hello-world-app + template: + metadata: + labels: + app: hello-world-app + spec: + containers: + - name: hello-world-app + image: gcr.io/google-samples/hello-app:1.0 + ports: + - containerPort: 8080 +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: example-ingress + namespace: kube-system +spec: + ingressClassName: nginx + rules: + - host: hello-john.test + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: hello-world-app + port: + number: 80 + - host: hello-jane.test + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: hello-world-app + port: + number: 80 +--- +apiVersion: v1 +kind: Service +metadata: + name: hello-world-app + namespace: kube-system +spec: + type: ExternalName + externalName: hello-world-app.default.svc.cluster.local +--- +apiVersion: v1 +kind: Service +metadata: + name: hello-world-app + namespace: default +spec: + ports: + - name: http + port: 80 + targetPort: 8080 + protocol: TCP + type: NodePort + selector: + app: hello-world-app From 777a2e91e75e71b8d2f2d594020c084fa553cc4e Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Tue, 14 Sep 2021 18:12:58 -0700 Subject: [PATCH 106/201] add a retry to gcp auth disable to account for disappearing service accounts --- test/integration/addons_test.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/test/integration/addons_test.go b/test/integration/addons_test.go index 2a0b53734736..9026ae49af87 100644 --- a/test/integration/addons_test.go +++ b/test/integration/addons_test.go @@ -664,8 +664,15 @@ func validateGCPAuthAddon(ctx context.Context, t *testing.T, profile string) { } } - rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "addons", "disable", "gcp-auth", "--alsologtostderr", "-v=1")) - if err != nil { - t.Errorf("failed disabling gcp-auth addon. arg %q.s %v", rr.Command(), err) + disableGCPAuth := func() error { + _, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "addons", "disable", "gcp-auth", "--alsologtostderr", "-v=1")) + if err != nil { + return err + } + return nil + } + + if err := retry.Expo(disableGCPAuth, Minutes(2), Minutes(10), 5); err != nil { + t.Errorf("failed to disable GCP auth addon: %v", err) } } From 88c62ad46943d80773ead4d3cebb53203ad18480 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Wed, 15 Sep 2021 08:59:19 -0700 Subject: [PATCH 107/201] as usual, skip kube-system for pull secret --- pkg/addons/addons_gcpauth.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/addons/addons_gcpauth.go b/pkg/addons/addons_gcpauth.go index 4f8101f1225f..f8602e891b55 100644 --- a/pkg/addons/addons_gcpauth.go +++ b/pkg/addons/addons_gcpauth.go @@ -169,6 +169,9 @@ func createPullSecret(cc *config.ClusterConfig, creds *google.Credentials) error } for _, n := range namespaces.Items { + if n.Name == "kube-system" { + continue + } secrets := client.Secrets(n.Name) exists := false @@ -328,6 +331,9 @@ func disableAddonGCPAuth(cfg *config.ClusterConfig) error { // No need to check for an error here, if the secret doesn't exist, no harm done. for _, n := range namespaces.Items { + if n.Name == "kube-system" { + continue + } secrets := client.Secrets(n.Name) err := secrets.Delete(context.TODO(), secretName, metav1.DeleteOptions{}) if err != nil { From 728e97d154ee6f6ada7dd5531def5de978f36e05 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Wed, 15 Sep 2021 09:40:32 -0700 Subject: [PATCH 108/201] install dnsutils for nslookup on linux machines --- hack/jenkins/common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/jenkins/common.sh b/hack/jenkins/common.sh index 600e51ece06d..34edd0b1ba71 100755 --- a/hack/jenkins/common.sh +++ b/hack/jenkins/common.sh @@ -84,7 +84,7 @@ fi # We need pstree for the restart cronjobs if [ "$(uname)" != "Darwin" ]; then - sudo apt-get -y install lsof psmisc + sudo apt-get -y install lsof psmisc dnsutils else brew install pstree coreutils pidof ln -s /usr/local/bin/gtimeout /usr/local/bin/timeout || true From b9d7ac983dd68de861f6c962981dfd25d0b1477c Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Wed, 15 Sep 2021 09:41:22 -0700 Subject: [PATCH 109/201] remove commented out code --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index 779dcc5f7998..3b9411d313c4 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,6 @@ KVM_GO_VERSION ?= $(GO_VERSION:.0=) INSTALL_SIZE ?= $(shell du out/minikube-windows-amd64.exe | cut -f1) BUILDROOT_BRANCH ?= 2021.02.4 GOLANG_OPTIONS = GO_VERSION=1.17 GO_HASH_FILE=$(PWD)/deploy/iso/minikube-iso/go.hash -# BUILDROOT_OPTIONS = BR2_EXTERNAL=$(PWD)/external $(GOLANG_OPTIONS) BUILDROOT_OPTIONS = BR2_EXTERNAL=../../deploy/iso/minikube-iso $(GOLANG_OPTIONS) REGISTRY ?= gcr.io/k8s-minikube From 07c6aa0a52dfb95e89e99689c8f3f45bf5722157 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Wed, 15 Sep 2021 11:26:53 -0700 Subject: [PATCH 110/201] add comment about go version --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 3b9411d313c4..e40a535f76af 100644 --- a/Makefile +++ b/Makefile @@ -43,6 +43,7 @@ KVM_GO_VERSION ?= $(GO_VERSION:.0=) INSTALL_SIZE ?= $(shell du out/minikube-windows-amd64.exe | cut -f1) BUILDROOT_BRANCH ?= 2021.02.4 +# the go version on the line below is for the ISO and does not need to be updated often GOLANG_OPTIONS = GO_VERSION=1.17 GO_HASH_FILE=$(PWD)/deploy/iso/minikube-iso/go.hash BUILDROOT_OPTIONS = BR2_EXTERNAL=../../deploy/iso/minikube-iso $(GOLANG_OPTIONS) REGISTRY ?= gcr.io/k8s-minikube From e20880379386478665e8e978e4cbc60e3a77d5fe Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Wed, 15 Sep 2021 11:35:58 -0700 Subject: [PATCH 111/201] fix boilerplate date --- test/integration/testdata/ingress-dns-example.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/testdata/ingress-dns-example.yaml b/test/integration/testdata/ingress-dns-example.yaml index dfdd9e35a0ba..a4f7d196ec40 100644 --- a/test/integration/testdata/ingress-dns-example.yaml +++ b/test/integration/testdata/ingress-dns-example.yaml @@ -1,4 +1,4 @@ -# Copyright 2016 The Kubernetes Authors All rights reserved. +# Copyright 2021 The Kubernetes Authors All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From ea77a190749ffec7ac5aeef5bbf4a168ac55a981 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Wed, 15 Sep 2021 12:25:22 -0700 Subject: [PATCH 112/201] run gcp auth serially after all the other tests to avoid collision with CSI test --- test/integration/addons_test.go | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/test/integration/addons_test.go b/test/integration/addons_test.go index 9026ae49af87..39ef582d76ea 100644 --- a/test/integration/addons_test.go +++ b/test/integration/addons_test.go @@ -121,7 +121,6 @@ func TestAddons(t *testing.T) { {"HelmTiller", validateHelmTillerAddon}, {"Olm", validateOlmAddon}, {"CSI", validateCSIDriverAndSnapshots}, - {"GCPAuth", validateGCPAuthAddon}, } for _, tc := range tests { tc := tc @@ -135,6 +134,25 @@ func TestAddons(t *testing.T) { } }) + // Run other tests after to avoid collision + t.Run("serial", func(t *testing.T) { + tests := []struct { + name string + validator validateFunc + }{ + {"GCPAuth", validateGCPAuthAddon}, + } + for _, tc := range tests { + tc := tc + if ctx.Err() == context.DeadlineExceeded { + t.Fatalf("Unable to run more tests (deadline exceeded)") + } + t.Run(tc.name, func(t *testing.T) { + tc.validator(ctx, t, profile) + }) + } + }) + t.Run("StoppedEnableDisable", func(t *testing.T) { // Assert that disable/enable works offline rr, err := Run(t, exec.CommandContext(ctx, Target(), "stop", "-p", profile)) From 8db34077658d940de2f4ad3e72e6a53643f7d12f Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Wed, 15 Sep 2021 21:38:08 +0000 Subject: [PATCH 113/201] Update auto-generated docs and translations --- translations/de.json | 2 ++ translations/es.json | 2 ++ translations/fr.json | 2 ++ translations/ja.json | 2 ++ translations/ko.json | 2 ++ translations/pl.json | 2 ++ translations/strings.txt | 2 ++ translations/zh-CN.json | 2 ++ 8 files changed, 16 insertions(+) diff --git a/translations/de.json b/translations/de.json index 478dc10a59ea..0ac4ea5afaa7 100644 --- a/translations/de.json +++ b/translations/de.json @@ -623,6 +623,7 @@ "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "", "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "", "The \\\"{{.name}}\\\" container runtime requires CNI": "", + "The ambassador addon has stopped working as of v1.23.0, for more details visit: https://github.com/datawire/ambassador-operator/issues/73": "", "The apiserver listening port": "Der Überwachungsport des API-Servers", "The apiserver name which is used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "Der API-Servername, der im generierten Zertifikat für Kubernetes verwendet wird. Damit kann der API-Server von außerhalb des Computers verfügbar gemacht werden.", "The argument to pass the minikube mount command on start": "Das Argument, um den Bereitstellungsbefehl für minikube beim Start zu übergeben", @@ -824,6 +825,7 @@ "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", + "You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "Möglicherweise müssen Sie die VM \"{{.name}}\" manuell von Ihrem Hypervisor entfernen", diff --git a/translations/es.json b/translations/es.json index 4f5c02ac0a7a..46f0fed140df 100644 --- a/translations/es.json +++ b/translations/es.json @@ -629,6 +629,7 @@ "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "", "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "", "The \\\"{{.name}}\\\" container runtime requires CNI": "", + "The ambassador addon has stopped working as of v1.23.0, for more details visit: https://github.com/datawire/ambassador-operator/issues/73": "", "The apiserver listening port": "El puerto de escucha del apiserver", "The apiserver name which is used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "El nombre del apiserver del certificado de Kubernetes generado. Se puede utilizar para que sea posible acceder al apiserver desde fuera de la máquina", "The argument to pass the minikube mount command on start": "El argumento para ejecutar el comando de activación de minikube durante el inicio", @@ -830,6 +831,7 @@ "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", + "You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "Puede que tengas que retirar manualmente la VM \"{{.name}}\" de tu hipervisor", diff --git a/translations/fr.json b/translations/fr.json index 79055b0574a7..3c7f8ccf827d 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -632,6 +632,7 @@ "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "Le pilote VM s'est terminé avec une erreur et est peut-être corrompu. Exécutez 'minikube start' avec --alsologtostderr -v=8 pour voir l'erreur", "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "La machine virtuelle pour laquelle minikube est configuré n'existe plus. Exécutez 'minikube delete'", "The \\\"{{.name}}\\\" container runtime requires CNI": "L'environnement d'exécution du conteneur \\\"{{.name}}\\\" nécessite CNI", + "The ambassador addon has stopped working as of v1.23.0, for more details visit: https://github.com/datawire/ambassador-operator/issues/73": "", "The apiserver listening port": "Port d'écoute du serveur d'API.", "The apiserver name which is used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "Nom du serveur d'API utilisé dans le certificat généré pour Kubernetes. Vous pouvez l'utiliser si vous souhaitez que le serveur d'API soit disponible en dehors de la machine.", "The argument to pass the minikube mount command on start": "Argument à transmettre à la commande d'installation de minikube au démarrage.", @@ -838,6 +839,7 @@ "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "Vous ne pouvez pas modifier les processeurs d'un cluster minikube existant. Veuillez d'abord supprimer le cluster.", "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "Vous ne pouvez pas modifier la taille du disque pour un cluster minikube existant. Veuillez d'abord supprimer le cluster.", "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "Vous ne pouvez pas modifier la taille de la mémoire d'un cluster minikube existant. Veuillez d'abord supprimer le cluster.", + "You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "Vous avez choisi de désactiver le CNI mais le runtime du conteneur \\\"{{.name}}\\\" nécessite CNI", "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "Vous avez sélectionné le pilote \"virtualbox\", mais il existe de meilleures options !\nPour de meilleures performances et une meilleure assistance, envisagez d'utiliser un autre pilote: {{.drivers}}\n\nPour désactiver cet avertissement, exécutez :\n\n\t $ minikube config set WantVirtualBoxDriverWarning false\n\n\nPour en savoir plus sur les pilotes minikube, consultez https://minikube.sigs.k8s.io/docs/drivers/\nPour voir les benchmarks, consultez https://minikube.sigs.k8s. io/docs/benchmarks/cpuusage/\n\n", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "Vous devrez peut-être supprimer la VM \"{{.name}}\" manuellement de votre hyperviseur.", diff --git a/translations/ja.json b/translations/ja.json index 81bd7737b4ee..6829fad8f6eb 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -623,6 +623,7 @@ "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "", "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "", "The \\\"{{.name}}\\\" container runtime requires CNI": "", + "The ambassador addon has stopped working as of v1.23.0, for more details visit: https://github.com/datawire/ambassador-operator/issues/73": "", "The apiserver listening port": "API サーバー リスニング ポート", "The apiserver name which is used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "Kubernetes 用に生成された証明書で使用される API サーバー名。マシンの外部から API サーバーを利用できるようにする場合に使用します", "The argument to pass the minikube mount command on start": "起動時に minikube マウント コマンドを渡す引数", @@ -829,6 +830,7 @@ "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", + "You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "ハイパーバイザから「{{.name}}」VM を手動で削除することが必要な可能性があります", diff --git a/translations/ko.json b/translations/ko.json index 7849bef2b84f..f66206851e68 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -641,6 +641,7 @@ "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "", "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "", "The \\\"{{.name}}\\\" container runtime requires CNI": "", + "The ambassador addon has stopped working as of v1.23.0, for more details visit: https://github.com/datawire/ambassador-operator/issues/73": "", "The apiserver listening port": "API 서버 수신 포트", "The argument to pass the minikube mount command on start.": "", "The authoritative apiserver hostname for apiserver certificates and connectivity. This can be used if you want to make the apiserver available from outside the machine": "", @@ -831,6 +832,7 @@ "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", + "You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "", diff --git a/translations/pl.json b/translations/pl.json index a88e990b28ef..281f757874b9 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -644,6 +644,7 @@ "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "", "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "", "The \\\"{{.name}}\\\" container runtime requires CNI": "", + "The ambassador addon has stopped working as of v1.23.0, for more details visit: https://github.com/datawire/ambassador-operator/issues/73": "", "The apiserver listening port": "API nasłuchuje na porcie:", "The argument to pass the minikube mount command on start.": "", "The authoritative apiserver hostname for apiserver certificates and connectivity. This can be used if you want to make the apiserver available from outside the machine": "", @@ -841,6 +842,7 @@ "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", + "You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "", diff --git a/translations/strings.txt b/translations/strings.txt index b943fb9cc206..8c87ed5719fc 100644 --- a/translations/strings.txt +++ b/translations/strings.txt @@ -588,6 +588,7 @@ "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "", "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "", "The \\\"{{.name}}\\\" container runtime requires CNI": "", + "The ambassador addon has stopped working as of v1.23.0, for more details visit: https://github.com/datawire/ambassador-operator/issues/73": "", "The apiserver listening port": "", "The argument to pass the minikube mount command on start.": "", "The authoritative apiserver hostname for apiserver certificates and connectivity. This can be used if you want to make the apiserver available from outside the machine": "", @@ -769,6 +770,7 @@ "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", + "You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "", diff --git a/translations/zh-CN.json b/translations/zh-CN.json index ab9509fe3780..cd17386e2e89 100644 --- a/translations/zh-CN.json +++ b/translations/zh-CN.json @@ -730,6 +730,7 @@ "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "", "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "", "The \\\"{{.name}}\\\" container runtime requires CNI": "", + "The ambassador addon has stopped working as of v1.23.0, for more details visit: https://github.com/datawire/ambassador-operator/issues/73": "", "The apiserver listening port": "apiserver 侦听端口", "The apiserver name which is used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "在为 kubernetes 生成的证书中使用的 apiserver 名称。如果您希望将此 apiserver 设置为可从机器外部访问,则可以使用这组 apiserver 名称", "The argument to pass the minikube mount command on start": "用于在启动时传递 minikube 装载命令的参数", @@ -945,6 +946,7 @@ "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", + "You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "您可能需要从管理程序中手动移除“{{.name}}”虚拟机", From ff591d3e1508a743a3991e278457268803cade1f Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Thu, 16 Sep 2021 00:14:29 +0000 Subject: [PATCH 114/201] Update auto-generated docs and translations --- translations/de.json | 2 +- translations/es.json | 2 +- translations/fr.json | 2 +- translations/ja.json | 2 +- translations/ko.json | 2 +- translations/pl.json | 2 +- translations/strings.txt | 2 +- translations/zh-CN.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/translations/de.json b/translations/de.json index 0ac4ea5afaa7..bf5a2bfac069 100644 --- a/translations/de.json +++ b/translations/de.json @@ -825,7 +825,7 @@ "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", - "You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", + "You have authenticated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "Möglicherweise müssen Sie die VM \"{{.name}}\" manuell von Ihrem Hypervisor entfernen", diff --git a/translations/es.json b/translations/es.json index 46f0fed140df..46802dc8f6e8 100644 --- a/translations/es.json +++ b/translations/es.json @@ -831,7 +831,7 @@ "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", - "You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", + "You have authenticated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "Puede que tengas que retirar manualmente la VM \"{{.name}}\" de tu hipervisor", diff --git a/translations/fr.json b/translations/fr.json index 3c7f8ccf827d..cd855693b3d0 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -839,7 +839,7 @@ "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "Vous ne pouvez pas modifier les processeurs d'un cluster minikube existant. Veuillez d'abord supprimer le cluster.", "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "Vous ne pouvez pas modifier la taille du disque pour un cluster minikube existant. Veuillez d'abord supprimer le cluster.", "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "Vous ne pouvez pas modifier la taille de la mémoire d'un cluster minikube existant. Veuillez d'abord supprimer le cluster.", - "You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", + "You have authenticated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "Vous avez choisi de désactiver le CNI mais le runtime du conteneur \\\"{{.name}}\\\" nécessite CNI", "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "Vous avez sélectionné le pilote \"virtualbox\", mais il existe de meilleures options !\nPour de meilleures performances et une meilleure assistance, envisagez d'utiliser un autre pilote: {{.drivers}}\n\nPour désactiver cet avertissement, exécutez :\n\n\t $ minikube config set WantVirtualBoxDriverWarning false\n\n\nPour en savoir plus sur les pilotes minikube, consultez https://minikube.sigs.k8s.io/docs/drivers/\nPour voir les benchmarks, consultez https://minikube.sigs.k8s. io/docs/benchmarks/cpuusage/\n\n", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "Vous devrez peut-être supprimer la VM \"{{.name}}\" manuellement de votre hyperviseur.", diff --git a/translations/ja.json b/translations/ja.json index 6829fad8f6eb..d2e900ea13d8 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -830,7 +830,7 @@ "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", - "You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", + "You have authenticated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "ハイパーバイザから「{{.name}}」VM を手動で削除することが必要な可能性があります", diff --git a/translations/ko.json b/translations/ko.json index f66206851e68..18aa72707cea 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -832,7 +832,7 @@ "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", - "You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", + "You have authenticated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "", diff --git a/translations/pl.json b/translations/pl.json index 281f757874b9..72608fa1f7a5 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -842,7 +842,7 @@ "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", - "You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", + "You have authenticated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "", diff --git a/translations/strings.txt b/translations/strings.txt index 8c87ed5719fc..a74a74f25a39 100644 --- a/translations/strings.txt +++ b/translations/strings.txt @@ -770,7 +770,7 @@ "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", - "You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", + "You have authenticated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "", diff --git a/translations/zh-CN.json b/translations/zh-CN.json index cd17386e2e89..a3bbe3bf1b88 100644 --- a/translations/zh-CN.json +++ b/translations/zh-CN.json @@ -946,7 +946,7 @@ "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", - "You have authenicated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", + "You have authenticated with a service account that does not have an associated JSON. The GCP Auth requires credentials with a JSON file to in order to continue. The image pull secret has been imported.": "", "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "您可能需要从管理程序中手动移除“{{.name}}”虚拟机", From 60d611eefffeb540df38a84837aca44ec0f08261 Mon Sep 17 00:00:00 2001 From: Brian de Alwis Date: Thu, 16 Sep 2021 11:32:06 -0400 Subject: [PATCH 115/201] doc: be more specific as to what the gcp-auth does --- site/content/en/docs/handbook/addons/gcp-auth.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/site/content/en/docs/handbook/addons/gcp-auth.md b/site/content/en/docs/handbook/addons/gcp-auth.md index 46f71bbe1d04..21b6d2fe62af 100644 --- a/site/content/en/docs/handbook/addons/gcp-auth.md +++ b/site/content/en/docs/handbook/addons/gcp-auth.md @@ -5,9 +5,16 @@ weight: 1 date: 2020-07-15 --- -## Tutorial -If you have a containerized GCP app with a Kubernetes yaml, you can automatically add your credentials to all your deployed pods dynamically with this minikube addon. You just need to have a credentials file, which can be generated with `gcloud auth application-default login`. If you already have a json credentials file you want specify, use the GOOGLE_APPLICATION_CREDENTIALS environment variable. +The gcp-auth addon automatically and dynamically configures pods to use your credentials, allowing applications to access Google Cloud services as if they were running within Google Cloud. + +The addon normally uses the [Google Application Default Credentials](https://google.aip.dev/auth/4110) as configured with `gcloud auth application-default login`. If you already have a json credentials file you want specify, such as to use a service account, set the GOOGLE_APPLICATION_CREDENTIALS environment variable to point to that file. + +The addon normally uses the default gcloud project as configured with `gcloud config set project `. If you want to use a different project, set the `GOOGLE_CLOUD_PROJECT` environment variable to the desired project. + +The pods are configured with the `GOOGLE_APPLICATION_DEFAULTS` environment variable is set, which is automatically used by GCP client libraries, and the `GOOGLE_CLOUD_PROJECT` environment variable is set, as are several other historical environment variables. The addon also configures [registry pull secrets](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/) to allow the cluster to access container images hosted in your project's [Artifact Registry](https://cloud.google.com/artifact-registry) and [Google Container Registry](https://cloud.google.com/container-registry). + +## Tutorial - Start a cluster: @@ -90,4 +97,4 @@ If you had already deployed pods to your minikube cluster before enabling the gc 1. If you use a Deployment to deploy your pods, just delete the existing pods with `kubectl delete pod `. The deployment will then automatically recreate the pod and it will have the correct credentials. -2. minikube can delete and recreate your pods for you, by running `minikube addons enable gcp-auth --refresh`. It does not matter if you have already enabled the addon or not. \ No newline at end of file +2. minikube can delete and recreate your pods for you, by running `minikube addons enable gcp-auth --refresh`. It does not matter if you have already enabled the addon or not. From 40c44fa1ef6c44b9ce8ed8c35f425db60827e0ba Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 16 Sep 2021 10:31:43 -0700 Subject: [PATCH 116/201] fix unit tests, change addon yaml, bump preload version --- go.mod | 103 ------------------ pkg/minikube/assets/addons.go | 4 +- .../bootstrapper/images/images_test.go | 8 +- .../bootstrapper/images/kubeadm_test.go | 24 ++-- pkg/minikube/download/preload.go | 2 +- 5 files changed, 19 insertions(+), 122 deletions(-) diff --git a/go.mod b/go.mod index a734f6744b86..d211044f9030 100644 --- a/go.mod +++ b/go.mod @@ -99,112 +99,9 @@ require ( ) require ( - cloud.google.com/go v0.93.3 // indirect cloud.google.com/go/container v0.1.0 // indirect cloud.google.com/go/monitoring v0.1.0 // indirect cloud.google.com/go/trace v0.1.0 // indirect - github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect - github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd // indirect - github.com/Microsoft/go-winio v0.5.0 // indirect - github.com/StackExchange/wmi v1.2.1 // indirect - github.com/VividCortex/ewma v1.1.1 // indirect - github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af // indirect - github.com/aws/aws-sdk-go v1.35.24 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect - github.com/census-instrumentation/opencensus-proto v0.2.1 // indirect - github.com/cespare/xxhash/v2 v2.1.1 // indirect - github.com/containerd/cgroups v1.0.1 // indirect - github.com/containerd/containerd v1.5.2 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.7.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/cli v20.10.7+incompatible // indirect - github.com/docker/distribution v2.7.1+incompatible // indirect - github.com/docker/docker-credential-helpers v0.6.3 // indirect - github.com/docker/go-connections v0.4.0 // indirect - github.com/evanphx/json-patch v4.9.0+incompatible // indirect - github.com/fatih/color v1.10.0 // indirect - github.com/fogleman/gg v1.3.0 // indirect - github.com/fsnotify/fsnotify v1.4.9 // indirect - github.com/go-fonts/liberation v0.1.1 // indirect - github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07 // indirect - github.com/go-logr/logr v1.0.0 // indirect - github.com/go-ole/go-ole v1.2.5 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/golang/snappy v0.0.3 // indirect - github.com/google/go-querystring v1.0.0 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/googleapis/gax-go/v2 v2.1.0 // indirect - github.com/googleapis/gnostic v0.4.1 // indirect - github.com/gookit/color v1.4.2 // indirect - github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-safetemp v1.0.0 // indirect - github.com/hashicorp/go-version v1.2.1 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/imdario/mergo v0.3.11 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/json-iterator/go v1.1.11 // indirect - github.com/klauspost/compress v1.13.0 // indirect - github.com/magiconair/properties v1.8.5 // indirect - github.com/mattn/go-colorable v0.1.8 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/miekg/dns v1.1.35 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/go-testing-interface v1.0.0 // indirect - github.com/mitchellh/go-wordwrap v1.0.0 // indirect - github.com/mitchellh/mapstructure v1.4.1 // indirect - github.com/moby/spdystream v0.2.0 // indirect - github.com/moby/sys/mountinfo v0.4.1 // indirect - github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.1 // indirect - github.com/opencontainers/image-spec v1.0.1 // indirect - github.com/opencontainers/runc v1.0.0-rc95 // indirect - github.com/pelletier/go-toml v1.9.3 // indirect - github.com/phpdave11/gofpdf v1.4.2 // indirect - github.com/prometheus/client_golang v1.7.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.10.0 // indirect - github.com/prometheus/procfs v0.6.0 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/spf13/afero v1.6.0 // indirect - github.com/spf13/cast v1.3.1 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/subosito/gotenv v1.2.0 // indirect - github.com/tklauser/go-sysconf v0.3.9 // indirect - github.com/tklauser/numcpus v0.3.0 // indirect - github.com/ulikunitz/xz v0.5.8 // indirect - github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect - github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect - go.opentelemetry.io/otel/metric v0.17.0 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.17.0 // indirect - golang.org/x/image v0.0.0-20210216034530-4410531fe030 // indirect - golang.org/x/net v0.0.0-20210525063256-abc453219eb5 // indirect - golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71 // indirect - google.golang.org/grpc v1.40.0 // indirect - google.golang.org/protobuf v1.27.1 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.62.0 // indirect - k8s.io/cluster-bootstrap v0.0.0 // indirect - k8s.io/component-base v0.21.2 // indirect - k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 // indirect - k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect - sigs.k8s.io/yaml v1.2.0 // indirect ) replace ( diff --git a/pkg/minikube/assets/addons.go b/pkg/minikube/assets/addons.go index 85e782a4c34b..f81e113d19c6 100755 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -134,8 +134,8 @@ var Addons = map[string]*Addon{ MustBinAsset(addons.DashboardAssets, "dashboard/dashboard-secret.yaml", vmpath.GuestAddonsDir, "dashboard-secret.yaml", "0640"), MustBinAsset(addons.DashboardAssets, "dashboard/dashboard-svc.yaml", vmpath.GuestAddonsDir, "dashboard-svc.yaml", "0640"), }, false, "dashboard", "kubernetes", map[string]string{ - "Dashboard": "kubernetesui/dashboard:v2.1.0@sha256:7f80b5ba141bead69c4fee8661464857af300d7d7ed0274cf7beecedc00322e6", - "MetricsScraper": "kubernetesui/metrics-scraper:v1.0.4@sha256:555981a24f184420f3be0c79d4efb6c948a85cfce84034f85a563f4151a81cbf", + "Dashboard": "kubernetesui/dashboard:v2.3.1@sha256:ec27f462cf1946220f5a9ace416a84a57c18f98c777876a8054405d1428cc92e", + "MetricsScraper": "kubernetesui/metrics-scraper:v1.0.7@sha256:ec27f462cf1946220f5a9ace416a84a57c18f98c777876a8054405d1428cc92e", }, nil), "default-storageclass": NewAddon([]*BinAsset{ MustBinAsset(addons.DefaultStorageClassAssets, diff --git a/pkg/minikube/bootstrapper/images/images_test.go b/pkg/minikube/bootstrapper/images/images_test.go index e2bed3f86fc8..b5553323680c 100644 --- a/pkg/minikube/bootstrapper/images/images_test.go +++ b/pkg/minikube/bootstrapper/images/images_test.go @@ -94,8 +94,8 @@ k8s.gcr.io/coredns/coredns:v1.8.4 func TestAuxiliary(t *testing.T) { want := []string{ "gcr.io/k8s-minikube/storage-provisioner:" + version.GetStorageProvisionerVersion(), - "docker.io/kubernetesui/dashboard:v2.1.0", - "docker.io/kubernetesui/metrics-scraper:v1.0.4", + "docker.io/kubernetesui/dashboard:v2.3.1", + "docker.io/kubernetesui/metrics-scraper:v1.0.7", } got := auxiliary("") if diff := cmp.Diff(want, got); diff != "" { @@ -106,8 +106,8 @@ func TestAuxiliary(t *testing.T) { func TestAuxiliaryMirror(t *testing.T) { want := []string{ "test.mirror/k8s-minikube/storage-provisioner:" + version.GetStorageProvisionerVersion(), - "test.mirror/kubernetesui/dashboard:v2.1.0", - "test.mirror/kubernetesui/metrics-scraper:v1.0.4", + "test.mirror/kubernetesui/dashboard:v2.3.1", + "test.mirror/kubernetesui/metrics-scraper:v1.0.7", } got := auxiliary("test.mirror") if diff := cmp.Diff(want, got); diff != "" { diff --git a/pkg/minikube/bootstrapper/images/kubeadm_test.go b/pkg/minikube/bootstrapper/images/kubeadm_test.go index 0dd86016802a..56ddda36daa5 100644 --- a/pkg/minikube/bootstrapper/images/kubeadm_test.go +++ b/pkg/minikube/bootstrapper/images/kubeadm_test.go @@ -43,8 +43,8 @@ func TestKubeadmImages(t *testing.T) { "k8s.gcr.io/etcd:3.4.3-0", "k8s.gcr.io/pause:3.1", "gcr.io/k8s-minikube/storage-provisioner:" + version.GetStorageProvisionerVersion(), - "docker.io/kubernetesui/dashboard:v2.1.0", - "docker.io/kubernetesui/metrics-scraper:v1.0.4", + "docker.io/kubernetesui/dashboard:v2.3.1", + "docker.io/kubernetesui/metrics-scraper:v1.0.7", }}, {"v1.16.1", "mirror.k8s.io", false, []string{ "mirror.k8s.io/kube-proxy:v1.16.1", @@ -55,8 +55,8 @@ func TestKubeadmImages(t *testing.T) { "mirror.k8s.io/etcd:3.3.15-0", "mirror.k8s.io/pause:3.1", "mirror.k8s.io/k8s-minikube/storage-provisioner:" + version.GetStorageProvisionerVersion(), - "mirror.k8s.io/kubernetesui/dashboard:v2.1.0", - "mirror.k8s.io/kubernetesui/metrics-scraper:v1.0.4", + "mirror.k8s.io/kubernetesui/dashboard:v2.3.1", + "mirror.k8s.io/kubernetesui/metrics-scraper:v1.0.7", }}, {"v1.15.0", "", false, []string{ "k8s.gcr.io/kube-proxy:v1.15.0", @@ -67,8 +67,8 @@ func TestKubeadmImages(t *testing.T) { "k8s.gcr.io/etcd:3.3.10", "k8s.gcr.io/pause:3.1", "gcr.io/k8s-minikube/storage-provisioner:" + version.GetStorageProvisionerVersion(), - "docker.io/kubernetesui/dashboard:v2.1.0", - "docker.io/kubernetesui/metrics-scraper:v1.0.4", + "docker.io/kubernetesui/dashboard:v2.3.1", + "docker.io/kubernetesui/metrics-scraper:v1.0.7", }}, {"v1.14.0", "", false, []string{ "k8s.gcr.io/kube-proxy:v1.14.0", @@ -79,8 +79,8 @@ func TestKubeadmImages(t *testing.T) { "k8s.gcr.io/etcd:3.3.10", "k8s.gcr.io/pause:3.1", "gcr.io/k8s-minikube/storage-provisioner:" + version.GetStorageProvisionerVersion(), - "docker.io/kubernetesui/dashboard:v2.1.0", - "docker.io/kubernetesui/metrics-scraper:v1.0.4", + "docker.io/kubernetesui/dashboard:v2.3.1", + "docker.io/kubernetesui/metrics-scraper:v1.0.7", }}, {"v1.13.0", "", false, []string{ "k8s.gcr.io/kube-proxy:v1.13.0", @@ -91,8 +91,8 @@ func TestKubeadmImages(t *testing.T) { "k8s.gcr.io/etcd:3.2.24", "k8s.gcr.io/pause:3.1", "gcr.io/k8s-minikube/storage-provisioner:" + version.GetStorageProvisionerVersion(), - "docker.io/kubernetesui/dashboard:v2.1.0", - "docker.io/kubernetesui/metrics-scraper:v1.0.4", + "docker.io/kubernetesui/dashboard:v2.3.1", + "docker.io/kubernetesui/metrics-scraper:v1.0.7", }}, {"v1.12.0", "", false, []string{ "k8s.gcr.io/kube-proxy:v1.12.0", @@ -103,8 +103,8 @@ func TestKubeadmImages(t *testing.T) { "k8s.gcr.io/etcd:3.2.24", "k8s.gcr.io/pause:3.1", "gcr.io/k8s-minikube/storage-provisioner:" + version.GetStorageProvisionerVersion(), - "docker.io/kubernetesui/dashboard:v2.1.0", - "docker.io/kubernetesui/metrics-scraper:v1.0.4", + "docker.io/kubernetesui/dashboard:v2.3.1", + "docker.io/kubernetesui/metrics-scraper:v1.0.7", }}, {"v1.11.0", "", true, nil}, {"v1.10.0", "", true, nil}, diff --git a/pkg/minikube/download/preload.go b/pkg/minikube/download/preload.go index 428f595e98e9..2141bfd027d5 100644 --- a/pkg/minikube/download/preload.go +++ b/pkg/minikube/download/preload.go @@ -43,7 +43,7 @@ const ( // PreloadVersion is the current version of the preloaded tarball // // NOTE: You may need to bump this version up when upgrading auxiliary docker images - PreloadVersion = "v12" + PreloadVersion = "v13" // PreloadBucket is the name of the GCS bucket where preloaded volume tarballs exist PreloadBucket = "minikube-preloaded-volume-tarballs" ) From 61432f72a3702ff077ebe984a68fb677d271b5a8 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 16 Sep 2021 10:36:50 -0700 Subject: [PATCH 117/201] fix go mod --- go.mod | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/go.mod b/go.mod index d211044f9030..a734f6744b86 100644 --- a/go.mod +++ b/go.mod @@ -99,9 +99,112 @@ require ( ) require ( + cloud.google.com/go v0.93.3 // indirect cloud.google.com/go/container v0.1.0 // indirect cloud.google.com/go/monitoring v0.1.0 // indirect cloud.google.com/go/trace v0.1.0 // indirect + github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect + github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd // indirect + github.com/Microsoft/go-winio v0.5.0 // indirect + github.com/StackExchange/wmi v1.2.1 // indirect + github.com/VividCortex/ewma v1.1.1 // indirect + github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af // indirect + github.com/aws/aws-sdk-go v1.35.24 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect + github.com/census-instrumentation/opencensus-proto v0.2.1 // indirect + github.com/cespare/xxhash/v2 v2.1.1 // indirect + github.com/containerd/cgroups v1.0.1 // indirect + github.com/containerd/containerd v1.5.2 // indirect + github.com/containerd/stargz-snapshotter/estargz v0.7.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/docker/cli v20.10.7+incompatible // indirect + github.com/docker/distribution v2.7.1+incompatible // indirect + github.com/docker/docker-credential-helpers v0.6.3 // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/evanphx/json-patch v4.9.0+incompatible // indirect + github.com/fatih/color v1.10.0 // indirect + github.com/fogleman/gg v1.3.0 // indirect + github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/go-fonts/liberation v0.1.1 // indirect + github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07 // indirect + github.com/go-logr/logr v1.0.0 // indirect + github.com/go-ole/go-ole v1.2.5 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/snappy v0.0.3 // indirect + github.com/google/go-querystring v1.0.0 // indirect + github.com/google/gofuzz v1.1.0 // indirect + github.com/googleapis/gax-go/v2 v2.1.0 // indirect + github.com/googleapis/gnostic v0.4.1 // indirect + github.com/gookit/color v1.4.2 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-safetemp v1.0.0 // indirect + github.com/hashicorp/go-version v1.2.1 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/imdario/mergo v0.3.11 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/json-iterator/go v1.1.11 // indirect + github.com/klauspost/compress v1.13.0 // indirect + github.com/magiconair/properties v1.8.5 // indirect + github.com/mattn/go-colorable v0.1.8 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/miekg/dns v1.1.35 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-testing-interface v1.0.0 // indirect + github.com/mitchellh/go-wordwrap v1.0.0 // indirect + github.com/mitchellh/mapstructure v1.4.1 // indirect + github.com/moby/spdystream v0.2.0 // indirect + github.com/moby/sys/mountinfo v0.4.1 // indirect + github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.1 // indirect + github.com/opencontainers/image-spec v1.0.1 // indirect + github.com/opencontainers/runc v1.0.0-rc95 // indirect + github.com/pelletier/go-toml v1.9.3 // indirect + github.com/phpdave11/gofpdf v1.4.2 // indirect + github.com/prometheus/client_golang v1.7.1 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.10.0 // indirect + github.com/prometheus/procfs v0.6.0 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + github.com/spf13/afero v1.6.0 // indirect + github.com/spf13/cast v1.3.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/subosito/gotenv v1.2.0 // indirect + github.com/tklauser/go-sysconf v0.3.9 // indirect + github.com/tklauser/numcpus v0.3.0 // indirect + github.com/ulikunitz/xz v0.5.8 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect + go.opentelemetry.io/otel/metric v0.17.0 // indirect + go.uber.org/atomic v1.7.0 // indirect + go.uber.org/multierr v1.6.0 // indirect + go.uber.org/zap v1.17.0 // indirect + golang.org/x/image v0.0.0-20210216034530-4410531fe030 // indirect + golang.org/x/net v0.0.0-20210525063256-abc453219eb5 // indirect + golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71 // indirect + google.golang.org/grpc v1.40.0 // indirect + google.golang.org/protobuf v1.27.1 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.62.0 // indirect + k8s.io/cluster-bootstrap v0.0.0 // indirect + k8s.io/component-base v0.21.2 // indirect + k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 // indirect + k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect + sigs.k8s.io/yaml v1.2.0 // indirect ) replace ( From f0636429fb2b21fccd6856b3ca9781eda72c7831 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Thu, 16 Sep 2021 18:00:10 +0000 Subject: [PATCH 118/201] Update ISO to v1.23.1 --- Makefile | 2 +- pkg/minikube/download/iso.go | 2 +- site/content/en/docs/commands/start.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index e40a535f76af..c6489465f08b 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ KUBERNETES_VERSION ?= $(shell egrep "DefaultKubernetesVersion =" pkg/minikube/co KIC_VERSION ?= $(shell egrep "Version =" pkg/drivers/kic/types.go | cut -d \" -f2) # Default to .0 for higher cache hit rates, as build increments typically don't require new ISO versions -ISO_VERSION ?= v1.23.0-1631662909-12425 +ISO_VERSION ?= v1.23.1 # Dashes are valid in semver, but not Linux packaging. Use ~ to delimit alpha/beta DEB_VERSION ?= $(subst -,~,$(RAW_VERSION)) DEB_REVISION ?= 0 diff --git a/pkg/minikube/download/iso.go b/pkg/minikube/download/iso.go index fb713b0a2e62..08f4042ba102 100644 --- a/pkg/minikube/download/iso.go +++ b/pkg/minikube/download/iso.go @@ -40,7 +40,7 @@ const fileScheme = "file" // DefaultISOURLs returns a list of ISO URL's to consult by default, in priority order func DefaultISOURLs() []string { v := version.GetISOVersion() - isoBucket := "minikube-builds/iso/12425" + isoBucket := "minikube/iso" return []string{ fmt.Sprintf("https://storage.googleapis.com/%s/minikube-%s.iso", isoBucket, v), fmt.Sprintf("https://github.com/kubernetes/minikube/releases/download/%s/minikube-%s.iso", v, v), diff --git a/site/content/en/docs/commands/start.md b/site/content/en/docs/commands/start.md index 535dd7e73460..a826169cdfc4 100644 --- a/site/content/en/docs/commands/start.md +++ b/site/content/en/docs/commands/start.md @@ -65,7 +65,7 @@ minikube start [flags] --insecure-registry strings Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added. --install-addons If set, install addons. Defaults to true. (default true) --interactive Allow user prompts for more information (default true) - --iso-url strings Locations to fetch the minikube ISO from. (default [https://storage.googleapis.com/minikube-builds/iso/12425/minikube-v1.23.0-1631662909-12425.iso,https://github.com/kubernetes/minikube/releases/download/v1.23.0-1631662909-12425/minikube-v1.23.0-1631662909-12425.iso,https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.23.0-1631662909-12425.iso]) + --iso-url strings Locations to fetch the minikube ISO from. (default [https://storage.googleapis.com/minikube/iso/minikube-v1.23.1.iso,https://github.com/kubernetes/minikube/releases/download/v1.23.1/minikube-v1.23.1.iso,https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.23.1.iso]) --keep-context This will keep the existing kubectl context and will create a minikube context. --kubernetes-version string The Kubernetes version that the minikube VM will use (ex: v1.2.3, 'stable' for v1.22.1, 'latest' for v1.22.2-rc.0). Defaults to 'stable'. --kvm-gpu Enable experimental NVIDIA GPU support in minikube From 1976e1b296fbae3d91bc1634f5a04ed21314bf41 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Thu, 16 Sep 2021 18:55:00 +0000 Subject: [PATCH 119/201] Update kicbase to v0.0.27 --- pkg/drivers/kic/types.go | 8 ++++---- site/content/en/docs/commands/start.md | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/drivers/kic/types.go b/pkg/drivers/kic/types.go index 90edf821fe64..6c116840c8c5 100644 --- a/pkg/drivers/kic/types.go +++ b/pkg/drivers/kic/types.go @@ -24,13 +24,13 @@ import ( const ( // Version is the current version of kic - Version = "v0.0.26-1631295795-12425" + Version = "v0.0.27" // SHA of the kic base image - baseImageSHA = "7d61c0b6cf6832c8015ada78640635c5ab74b72f12f51bcc4c7660b0be01af56" + baseImageSHA = "89b4738ee74ba28684676e176752277f0db46f57d27f0e08c3feec89311e22de" // The name of the GCR kicbase repository - gcrRepo = "gcr.io/k8s-minikube/kicbase-builds" + gcrRepo = "gcr.io/k8s-minikube/kicbase" // The name of the Dockerhub kicbase repository - dockerhubRepo = "docker.io/kicbase/build" + dockerhubRepo = "docker.io/kicbase/stable" ) var ( diff --git a/site/content/en/docs/commands/start.md b/site/content/en/docs/commands/start.md index 535dd7e73460..a1b85a937c26 100644 --- a/site/content/en/docs/commands/start.md +++ b/site/content/en/docs/commands/start.md @@ -26,7 +26,7 @@ minikube start [flags] --apiserver-names strings A set of apiserver names which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine --apiserver-port int The apiserver listening port (default 8443) --auto-update-drivers If set, automatically updates drivers to the latest version. Defaults to true. (default true) - --base-image string The base image to use for docker/podman drivers. Intended for local development. (default "gcr.io/k8s-minikube/kicbase-builds:v0.0.26-1631295795-12425@sha256:7d61c0b6cf6832c8015ada78640635c5ab74b72f12f51bcc4c7660b0be01af56") + --base-image string The base image to use for docker/podman drivers. Intended for local development. (default "gcr.io/k8s-minikube/kicbase:v0.0.27@sha256:89b4738ee74ba28684676e176752277f0db46f57d27f0e08c3feec89311e22de") --cache-images If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none. (default true) --cni string CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto) --container-runtime string The container runtime to be used (docker, cri-o, containerd). (default "docker") From ebb03e2cf96e67e5fca0d88afda0a01b30d4efc3 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Thu, 16 Sep 2021 13:34:26 -0700 Subject: [PATCH 120/201] replace busybox image with gcr.io image --- test/integration/functional_test.go | 207 +++++++++++----------------- 1 file changed, 79 insertions(+), 128 deletions(-) diff --git a/test/integration/functional_test.go b/test/integration/functional_test.go index 24cdc938bcae..2d2dcaa50f22 100644 --- a/test/integration/functional_test.go +++ b/test/integration/functional_test.go @@ -55,6 +55,8 @@ import ( "golang.org/x/build/kubernetes/api" ) +const addonResizer = "gcr.io/google-containers/addon-resizer" + // validateFunc are for subtests that share a single setup type validateFunc func(context.Context, *testing.T, string) @@ -181,16 +183,14 @@ func cleanupUnwantedImages(ctx context.Context, t *testing.T, profile string) { if err != nil { t.Skipf("docker is not installed, cannot delete docker images") } else { - t.Run("delete busybox image", func(t *testing.T) { - newImage := fmt.Sprintf("docker.io/library/busybox:load-%s", profile) - rr, err := Run(t, exec.CommandContext(ctx, "docker", "rmi", "-f", newImage)) - if err != nil { - t.Logf("failed to remove image busybox from docker images. args %q: %v", rr.Command(), err) - } - newImage = fmt.Sprintf("docker.io/library/busybox:remove-%s", profile) - rr, err = Run(t, exec.CommandContext(ctx, "docker", "rmi", "-f", newImage)) - if err != nil { - t.Logf("failed to remove image busybox from docker images. args %q: %v", rr.Command(), err) + t.Run("delete addon-resizer images", func(t *testing.T) { + tags := []string{"1.8.11", "1.8.10", "1.8.9", "1.8.8", "1.8.7", "load-" + profile, "load-from-file-" + profile, "remove-" + profile, "save-" + profile, "save-to-file-" + profile} + for _, tag := range tags { + image := fmt.Sprintf("%s:%s", addonResizer, tag) + rr, err := Run(t, exec.CommandContext(ctx, "docker", "rmi", "-f", image)) + if err != nil { + t.Logf("failed to remove image %q from docker images. args %q: %v", image, rr.Command(), err) + } } }) t.Run("delete my-image image", func(t *testing.T) { @@ -227,72 +227,82 @@ func validateNodeLabels(ctx context.Context, t *testing.T, profile string) { } } -// validateLoadImage makes sure that `minikube image load` works as expected -func validateLoadImage(ctx context.Context, t *testing.T, profile string) { +func checkSkip(t *testing.T) { if NoneDriver() { t.Skip("load image not available on none driver") } if GithubActionRunner() && runtime.GOOS == "darwin" { t.Skip("skipping on github actions and darwin, as this test requires a running docker daemon") } - defer PostMortemLogs(t, profile) - // pull busybox - busyboxImage := "busybox:1.33" - rr, err := Run(t, exec.CommandContext(ctx, "docker", "pull", busyboxImage)) +} + +func pullAndTagImage(ctx context.Context, t *testing.T, version string, action string, profile string) (string, string, error) { + // pull addon-resizer + pulledImage := fmt.Sprintf("%s:%s", addonResizer, version) + rr, err := Run(t, exec.CommandContext(ctx, "docker", "pull", pulledImage)) if err != nil { - t.Fatalf("failed to setup test (pull image): %v\n%s", err, rr.Output()) + return "", "", fmt.Errorf("failed to setup test (pull image): %v\n%s", err, rr.Output()) } - // tag busybox - newImage := fmt.Sprintf("docker.io/library/busybox:load-%s", profile) - rr, err = Run(t, exec.CommandContext(ctx, "docker", "tag", busyboxImage, newImage)) + // tag addon-resizer + tag := fmt.Sprintf("%s-%s", action, profile) + taggedImage := fmt.Sprintf("%s:%s", addonResizer, tag) + rr, err = Run(t, exec.CommandContext(ctx, "docker", "tag", pulledImage, taggedImage)) if err != nil { - t.Fatalf("failed to setup test (tag image) : %v\n%s", err, rr.Output()) + return "", "", fmt.Errorf("failed to setup test (tag image) : %v\n%s", err, rr.Output()) } - // try to load the new image into minikube - rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "image", "load", "--daemon", newImage)) + return taggedImage, tag, nil +} + +func checkImageLoaded(ctx context.Context, t *testing.T, profile string, tag string) error { + // make sure the image was correctly loaded + rr, err := listImages(ctx, t, profile) if err != nil { - t.Fatalf("loading image into minikube: %v\n%s", err, rr.Output()) + return fmt.Errorf("listing images: %v\n%s", err, rr.Output()) + } + if !strings.Contains(rr.Output(), tag) { + return fmt.Errorf("expected %s to be loaded into minikube but the image is not there", tag) } - // make sure the image was correctly loaded - rr, err = inspectImage(ctx, t, profile, newImage) + return nil +} + +// validateLoadImage makes sure that `minikube image load` works as expected +func validateLoadImage(ctx context.Context, t *testing.T, profile string) { + checkSkip(t) + defer PostMortemLogs(t, profile) + + taggedImage, tag, err := pullAndTagImage(ctx, t, "1.8.11", "load", profile) if err != nil { - t.Fatalf("listing images: %v\n%s", err, rr.Output()) + t.Fatal(err) } - if !strings.Contains(rr.Output(), fmt.Sprintf("busybox:load-%s", profile)) { - t.Fatalf("expected %s to be loaded into minikube but the image is not there", newImage) + + // try to load the new image into minikube + rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "image", "load", "--daemon", taggedImage)) + if err != nil { + t.Fatalf("loading image into minikube: %v\n%s", err, rr.Output()) + } + + if err := checkImageLoaded(ctx, t, profile, tag); err != nil { + t.Fatal(err) } } // validateLoadImageFromFile makes sure that `minikube image load` works from a local file func validateLoadImageFromFile(ctx context.Context, t *testing.T, profile string) { - if NoneDriver() { - t.Skip("load image not available on none driver") - } - if GithubActionRunner() && runtime.GOOS == "darwin" { - t.Skip("skipping on github actions and darwin, as this test requires a running docker daemon") - } + checkSkip(t) defer PostMortemLogs(t, profile) - // pull busybox - busyboxImage := "busybox:1.31" - rr, err := Run(t, exec.CommandContext(ctx, "docker", "pull", busyboxImage)) - if err != nil { - t.Fatalf("failed to setup test (pull image): %v\n%s", err, rr.Output()) - } - tag := fmt.Sprintf("load-from-file-%s", profile) - taggedImage := fmt.Sprintf("docker.io/library/busybox:%s", tag) - rr, err = Run(t, exec.CommandContext(ctx, "docker", "tag", busyboxImage, taggedImage)) + taggedImage, tag, err := pullAndTagImage(ctx, t, "1.8.10", "load-from-file", profile) if err != nil { - t.Fatalf("failed to setup test (tag image) : %v\n%s", err, rr.Output()) + t.Fatal(err) } // save image to file - imageFile := "busybox-load.tar" - rr, err = Run(t, exec.CommandContext(ctx, "docker", "save", "-o", imageFile, taggedImage)) + imageFile := "addon-resizer-load.tar" + rr, err := Run(t, exec.CommandContext(ctx, "docker", "save", "-o", imageFile, taggedImage)) if err != nil { t.Fatalf("failed to save image to file: %v\n%s", err, rr.Output()) } @@ -308,48 +318,29 @@ func validateLoadImageFromFile(ctx context.Context, t *testing.T, profile string t.Fatalf("loading image into minikube: %v\n%s", err, rr.Output()) } - // make sure the image was correctly loaded - rr, err = listImages(ctx, t, profile) - if err != nil { - t.Fatalf("listing images: %v\n%s", err, rr.Output()) - } - if !strings.Contains(rr.Output(), tag) { - t.Fatalf("expected %s to be loaded into minikube but the image is not there: %v", taggedImage, rr.Output()) + if err := checkImageLoaded(ctx, t, profile, tag); err != nil { + t.Fatal(err) } } // validateRemoveImage makes sures that `minikube image rm` works as expected func validateRemoveImage(ctx context.Context, t *testing.T, profile string) { - if NoneDriver() { - t.Skip("load image not available on none driver") - } - if GithubActionRunner() && runtime.GOOS == "darwin" { - t.Skip("skipping on github actions and darwin, as this test requires a running docker daemon") - } + checkSkip(t) defer PostMortemLogs(t, profile) - // pull busybox - busyboxImage := "busybox:1.32" - rr, err := Run(t, exec.CommandContext(ctx, "docker", "pull", busyboxImage)) - if err != nil { - t.Fatalf("failed to setup test (pull image): %v\n%s", err, rr.Output()) - } - - // tag busybox - newImage := fmt.Sprintf("docker.io/library/busybox:remove-%s", profile) - rr, err = Run(t, exec.CommandContext(ctx, "docker", "tag", busyboxImage, newImage)) + taggedImage, tag, err := pullAndTagImage(ctx, t, "1.8.9", "remove", profile) if err != nil { - t.Fatalf("failed to setup test (tag image) : %v\n%s", err, rr.Output()) + t.Fatal(err) } // try to load the image into minikube - rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "image", "load", newImage)) + rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "image", "load", taggedImage)) if err != nil { t.Fatalf("loading image into minikube: %v\n%s", err, rr.Output()) } // try to remove the image from minikube - rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "image", "rm", newImage)) + rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "image", "rm", taggedImage)) if err != nil { t.Fatalf("removing image from minikube: %v\n%s", err, rr.Output()) } @@ -359,85 +350,50 @@ func validateRemoveImage(ctx context.Context, t *testing.T, profile string) { if err != nil { t.Fatalf("listing images: %v\n%s", err, rr.Output()) } - if strings.Contains(rr.Output(), fmt.Sprintf("busybox:remove-%s", profile)) { - t.Fatalf("expected %s to be removed from minikube but the image is there", newImage) + if strings.Contains(rr.Output(), tag) { + t.Fatalf("expected %s to be removed from minikube but the image is there", tag) } } // validateSaveImage makes sure that `minikube image save` works as expected func validateSaveImage(ctx context.Context, t *testing.T, profile string) { - if NoneDriver() { - t.Skip("load image not available on none driver") - } - if GithubActionRunner() && runtime.GOOS == "darwin" { - t.Skip("skipping on github actions and darwin, as this test requires a running docker daemon") - } + checkSkip(t) defer PostMortemLogs(t, profile) - // pull busybox - busyboxImage := "docker.io/library/busybox:1.29" - rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "image", "pull", busyboxImage)) - if err != nil { - t.Fatalf("failed to setup test (pull image): %v\n%s", err, rr.Output()) - } - // tag busybox - name := "busybox" - tag := fmt.Sprintf("save-%s", profile) - newImage := fmt.Sprintf("docker.io/library/%s:%s", name, tag) - rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "image", "tag", busyboxImage, newImage)) + taggedImage, tag, err := pullAndTagImage(ctx, t, "1.8.8", "save", profile) if err != nil { - t.Fatalf("failed to setup test (tag image) : %v\n%s", err, rr.Output()) + t.Fatal(err) } // try to save the new image from minikube - rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "image", "save", "--daemon", newImage)) + rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "image", "save", "--daemon", taggedImage)) if err != nil { t.Fatalf("loading image into minikube: %v\n%s", err, rr.Output()) } - // make sure the image was correctly loaded - rr, err = Run(t, exec.CommandContext(ctx, "docker", "images", name)) - if err != nil { - t.Fatalf("listing images: %v\n%s", err, rr.Output()) - } - if !strings.Contains(rr.Output(), fmt.Sprintf("save-%s", profile)) { - t.Fatalf("expected %s to be loaded into minikube but the image is not there", newImage) + if err := checkImageLoaded(ctx, t, profile, tag); err != nil { + t.Fatal(err) } - } // validateSaveImageToFile makes sure that `minikube image save` works to a local file func validateSaveImageToFile(ctx context.Context, t *testing.T, profile string) { - if NoneDriver() { - t.Skip("save image not available on none driver") - } - if GithubActionRunner() && runtime.GOOS == "darwin" { - t.Skip("skipping on github actions and darwin, as this test requires a running docker daemon") - } + checkSkip(t) defer PostMortemLogs(t, profile) - // pull busybox - busyboxImage := "docker.io/library/busybox:1.30" - rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "image", "pull", busyboxImage)) - if err != nil { - t.Fatalf("failed to setup test (pull image): %v\n%s", err, rr.Output()) - } - name := "busybox" - tag := fmt.Sprintf("save-to-file-%s", profile) - taggedImage := fmt.Sprintf("docker.io/library/%s:%s", name, tag) - rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "image", "tag", busyboxImage, taggedImage)) + taggedImage, tag, err := pullAndTagImage(ctx, t, "1.8.7", "save-to-file", profile) if err != nil { - t.Fatalf("failed to setup test (tag image) : %v\n%s", err, rr.Output()) + t.Fatal(err) } // try to save the new image from minikube - imageFile := "busybox-save.tar" + imageFile := "addon-resizer-save.tar" imagePath, err := filepath.Abs(imageFile) if err != nil { t.Fatalf("failed to get absolute path of file %q: %v", imageFile, err) } - rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "image", "save", taggedImage, imagePath)) + rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "image", "save", taggedImage, imagePath)) if err != nil { t.Fatalf("saving image from minikube: %v\n%s", err, rr.Output()) } @@ -449,13 +405,8 @@ func validateSaveImageToFile(ctx context.Context, t *testing.T, profile string) } defer os.Remove(imageFile) - // make sure the image was correctly loaded - rr, err = Run(t, exec.CommandContext(ctx, "docker", "images", name)) - if err != nil { - t.Fatalf("listing images: %v\n%s", err, rr.Output()) - } - if !strings.Contains(rr.Output(), tag) { - t.Fatalf("expected %s to be loaded but the image is not there", taggedImage) + if err := checkImageLoaded(ctx, t, profile, tag); err != nil { + t.Fatal(err) } } From 9c9c1614aaf409beb7db3386f22fe531895711a6 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 16 Sep 2021 13:47:47 -0700 Subject: [PATCH 121/201] fix sha for metrics-server image in addon config --- pkg/minikube/assets/addons.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/minikube/assets/addons.go b/pkg/minikube/assets/addons.go index 768e804f6ebe..5afc4cb000d4 100755 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -135,7 +135,7 @@ var Addons = map[string]*Addon{ MustBinAsset(addons.DashboardAssets, "dashboard/dashboard-svc.yaml", vmpath.GuestAddonsDir, "dashboard-svc.yaml", "0640"), }, false, "dashboard", "kubernetes", map[string]string{ "Dashboard": "kubernetesui/dashboard:v2.3.1@sha256:ec27f462cf1946220f5a9ace416a84a57c18f98c777876a8054405d1428cc92e", - "MetricsScraper": "kubernetesui/metrics-scraper:v1.0.7@sha256:ec27f462cf1946220f5a9ace416a84a57c18f98c777876a8054405d1428cc92e", + "MetricsScraper": "kubernetesui/metrics-scraper:v1.0.7@sha256:36d5b3f60e1a144cc5ada820910535074bdf5cf73fb70d1ff1681537eef4e172", }, nil), "default-storageclass": NewAddon([]*BinAsset{ MustBinAsset(addons.DefaultStorageClassAssets, From 047f2e553f734b98b415e8c339af1e94a46e51c1 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 16 Sep 2021 15:06:31 -0700 Subject: [PATCH 122/201] fix refreshing gcp-auth pull secret --- deploy/addons/gcp-auth/gcp-auth-webhook.yaml.tmpl | 2 ++ pkg/addons/addons_gcpauth.go | 12 ++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/deploy/addons/gcp-auth/gcp-auth-webhook.yaml.tmpl b/deploy/addons/gcp-auth/gcp-auth-webhook.yaml.tmpl index a951f24faa67..5b8b4ea86fd7 100644 --- a/deploy/addons/gcp-auth/gcp-auth-webhook.yaml.tmpl +++ b/deploy/addons/gcp-auth/gcp-auth-webhook.yaml.tmpl @@ -61,6 +61,7 @@ metadata: name: gcp-auth-certs-create namespace: gcp-auth spec: + ttlSecondsAfterFinished: 120 template: metadata: name: gcp-auth-certs-create @@ -120,6 +121,7 @@ metadata: name: gcp-auth-certs-patch namespace: gcp-auth spec: + ttlSecondsAfterFinished: 120 template: metadata: name: gcp-auth-certs-patch diff --git a/pkg/addons/addons_gcpauth.go b/pkg/addons/addons_gcpauth.go index f8602e891b55..09a8018236a4 100644 --- a/pkg/addons/addons_gcpauth.go +++ b/pkg/addons/addons_gcpauth.go @@ -169,7 +169,7 @@ func createPullSecret(cc *config.ClusterConfig, creds *google.Credentials) error } for _, n := range namespaces.Items { - if n.Name == "kube-system" { + if skipNamespace(n.Name) { continue } secrets := client.Secrets(n.Name) @@ -197,7 +197,7 @@ func createPullSecret(cc *config.ClusterConfig, creds *google.Credentials) error Type: "kubernetes.io/dockercfg", } - if exists && Refresh { + if Refresh { _, err := secrets.Update(context.TODO(), secretObj, metav1.UpdateOptions{}) if err != nil { return err @@ -261,7 +261,7 @@ func refreshExistingPods(cc *config.ClusterConfig) error { } for _, n := range namespaces.Items { // Ignore kube-system and gcp-auth namespaces - if n.Name == metav1.NamespaceSystem || n.Name == namespaceName { + if skipNamespace(n.Name) { continue } @@ -331,7 +331,7 @@ func disableAddonGCPAuth(cfg *config.ClusterConfig) error { // No need to check for an error here, if the secret doesn't exist, no harm done. for _, n := range namespaces.Items { - if n.Name == "kube-system" { + if skipNamespace(n.Name) { continue } secrets := client.Secrets(n.Name) @@ -397,3 +397,7 @@ func verifyGCPAuthAddon(cc *config.ClusterConfig, name string, val string) error return err } + +func skipNamespace(name string) bool { + return name == metav1.NamespaceSystem || name == namespaceName +} From a74d50eade043e073b42c21859d7ed4f825b9367 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 16 Sep 2021 15:18:52 -0700 Subject: [PATCH 123/201] be a little smarter about refreshing secrets --- pkg/addons/addons_gcpauth.go | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/pkg/addons/addons_gcpauth.go b/pkg/addons/addons_gcpauth.go index 09a8018236a4..b3e1fd7c348b 100644 --- a/pkg/addons/addons_gcpauth.go +++ b/pkg/addons/addons_gcpauth.go @@ -175,16 +175,14 @@ func createPullSecret(cc *config.ClusterConfig, creds *google.Credentials) error secrets := client.Secrets(n.Name) exists := false - if !Refresh { - secList, err := secrets.List(context.TODO(), metav1.ListOptions{}) - if err != nil { - return err - } - for _, s := range secList.Items { - if s.Name == secretName { - exists = true - break - } + secList, err := secrets.List(context.TODO(), metav1.ListOptions{}) + if err != nil { + return err + } + for _, s := range secList.Items { + if s.Name == secretName { + exists = true + break } } @@ -197,7 +195,8 @@ func createPullSecret(cc *config.ClusterConfig, creds *google.Credentials) error Type: "kubernetes.io/dockercfg", } - if Refresh { + if exists && Refresh { + fmt.Printf("REFRESHING SECRET: %s\n", n.Name) _, err := secrets.Update(context.TODO(), secretObj, metav1.UpdateOptions{}) if err != nil { return err From a5cdaf53b2477c78fcbadcce87d28e1435c53da6 Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 16 Sep 2021 15:30:59 -0700 Subject: [PATCH 124/201] remove debugging --- pkg/addons/addons_gcpauth.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/addons/addons_gcpauth.go b/pkg/addons/addons_gcpauth.go index b3e1fd7c348b..2172ae19c414 100644 --- a/pkg/addons/addons_gcpauth.go +++ b/pkg/addons/addons_gcpauth.go @@ -196,7 +196,6 @@ func createPullSecret(cc *config.ClusterConfig, creds *google.Credentials) error } if exists && Refresh { - fmt.Printf("REFRESHING SECRET: %s\n", n.Name) _, err := secrets.Update(context.TODO(), secretObj, metav1.UpdateOptions{}) if err != nil { return err From 95acc2867bf554971572ecce81940fcb97921a1e Mon Sep 17 00:00:00 2001 From: Sharif Elgamal Date: Thu, 16 Sep 2021 15:50:10 -0700 Subject: [PATCH 125/201] lower TTL to 30 seconds --- deploy/addons/gcp-auth/gcp-auth-webhook.yaml.tmpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/addons/gcp-auth/gcp-auth-webhook.yaml.tmpl b/deploy/addons/gcp-auth/gcp-auth-webhook.yaml.tmpl index 5b8b4ea86fd7..d3e585591485 100644 --- a/deploy/addons/gcp-auth/gcp-auth-webhook.yaml.tmpl +++ b/deploy/addons/gcp-auth/gcp-auth-webhook.yaml.tmpl @@ -61,7 +61,7 @@ metadata: name: gcp-auth-certs-create namespace: gcp-auth spec: - ttlSecondsAfterFinished: 120 + ttlSecondsAfterFinished: 30 template: metadata: name: gcp-auth-certs-create @@ -121,7 +121,7 @@ metadata: name: gcp-auth-certs-patch namespace: gcp-auth spec: - ttlSecondsAfterFinished: 120 + ttlSecondsAfterFinished: 30 template: metadata: name: gcp-auth-certs-patch From a455dce003ab53f5b66e61c23501d75bb09ad625 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Thu, 16 Sep 2021 22:58:11 -0700 Subject: [PATCH 126/201] echo message was actually running the commands --- hack/release_notes.sh | 3 --- kind | Bin 0 -> 4304896 bytes 2 files changed, 3 deletions(-) create mode 100644 kind diff --git a/hack/release_notes.sh b/hack/release_notes.sh index ef316f8ed339..a0cdc0f60102 100755 --- a/hack/release_notes.sh +++ b/hack/release_notes.sh @@ -74,6 +74,3 @@ if [[ "$recent" != *"beta"* ]]; then echo "" echo "Check out our [contributions leaderboard](https://minikube.sigs.k8s.io/docs/contrib/leaderboard/$recent/) for this release!" fi - -echo "" -echo "Don't forget to run `make update-leaderboard` & `make time-to-k8s-benchmark`!" diff --git a/kind b/kind new file mode 100644 index 0000000000000000000000000000000000000000..3632590c7505e1ccba1e8f1097f3b2e94a0a7142 GIT binary patch literal 4304896 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