From 11420854dc500be154d3faeb5697c5d7d7648d97 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Thu, 22 May 2025 11:54:08 -0700 Subject: [PATCH 01/60] Update releases.json & releases-v2.json to include v1.36.0 (#20824) --- deploy/minikube/releases-v2.json | 26 ++++++++++++++++++++++++++ deploy/minikube/releases.json | 8 ++++++++ site/content/en/docs/_index.md | 2 +- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/deploy/minikube/releases-v2.json b/deploy/minikube/releases-v2.json index f33c780813..825bfc7a9b 100644 --- a/deploy/minikube/releases-v2.json +++ b/deploy/minikube/releases-v2.json @@ -1,4 +1,30 @@ [ + { + "checksums": { + "amd64": { + "darwin": "a7e3da0db4041b2f845ca37af592424a9cbe34087ac922220b1e3abc4e1976ea", + "linux": "cddeab5ab86ab98e4900afac9d62384dae0941498dfbe712ae0c8868250bc3d7", + "windows": "c7504d574a416a4dd4c948e8bab9c2c2028e12c06d038046d8728c96c7cf4730" + }, + "arm": { + "linux": "6b5de419c665c5b3afa513c4d0a4387e973a1048a335f0ce879410bda3d3315f" + }, + "arm64": { + "darwin": "a9f06bc9634c87800e772354872c6641ef0e02699187d5118225a86b79c99348", + "linux": "6fe9adf0c40c75346a0528e609b3d4119ab192e2506d0401cc89adee051a48ea" + }, + "ppc64le": { + "linux": "db7eb5bfe583b5a1a7caf0c3b74b2733e29f26988970d687ea5fe4d10f60946b" + }, + "s390x": { + "linux": "f2659c51ba66374c34ee4c818227c870044b8ef1db9a5521a5206002b4a69234" + }, + "darwin": "a7e3da0db4041b2f845ca37af592424a9cbe34087ac922220b1e3abc4e1976ea", + "linux": "cddeab5ab86ab98e4900afac9d62384dae0941498dfbe712ae0c8868250bc3d7", + "windows": "c7504d574a416a4dd4c948e8bab9c2c2028e12c06d038046d8728c96c7cf4730" + }, + "name": "v1.36.0" + }, { "checksums": { "amd64": { diff --git a/deploy/minikube/releases.json b/deploy/minikube/releases.json index 0ce02387f6..4ecc2b280d 100644 --- a/deploy/minikube/releases.json +++ b/deploy/minikube/releases.json @@ -1,4 +1,12 @@ [ + { + "checksums": { + "darwin": "a7e3da0db4041b2f845ca37af592424a9cbe34087ac922220b1e3abc4e1976ea", + "linux": "cddeab5ab86ab98e4900afac9d62384dae0941498dfbe712ae0c8868250bc3d7", + "windows": "c7504d574a416a4dd4c948e8bab9c2c2028e12c06d038046d8728c96c7cf4730" + }, + "name": "v1.36.0" + }, { "checksums": { "darwin": "ba5ab2789ee0c40cefde30762656f3aa0bf47b15ee0bd808f3d7523cc54d75df", diff --git a/site/content/en/docs/_index.md b/site/content/en/docs/_index.md index afd40960be..b32718c3ff 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.35.0 - Jan 15, 2025 ([changelog](https://github.com/kubernetes/minikube/blob/master/CHANGELOG.md)) +🎉 Latest Release: v1.36.0 - May 22, 2025 ([changelog](https://github.com/kubernetes/minikube/blob/master/CHANGELOG.md)) ## Highlights From 1df6e76107e026a76c866c72c356e700de8f5085 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Fri, 23 May 2025 10:17:06 -0700 Subject: [PATCH 02/60] Add leaderboard for v1.36.0 (#20823) --- .../en/docs/contrib/leaderboard/v1.36.0.html | 488 ++++++++++++++++++ 1 file changed, 488 insertions(+) create mode 100644 site/content/en/docs/contrib/leaderboard/v1.36.0.html diff --git a/site/content/en/docs/contrib/leaderboard/v1.36.0.html b/site/content/en/docs/contrib/leaderboard/v1.36.0.html new file mode 100644 index 0000000000..ed6ec87768 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.36.0.html @@ -0,0 +1,488 @@ +--- +title: "v1.36.0 - 2025-05-22" +linkTitle: "v1.36.0 - 2025-05-22" +weight: -122 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + + +

kubernetes/minikube

+
2025-01-16 — 2025-05-22
+ + +

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 f89d46d8a2aef6441f789e84f5c55f5e0a8d5a57 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Fri, 23 May 2025 10:19:44 -0700 Subject: [PATCH 03/60] add time-to-k8s benchmark for v1.36.0 (#20825) --- .../en/docs/benchmarks/timeToK8s/v1.36.0.md | 27 ++++++++++++++++++ .../benchmarks/timeToK8s/v1.36.0-cpu.png | Bin 0 -> 28382 bytes .../benchmarks/timeToK8s/v1.36.0-time.png | Bin 0 -> 35851 bytes 3 files changed, 27 insertions(+) create mode 100644 site/content/en/docs/benchmarks/timeToK8s/v1.36.0.md create mode 100644 site/static/images/benchmarks/timeToK8s/v1.36.0-cpu.png create mode 100644 site/static/images/benchmarks/timeToK8s/v1.36.0-time.png diff --git a/site/content/en/docs/benchmarks/timeToK8s/v1.36.0.md b/site/content/en/docs/benchmarks/timeToK8s/v1.36.0.md new file mode 100644 index 0000000000..1667055454 --- /dev/null +++ b/site/content/en/docs/benchmarks/timeToK8s/v1.36.0.md @@ -0,0 +1,27 @@ +--- +title: "v1.36.0 Benchmark" +linkTitle: "v1.36.0 Benchmark" +weight: -20250522 +--- + +![time-to-k8s](/images/benchmarks/timeToK8s/v1.36.0-time.png) + +| | minikube version: v1.36.0 | kind v0.29.0 go1.24.2 linux/amd64 | k3d version v5.8.3 | +|----------------------|---------------------------|-----------------------------------|--------------------| +| Command Exec | 21.056 | 14.240 | 12.593 | +| API Server Answering | 0.055 | 0.056 | 0.067 | +| Kubernetes SVC | 0.048 | 0.051 | 0.052 | +| DNS SVC | 0.048 | 0.049 | 0.049 | +| App Running | 6.393 | 17.979 | 3.039 | +| DNS Answering | 23.211 | 0.601 | 4.137 | +| Total | 50.812 | 32.977 | 19.937 | + + + +![cpu-to-k8s](/images/benchmarks/timeToK8s/v1.36.0-cpu.png) + +| | minikube version: v1.36.0 | kind v0.29.0 go1.24.2 linux/amd64 | k3d version v5.8.3 | +|--------------------|---------------------------|-----------------------------------|--------------------| +| CPU Utilization(%) | 18.742 | 33.290 | 34.301 | +| CPU Time(seconds) | 8.712 | 10.952 | 6.813 | + diff --git a/site/static/images/benchmarks/timeToK8s/v1.36.0-cpu.png b/site/static/images/benchmarks/timeToK8s/v1.36.0-cpu.png new file mode 100644 index 0000000000000000000000000000000000000000..7d2f3e9f8e09a94fe5577649d17a3755d997e12a GIT binary patch literal 28382 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 O$d)ZmTvQ*Q@!o&;vpTK- literal 0 HcmV?d00001 diff --git a/site/static/images/benchmarks/timeToK8s/v1.36.0-time.png b/site/static/images/benchmarks/timeToK8s/v1.36.0-time.png new file mode 100644 index 0000000000000000000000000000000000000000..c03b66d33927fa27de5b2cebfd6c6e30b6eed48e GIT binary patch literal 35851 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 literal 0 HcmV?d00001 From 3cf1e63e217899495b66664d6e7d17be660b5761 Mon Sep 17 00:00:00 2001 From: Tian Date: Sat, 24 May 2025 08:31:28 +0800 Subject: [PATCH 04/60] build: address all lint issues by v2 (#20804) * fix QF1011: could omit type *os.File from declaration; it will be inferred from the right-hand side * fix QF1012: Use fmt.Fprintf(x, ...) instead of x.Write(fmt.Sprintf(...)) * fix QF1001: could apply De Morgan's law * fix QF1003: could use tagged switch * fix weakCond: suspicious ; nil check may not be enough, check for len (gocritic) * fix docStub: silencing go lint doc-comment warnings is unadvised * fix builtinShadow: shadowing of predeclared identifier: error * fix importShadow: shadow of imported package * fix nestingReduce: invert if cond, replace body with , move old body after the statement * useless-break: useless break in case clause (revive) * Clear the redundant content in golangci.yaml file --- .golangci.yaml | 32 ++----- cmd/minikube/cmd/completion.go | 12 +-- cmd/minikube/cmd/config/configure.go | 6 +- .../cmd/config/configure_registry_creds.go | 40 ++++---- cmd/minikube/cmd/dashboard.go | 12 +-- cmd/minikube/cmd/delete.go | 22 ++--- cmd/minikube/cmd/docker-env.go | 18 ++-- cmd/minikube/cmd/kubectl.go | 4 +- cmd/minikube/cmd/logs.go | 2 +- cmd/minikube/cmd/mount.go | 4 +- cmd/minikube/cmd/podman-env.go | 8 +- cmd/minikube/cmd/start.go | 80 ++++++++-------- cmd/minikube/main.go | 6 +- hack/benchmark/cpu_usage/auto_pause/chart.go | 17 ++-- hack/benchmark/cpu_usage/idle_only/chart.go | 17 ++-- .../update_buildkit_version.go | 2 +- .../update_cni_plugins_version.go | 2 +- .../update_containerd_version.go | 2 +- .../cri-o_version/update_cri-o_version.go | 2 +- .../update_cri_dockerd_version.go | 2 +- .../crictl_version/update_crictl_version.go | 2 +- .../crun_version/update_crun_version.go | 2 +- .../update_docker_buildx_version.go | 2 +- .../docker_version/update_docker_version.go | 2 +- .../golang_version/update_golang_version.go | 2 +- .../nerdctl_version/update_nerdctl_version.go | 2 +- .../runc_version/update_runc_version.go | 2 +- pkg/addons/addons_storage_classes.go | 5 +- pkg/drivers/kic/kic.go | 8 +- pkg/drivers/kic/oci/network_create.go | 2 +- pkg/drivers/kic/oci/oci.go | 5 +- pkg/drivers/kvm/network.go | 96 +++++++++---------- pkg/generate/docs.go | 6 +- pkg/generate/errorcodes.go | 4 +- pkg/kapi/kapi.go | 10 +- pkg/minikube/bootstrapper/certs.go | 4 +- pkg/minikube/bootstrapper/images/images.go | 6 +- pkg/minikube/bootstrapper/kubeadm/kubeadm.go | 26 ++--- pkg/minikube/cluster/ip.go | 32 +++---- pkg/minikube/cni/cni.go | 8 +- pkg/minikube/command/kic_runner.go | 8 +- pkg/minikube/config/profile.go | 2 +- pkg/minikube/cruntime/containerd.go | 24 ++--- pkg/minikube/cruntime/crio.go | 24 ++--- pkg/minikube/cruntime/docker.go | 33 +++---- pkg/minikube/download/iso.go | 4 +- pkg/minikube/download/preload.go | 8 +- pkg/minikube/driver/auxdriver/install.go | 4 +- pkg/minikube/firewall/firewall.go | 12 +-- pkg/minikube/image/image.go | 4 +- pkg/minikube/localpath/localpath.go | 4 +- pkg/minikube/machine/build_images.go | 12 +-- pkg/minikube/machine/cache_images.go | 88 ++++++++--------- pkg/minikube/machine/delete.go | 12 +-- pkg/minikube/machine/fix.go | 16 ++-- pkg/minikube/machine/host.go | 4 +- pkg/minikube/machine/info.go | 8 +- pkg/minikube/machine/ssh.go | 16 ++-- pkg/minikube/machine/start.go | 6 +- pkg/minikube/machine/stop.go | 4 +- pkg/minikube/mustload/mustload.go | 12 +-- pkg/minikube/node/cache.go | 6 +- pkg/minikube/node/start.go | 67 ++++++------- pkg/minikube/notify/notify.go | 22 ++--- pkg/minikube/out/out.go | 10 +- pkg/minikube/perf/logs.go | 6 +- pkg/minikube/perf/start.go | 16 ++-- pkg/minikube/service/service.go | 12 +-- pkg/minikube/shell/shell.go | 6 +- pkg/minikube/storageclass/storageclass.go | 4 +- pkg/minikube/tests/api_mock.go | 6 +- pkg/minikube/tunnel/cluster_inspector.go | 6 +- pkg/minikube/tunnel/kic/service_tunnel.go | 19 +++- pkg/minikube/tunnel/kic/ssh_conn.go | 6 +- pkg/minikube/tunnel/kic/ssh_tunnel.go | 19 +++- pkg/minikube/tunnel/registry.go | 21 ++-- pkg/minikube/tunnel/reporter.go | 4 +- pkg/minikube/tunnel/route.go | 2 +- pkg/storage/storage_provisioner.go | 10 +- 79 files changed, 546 insertions(+), 517 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 0921930ff9..229d73d143 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -23,23 +23,8 @@ linters: - "-ST1020" - "-ST1021" - "-ST1022" - ##### TODO: fix and enable these - # 4 occurrences. - # Use fmt.Fprintf(x, ...) instead of x.Write(fmt.Sprintf(...)) https://staticcheck.dev/docs/checks#QF1012 - - "-QF1012" - # 3 occurrences. - # Apply De Morgan’s law https://staticcheck.dev/docs/checks#QF1001 - - "-QF1001" - # 9 occurrences. - # Convert if/else-if chain to tagged switch https://staticcheck.dev/docs/checks#QF1003 - - "-QF1003" - # 1 occurrence. - # could omit type *os.File from declaration; it will be inferred from the right-hand side - - "-QF1011" - ##### These have been vetted to be disabled. - # 19 occurrences. Omit embedded fields from selector expression https://staticcheck.dev/docs/checks#QF1008 - # Usefulness is questionable. - "-QF1008" + revive: enable-all-rules: true rules: @@ -150,23 +135,22 @@ linters: # - yodaStyleExpr # - typeUnparen - ##### TODO: fix and enable these # We enabled these and we pass - nilValReturn - # - weakCond # pkg/minikube/config/profile.go:61:9: weakCond: suspicious `cc.Nodes != nil && cc.Nodes[0].Name == node.Name`; nil check may not be enough, check for len (gocritic) + - weakCond - indexAlloc - rangeExprCopy - boolExprSimplify - commentedOutImport - # - docStub # pkg/minikube/tunnel/kic/service_tunnel.go:51:1: docStub: silencing go lint doc-comment warnings is unadvised (gocritic) + - docStub - emptyFallthrough - hexLiteral - typeAssertChain - unlabelStmt - # - builtinShadow # cmd/minikube/cmd/delete.go:89:7: builtinShadow: shadowing of predeclared identifier: error (gocritic) - # - importShadow # pkg/storage/storage_provisioner.go:60:2: importShadow: shadow of imported package 'path' (gocritic) + - builtinShadow + - importShadow - initClause - # - nestingReduce # pkg/minikube/tunnel/registry.go:94:3: nestingReduce: invert if cond, replace body with `continue`, move old body after the statement (gocritic) + - nestingReduce - unnecessaryBlock exclusions: @@ -181,7 +165,3 @@ linters: - path: '(.+)\.go$' text: "Error return value of `.*` is not checked" linter: errcheck - # This code is doubtful and I don't understand it. Location: Line 456 - - path: 'cmd/minikube/cmd/docker-env.go' - text: "useless-break: useless break in case clause" - linter: revive diff --git a/cmd/minikube/cmd/completion.go b/cmd/minikube/cmd/completion.go index ab8221b215..b85d4e9a59 100644 --- a/cmd/minikube/cmd/completion.go +++ b/cmd/minikube/cmd/completion.go @@ -162,7 +162,7 @@ func GenerateBashCompletion(w io.Writer, cmd *cobra.Command) error { } // GenerateZshCompletion generates the completion for the zsh shell -func GenerateZshCompletion(out io.Writer, cmd *cobra.Command) error { +func GenerateZshCompletion(w io.Writer, cmd *cobra.Command) error { zshAutoloadTag := `#compdef minikube ` @@ -300,17 +300,17 @@ __minikube_convert_bash_to_zsh() { <<'BASH_COMPLETION_EOF' ` - _, err := out.Write([]byte(zshAutoloadTag)) + _, err := w.Write([]byte(zshAutoloadTag)) if err != nil { return err } - _, err = out.Write([]byte(boilerPlate)) + _, err = w.Write([]byte(boilerPlate)) if err != nil { return err } - _, err = out.Write([]byte(zshInitialization)) + _, err = w.Write([]byte(zshInitialization)) if err != nil { return err } @@ -320,7 +320,7 @@ __minikube_convert_bash_to_zsh() { if err != nil { return errors.Wrap(err, "Error generating zsh completion") } - _, err = out.Write(buf.Bytes()) + _, err = w.Write(buf.Bytes()) if err != nil { return err } @@ -330,7 +330,7 @@ BASH_COMPLETION_EOF } __minikube_bash_source <(__minikube_convert_bash_to_zsh) ` - _, err = out.Write([]byte(zshTail)) + _, err = w.Write([]byte(zshTail)) if err != nil { return err } diff --git a/cmd/minikube/cmd/config/configure.go b/cmd/minikube/cmd/config/configure.go index 93bcbdfa2f..045aafca55 100644 --- a/cmd/minikube/cmd/config/configure.go +++ b/cmd/minikube/cmd/config/configure.go @@ -133,7 +133,7 @@ func loadAddonConfigFile(addon, configFilePath string) (ac *addonConfig) { type configFile struct { Addons addonConfig `json:"addons"` } - var config configFile + var cf configFile if configFilePath != "" { out.Ln("Reading %s configs from %s", addon, configFilePath) @@ -150,14 +150,14 @@ func loadAddonConfigFile(addon, configFilePath string) (ac *addonConfig) { fmt.Sprintf("error opening config file: %s", configFilePath)) } - if err = json.Unmarshal(confData, &config); err != nil { + if err = json.Unmarshal(confData, &cf); err != nil { // err = errors2.Wrapf(err, "error reading config file (%s)", configFilePath) klog.Errorf("error reading config file (%s): %v", configFilePath, err) exit.Message(reason.Kind{ExitCode: reason.ExProgramConfig, Advice: "provide a valid config file"}, fmt.Sprintf("error reading config file: %v", err)) } - return &config.Addons + return &cf.Addons } return nil } diff --git a/cmd/minikube/cmd/config/configure_registry_creds.go b/cmd/minikube/cmd/config/configure_registry_creds.go index e6ddaf6230..8a6da86eab 100644 --- a/cmd/minikube/cmd/config/configure_registry_creds.go +++ b/cmd/minikube/cmd/config/configure_registry_creds.go @@ -92,7 +92,9 @@ func processRegistryCredsConfig(profile string, ac *addonConfig) { regCredsConf := &ac.RegistryCreds awsEcrAction := regCredsConf.EnableAWSEcr // regCredsConf. "enableAWSEcr") - if awsEcrAction == "prompt" || awsEcrAction == "" { + + switch awsEcrAction { + case "prompt", "": enableAWSECR := AskForYesNoConfirmation("\nDo you want to enable AWS Elastic Container Registry?", posResponses, negResponses) if enableAWSECR { awsAccessID = AskForStaticValue("-- Enter AWS Access Key ID: ") @@ -102,7 +104,7 @@ func processRegistryCredsConfig(profile string, ac *addonConfig) { awsAccount = AskForStaticValue("-- Enter 12 digit AWS Account ID (Comma separated list): ") awsRole = AskForStaticValueOptional("-- (Optional) Enter ARN of AWS role to assume: ") } - } else if awsEcrAction == "enable" { + case "enable": out.Ln("Loading AWS ECR configs from: %s", addonConfigFile) // Then read the configs awsAccessID = regCredsConf.EcrConfigs.AccessID @@ -111,15 +113,17 @@ func processRegistryCredsConfig(profile string, ac *addonConfig) { awsRegion = regCredsConf.EcrConfigs.Region awsAccount = regCredsConf.EcrConfigs.Account awsRole = regCredsConf.EcrConfigs.Role - } else if awsEcrAction == "disable" { + case "disable": out.Ln("Ignoring AWS ECR configs") - } else { + default: out.Ln("Disabling AWS ECR. Invalid value for enableAWSEcr (%s). Must be one of 'disable', 'enable' or 'prompt'", awsEcrAction) } gcrPath := "" gcrAction := regCredsConf.EnableGCR - if gcrAction == "prompt" || gcrAction == "" { + + switch gcrAction { + case "prompt", "": enableGCR := AskForYesNoConfirmation("\nDo you want to enable Google Container Registry?", posResponses, negResponses) if enableGCR { gcrPath = AskForStaticValue("-- Enter path to credentials (e.g. /home/user/.config/gcloud/application_default_credentials.json):") @@ -129,14 +133,14 @@ func processRegistryCredsConfig(profile string, ac *addonConfig) { gcrURL = AskForStaticValue("-- Enter GCR URL (e.g. https://asia.gcr.io):") } } - } else if gcrAction == "enable" { + case "enable": out.Ln("Loading GCR configs from: %s", addonConfigFile) // Then read the configs gcrPath = regCredsConf.GcrConfigs.GcrPath gcrURL = regCredsConf.GcrConfigs.GcrURL - } else if gcrAction == "disable" { + case "disable": out.Ln("Ignoring GCR configs") - } else { + default: out.Ln("Disabling GCR. Invalid value for enableGCR (%s). Must be one of 'disable', 'enable' or 'prompt'", gcrAction) } @@ -152,40 +156,44 @@ func processRegistryCredsConfig(profile string, ac *addonConfig) { } dockerRegistryAction := regCredsConf.EnableDockerRegistry - if dockerRegistryAction == "prompt" || dockerRegistryAction == "" { + + switch dockerRegistryAction { + case "prompt", "": enableDR := AskForYesNoConfirmation("\nDo you want to enable Docker Registry?", posResponses, negResponses) if enableDR { dockerServer = AskForStaticValue("-- Enter docker registry server url: ") dockerUser = AskForStaticValue("-- Enter docker registry username: ") dockerPass = AskForPasswordValue("-- Enter docker registry password: ") } - } else if dockerRegistryAction == "enable" { + case "enable": out.Ln("Loading Docker Registry configs from: %s", addonConfigFile) dockerServer = regCredsConf.DockerConfigs.DockerServer dockerUser = regCredsConf.DockerConfigs.DockerUser dockerPass = regCredsConf.DockerConfigs.DockerPass - } else if dockerRegistryAction == "disable" { + case "disable": out.Ln("Ignoring Docker Registry configs") - } else { + default: out.Ln("Disabling Docker Registry. Invalid value for enableDockerRegistry (%s). Must be one of 'disable', 'enable' or 'prompt'", dockerRegistryAction) } acrAction := regCredsConf.EnableACR - if acrAction == "prompt" || acrAction == "" { + + switch acrAction { + case "prompt", "": enableACR := AskForYesNoConfirmation("\nDo you want to enable Azure Container Registry?", posResponses, negResponses) if enableACR { acrURL = AskForStaticValue("-- Enter Azure Container Registry (ACR) URL: ") acrClientID = AskForStaticValue("-- Enter client ID (service principal ID) to access ACR: ") acrPassword = AskForPasswordValue("-- Enter service principal password to access Azure Container Registry: ") } - } else if acrAction == "enable" { + case "enable": out.Ln("Loading ACR configs from: ", addonConfigFile) acrURL = regCredsConf.AcrConfigs.AcrURL acrClientID = regCredsConf.AcrConfigs.AcrClientID acrPassword = regCredsConf.AcrConfigs.AcrPassword - } else if acrAction == "disable" { + case "disable": out.Ln("Ignoring ACR configs") - } else { + default: out.Stringf("Disabling ACR. Invalid value for enableACR (%s). Must be one of 'disable', 'enable' or 'prompt'", acrAction) } diff --git a/cmd/minikube/cmd/dashboard.go b/cmd/minikube/cmd/dashboard.go index 52753fb36f..c7b1eabf7f 100644 --- a/cmd/minikube/cmd/dashboard.go +++ b/cmd/minikube/cmd/dashboard.go @@ -157,7 +157,7 @@ func kubectlProxy(kubectlVersion string, binaryURL string, contextName string, p klog.Infof("Waiting for kubectl to output host:port ...") reader := bufio.NewReader(stdoutPipe) - var out []byte + var outData []byte for { r, timedOut, err := readByteWithTimeout(reader, 5*time.Second) if err != nil { @@ -170,10 +170,10 @@ func kubectlProxy(kubectlVersion string, binaryURL string, contextName string, p klog.Infof("timed out waiting for input: possibly due to an old kubectl version.") break } - out = append(out, r) + outData = append(outData, r) } - klog.Infof("proxy stdout: %s", string(out)) - return cmd, hostPortRe.FindString(string(out)), nil + klog.Infof("proxy stdout: %s", string(outData)) + return cmd, hostPortRe.FindString(string(outData)), nil } // readByteWithTimeout returns a byte from a reader or an indicator that a timeout has occurred. @@ -203,9 +203,9 @@ func readByteWithTimeout(r io.ByteReader, timeout time.Duration) (byte, bool, er } // dashboardURL generates a URL for accessing the dashboard service -func dashboardURL(proxy string, ns string, svc string) string { +func dashboardURL(addr string, ns string, svc string) string { // Reference: https://github.com/kubernetes/dashboard/wiki/Accessing-Dashboard---1.7.X-and-above - return fmt.Sprintf("http://%s/api/v1/namespaces/%s/services/http:%s:/proxy/", proxy, ns, svc) + return fmt.Sprintf("http://%s/api/v1/namespaces/%s/services/http:%s:/proxy/", addr, ns, svc) } // checkURL checks if a URL returns 200 HTTP OK diff --git a/cmd/minikube/cmd/delete.go b/cmd/minikube/cmd/delete.go index 1fa0862bac..2f56362460 100644 --- a/cmd/minikube/cmd/delete.go +++ b/cmd/minikube/cmd/delete.go @@ -86,8 +86,8 @@ type DeletionError struct { Errtype typeOfError } -func (error DeletionError) Error() string { - return error.Err.Error() +func (deletionError DeletionError) Error() string { + return deletionError.Err.Error() } var hostAndDirsDeleter = func(api libmachine.API, cc *config.ClusterConfig, profileName string) error { @@ -527,11 +527,11 @@ func uninstallKubernetes(api libmachine.API, cc config.ClusterConfig, n config.N } // HandleDeletionErrors handles deletion errors from DeleteProfiles -func HandleDeletionErrors(errors []error) { - if len(errors) == 1 { - handleSingleDeletionError(errors[0]) +func HandleDeletionErrors(errs []error) { + if len(errs) == 1 { + handleSingleDeletionError(errs[0]) } else { - handleMultipleDeletionErrors(errors) + handleMultipleDeletionErrors(errs) } } @@ -556,10 +556,10 @@ func handleSingleDeletionError(err error) { } } -func handleMultipleDeletionErrors(errors []error) { +func handleMultipleDeletionErrors(errs []error) { out.ErrT(style.Sad, "Multiple errors deleting profiles") - for _, err := range errors { + for _, err := range errs { deletionError, ok := err.(DeletionError) if ok { @@ -706,14 +706,14 @@ var isMinikubeProcess = func(pid int) (bool, error) { // getPids opens the file at PATH and tries to read // one or more space separated pids func getPids(path string) ([]int, error) { - out, err := os.ReadFile(path) + data, err := os.ReadFile(path) if err != nil { return nil, errors.Wrap(err, "ReadFile") } - klog.Infof("pidfile contents: %s", out) + klog.Infof("pidfile contents: %s", data) pids := []int{} - strPids := strings.Fields(string(out)) + strPids := strings.Fields(string(data)) for _, p := range strPids { intPid, err := strconv.Atoi(p) if err != nil { diff --git a/cmd/minikube/cmd/docker-env.go b/cmd/minikube/cmd/docker-env.go index 8a376ea802..6b65b21bcd 100644 --- a/cmd/minikube/cmd/docker-env.go +++ b/cmd/minikube/cmd/docker-env.go @@ -462,7 +462,6 @@ func dockerSetScript(ec DockerEnvConfig, w io.Writer) error { switch outputFormat { case "": // shell "none" - break case "text": for k, v := range envVars { _, err := fmt.Fprintf(w, "%s=%s\n", k, v) @@ -472,11 +471,11 @@ func dockerSetScript(ec DockerEnvConfig, w io.Writer) error { } return nil case "json": - json, err := json.Marshal(envVars) + jsondata, err := json.Marshal(envVars) if err != nil { return err } - _, err = w.Write(json) + _, err = w.Write(jsondata) if err != nil { return err } @@ -486,11 +485,11 @@ func dockerSetScript(ec DockerEnvConfig, w io.Writer) error { } return nil case "yaml": - yaml, err := yaml.Marshal(envVars) + yamldata, err := yaml.Marshal(envVars) if err != nil { return err } - _, err = w.Write(yaml) + _, err = w.Write(yamldata) if err != nil { return err } @@ -509,7 +508,6 @@ func dockerUnsetScript(ec DockerEnvConfig, w io.Writer) error { switch outputFormat { case "": // shell "none" - break case "text": for _, n := range vars { _, err := fmt.Fprintf(w, "%s\n", n) @@ -519,11 +517,11 @@ func dockerUnsetScript(ec DockerEnvConfig, w io.Writer) error { } return nil case "json": - json, err := json.Marshal(vars) + jsondata, err := json.Marshal(vars) if err != nil { return err } - _, err = w.Write(json) + _, err = w.Write(jsondata) if err != nil { return err } @@ -533,11 +531,11 @@ func dockerUnsetScript(ec DockerEnvConfig, w io.Writer) error { } return nil case "yaml": - yaml, err := yaml.Marshal(vars) + yamldata, err := yaml.Marshal(vars) if err != nil { return err } - _, err = w.Write(yaml) + _, err = w.Write(yamldata) if err != nil { return err } diff --git a/cmd/minikube/cmd/kubectl.go b/cmd/minikube/cmd/kubectl.go index a796ceea22..01b10404bc 100644 --- a/cmd/minikube/cmd/kubectl.go +++ b/cmd/minikube/cmd/kubectl.go @@ -157,12 +157,12 @@ func KubectlCommand(version, binaryURL string, args ...string) (*exec.Cmd, error version = constants.DefaultKubernetesVersion } - path, err := node.CacheKubectlBinary(version, binaryURL) + binary, err := node.CacheKubectlBinary(version, binaryURL) if err != nil { return nil, err } - return exec.Command(path, args...), nil + return exec.Command(binary, args...), nil } func init() { diff --git a/cmd/minikube/cmd/logs.go b/cmd/minikube/cmd/logs.go index e05638b245..86a70e3c63 100644 --- a/cmd/minikube/cmd/logs.go +++ b/cmd/minikube/cmd/logs.go @@ -63,7 +63,7 @@ var logsCmd = &cobra.Command{ Short: "Returns logs to debug a local Kubernetes cluster", Long: `Gets the logs of the running instance, used for debugging minikube, not user code.`, Run: func(_ *cobra.Command, _ []string) { - var logOutput *os.File = os.Stdout + logOutput := os.Stdout var err error if fileOutput != "" { diff --git a/cmd/minikube/cmd/mount.go b/cmd/minikube/cmd/mount.go index 345e2adac7..f8b1ab80ad 100644 --- a/cmd/minikube/cmd/mount.go +++ b/cmd/minikube/cmd/mount.go @@ -313,7 +313,7 @@ func removePid(path string, pid string) error { // we found the correct file // we're reading the pids... - out, err := os.ReadFile(pidPath) + data, err := os.ReadFile(pidPath) if err != nil { return errors.Wrap(err, "readFile") } @@ -321,7 +321,7 @@ func removePid(path string, pid string) error { pids := []string{} // we're splitting the mount-pids file content into a slice of strings // so that we can compare each to the PID we're looking for - strPids := strings.Fields(string(out)) + strPids := strings.Fields(string(data)) for _, p := range strPids { // If we find the PID, we don't add it to the slice if p == pid { diff --git a/cmd/minikube/cmd/podman-env.go b/cmd/minikube/cmd/podman-env.go index f236e15a3f..e282000542 100644 --- a/cmd/minikube/cmd/podman-env.go +++ b/cmd/minikube/cmd/podman-env.go @@ -253,10 +253,10 @@ func podmanUnsetScript(ec PodmanEnvConfig, w io.Writer) error { // podmanBridge returns the command to use in a var for accessing the podman varlink bridge over ssh func podmanBridge(client *ssh.ExternalClient) string { - command := []string{client.BinaryPath} - command = append(command, client.BaseArgs...) - command = append(command, "--", "sudo", "varlink", "-A", `\'podman varlink \\\$VARLINK_ADDRESS\'`, "bridge") - return strings.Join(command, " ") + cmd := []string{client.BinaryPath} + cmd = append(cmd, client.BaseArgs...) + cmd = append(cmd, "--", "sudo", "varlink", "-A", `\'podman varlink \\\$VARLINK_ADDRESS\'`, "bridge") + return strings.Join(cmd, " ") } // podmanURL returns the url to use in a var for accessing the podman socket over ssh diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index cd6e786d23..ed1d87f6e6 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -282,7 +282,7 @@ func runStart(cmd *cobra.Command, _ []string) { } } - kubeconfig, err := startWithDriver(cmd, starter, existing) + configInfo, err := startWithDriver(cmd, starter, existing) if err != nil { node.ExitIfFatal(err, useForce) exit.Error(reason.GuestStart, "failed to start node", err) @@ -294,7 +294,7 @@ func runStart(cmd *cobra.Command, _ []string) { } } - if err := showKubectlInfo(kubeconfig, starter.Node.KubernetesVersion, starter.Node.ContainerRuntime, starter.Cfg.Name); err != nil { + if err := showKubectlInfo(configInfo, starter.Node.KubernetesVersion, starter.Node.ContainerRuntime, starter.Cfg.Name); err != nil { klog.Errorf("kubectl info: %v", err) } } @@ -363,11 +363,11 @@ func provisionWithDriver(cmd *cobra.Command, ds registry.DriverState, existing * } if driver.IsVM(driverName) && !driver.IsSSH(driverName) { - url, err := download.ISO(viper.GetStringSlice(isoURL), cmd.Flags().Changed(isoURL)) + urlString, err := download.ISO(viper.GetStringSlice(isoURL), cmd.Flags().Changed(isoURL)) if err != nil { return node.Starter{}, errors.Wrap(err, "Failed to cache ISO") } - cc.MinikubeISO = url + cc.MinikubeISO = urlString } var existingAddons map[string]bool @@ -462,9 +462,9 @@ func imageMatchesBinaryVersion(imageVersion, binaryVersion string) bool { func startWithDriver(cmd *cobra.Command, starter node.Starter, existing *config.ClusterConfig) (*kubeconfig.Settings, error) { // start primary control-plane node - kubeconfig, err := node.Start(starter) + configInfo, err := node.Start(starter) if err != nil { - kubeconfig, err = maybeDeleteAndRetry(cmd, *starter.Cfg, *starter.Node, starter.ExistingAddons, err) + configInfo, err = maybeDeleteAndRetry(cmd, *starter.Cfg, *starter.Node, starter.ExistingAddons, err) if err != nil { return nil, err } @@ -512,7 +512,7 @@ func startWithDriver(cmd *cobra.Command, starter node.Starter, existing *config. pause.RemovePausedFile(starter.Runner) - return kubeconfig, nil + return configInfo, nil } func warnAboutMultiNodeCNI() { @@ -528,14 +528,14 @@ func updateDriver(driverName string) { } } -func displayVersion(version string) { +func displayVersion(ver string) { prefix := "" if ClusterFlagValue() != constants.DefaultClusterName { prefix = fmt.Sprintf("[%s] ", ClusterFlagValue()) } register.Reg.SetStep(register.InitialSetup) - out.Step(style.Happy, "{{.prefix}}minikube {{.version}} on {{.platform}}", out.V{"prefix": prefix, "version": version, "platform": platform()}) + out.Step(style.Happy, "{{.prefix}}minikube {{.version}} on {{.platform}}", out.V{"prefix": prefix, "version": ver, "platform": platform()}) } // displayEnviron makes the user aware of environment variables that will affect how minikube operates @@ -631,7 +631,7 @@ func maybeDeleteAndRetry(cmd *cobra.Command, existing config.ClusterConfig, n co // Re-generate the cluster config, just in case the failure was related to an old config format cc := updateExistingConfigFromFlags(cmd, &existing) - var kubeconfig *kubeconfig.Settings + var configInfo *kubeconfig.Settings for _, n := range cc.Nodes { r, p, m, h, err := node.Provision(&cc, &n, false) s := node.Starter{ @@ -650,14 +650,14 @@ func maybeDeleteAndRetry(cmd *cobra.Command, existing config.ClusterConfig, n co k, err := node.Start(s) if n.ControlPlane { - kubeconfig = k + configInfo = k } if err != nil { // Ok we failed again, let's bail return nil, err } } - return kubeconfig, nil + return configInfo, nil } // Don't delete the cluster unless they ask return nil, originalErr @@ -902,12 +902,12 @@ func validateSpecifiedDriver(existing *config.ClusterConfig) { // validateDriver validates that the selected driver appears sane, exits if not func validateDriver(ds registry.DriverState, existing *config.ClusterConfig) { - name := ds.Name - os := detect.RuntimeOS() + driverName := ds.Name + osName := detect.RuntimeOS() arch := detect.RuntimeArch() - klog.Infof("validating driver %q against %+v", name, existing) - if !driver.Supported(name) { - exit.Message(reason.DrvUnsupportedOS, "The driver '{{.driver}}' is not supported on {{.os}}/{{.arch}}", out.V{"driver": name, "os": os, "arch": arch}) + klog.Infof("validating driver %q against %+v", driverName, existing) + if !driver.Supported(driverName) { + exit.Message(reason.DrvUnsupportedOS, "The driver '{{.driver}}' is not supported on {{.os}}/{{.arch}}", out.V{"driver": driverName, "os": osName, "arch": arch}) } // if we are only downloading artifacts for a driver, we can stop validation here @@ -916,7 +916,7 @@ func validateDriver(ds registry.DriverState, existing *config.ClusterConfig) { } st := ds.State - klog.Infof("status for %s: %+v", name, st) + klog.Infof("status for %s: %+v", driverName, st) if st.NeedsImprovement { out.Styled(style.Improvement, `For improved {{.driver}} performance, {{.fix}}`, out.V{"driver": driver.FullName(ds.Name), "fix": translate.T(st.Fix)}) @@ -924,7 +924,7 @@ func validateDriver(ds registry.DriverState, existing *config.ClusterConfig) { if ds.Priority == registry.Obsolete { exit.Message(reason.Kind{ - ID: fmt.Sprintf("PROVIDER_%s_OBSOLETE", strings.ToUpper(name)), + ID: fmt.Sprintf("PROVIDER_%s_OBSOLETE", strings.ToUpper(driverName)), Advice: translate.T(st.Fix), ExitCode: reason.ExProviderUnsupported, URL: st.Doc, @@ -943,23 +943,23 @@ func validateDriver(ds registry.DriverState, existing *config.ClusterConfig) { if !st.Installed { exit.Message(reason.Kind{ - ID: fmt.Sprintf("PROVIDER_%s_NOT_FOUND", strings.ToUpper(name)), + ID: fmt.Sprintf("PROVIDER_%s_NOT_FOUND", strings.ToUpper(driverName)), Advice: translate.T(st.Fix), ExitCode: reason.ExProviderNotFound, URL: st.Doc, Style: style.Shrug, - }, `The '{{.driver}}' provider was not found: {{.error}}`, out.V{"driver": name, "error": st.Error}) + }, `The '{{.driver}}' provider was not found: {{.error}}`, out.V{"driver": driverName, "error": st.Error}) } id := st.Reason if id == "" { - id = fmt.Sprintf("PROVIDER_%s_ERROR", strings.ToUpper(name)) + id = fmt.Sprintf("PROVIDER_%s_ERROR", strings.ToUpper(driverName)) } code := reason.ExProviderUnavailable if !st.Running { - id = fmt.Sprintf("PROVIDER_%s_NOT_RUNNING", strings.ToUpper(name)) + id = fmt.Sprintf("PROVIDER_%s_NOT_RUNNING", strings.ToUpper(driverName)) code = reason.ExProviderNotRunning } @@ -1515,15 +1515,15 @@ func defaultRuntime() string { } // if container runtime is not docker, check that cni is not disabled -func validateCNI(cmd *cobra.Command, runtime string) { - if runtime == constants.Docker { +func validateCNI(cmd *cobra.Command, runtimeName string) { + if runtimeName == constants.Docker { return } if cmd.Flags().Changed(cniFlag) && strings.ToLower(viper.GetString(cniFlag)) == "false" { if viper.GetBool(force) { - out.WarnReason(reason.Usage, "You have chosen to disable the CNI but the \"{{.name}}\" container runtime requires CNI", out.V{"name": runtime}) + out.WarnReason(reason.Usage, "You have chosen to disable the CNI but the \"{{.name}}\" container runtime requires CNI", out.V{"name": runtimeName}) } else { - exit.Message(reason.Usage, "The \"{{.name}}\" container runtime requires CNI", out.V{"name": runtime}) + exit.Message(reason.Usage, "The \"{{.name}}\" container runtime requires CNI", out.V{"name": runtimeName}) } } } @@ -2004,16 +2004,16 @@ func validateBareMetal(drvName string) { if err != nil { klog.Warningf("failed getting Kubernetes version: %v", err) } - version, _ := util.ParseKubernetesVersion(kubeVer) - if version.GTE(semver.MustParse("1.18.0-beta.1")) { + ver, _ := util.ParseKubernetesVersion(kubeVer) + if ver.GTE(semver.MustParse("1.18.0-beta.1")) { if _, err := exec.LookPath("conntrack"); err != nil { - exit.Message(reason.GuestMissingConntrack, "Sorry, Kubernetes {{.k8sVersion}} requires conntrack to be installed in root's path", out.V{"k8sVersion": version.String()}) + exit.Message(reason.GuestMissingConntrack, "Sorry, Kubernetes {{.k8sVersion}} requires conntrack to be installed in root's path", out.V{"k8sVersion": ver.String()}) } } // crictl is required starting with Kubernetes 1.24, for all runtimes since the removal of dockershim - if version.GTE(semver.MustParse("1.24.0-alpha.0")) { + if ver.GTE(semver.MustParse("1.24.0-alpha.0")) { if _, err := exec.LookPath("crictl"); err != nil { - exit.Message(reason.GuestMissingConntrack, "Sorry, Kubernetes {{.k8sVersion}} requires crictl to be installed in root's path", out.V{"k8sVersion": version.String()}) + exit.Message(reason.GuestMissingConntrack, "Sorry, Kubernetes {{.k8sVersion}} requires crictl to be installed in root's path", out.V{"k8sVersion": ver.String()}) } } } @@ -2062,24 +2062,24 @@ func startNerdctld() { runner := co.CP.Runner // and set 777 to these files - if out, err := runner.RunCmd(exec.Command("sudo", "chmod", "777", "/usr/local/bin/nerdctl", "/usr/local/bin/nerdctld")); err != nil { - exit.Error(reason.StartNerdctld, fmt.Sprintf("Failed setting permission for nerdctl: %s", out.Output()), err) + if rest, err := runner.RunCmd(exec.Command("sudo", "chmod", "777", "/usr/local/bin/nerdctl", "/usr/local/bin/nerdctld")); err != nil { + exit.Error(reason.StartNerdctld, fmt.Sprintf("Failed setting permission for nerdctl: %s", rest.Output()), err) } // sudo systemctl start nerdctld.socket - if out, err := runner.RunCmd(exec.Command("sudo", "systemctl", "start", "nerdctld.socket")); err != nil { - exit.Error(reason.StartNerdctld, fmt.Sprintf("Failed to enable nerdctld.socket: %s", out.Output()), err) + if rest, err := runner.RunCmd(exec.Command("sudo", "systemctl", "start", "nerdctld.socket")); err != nil { + exit.Error(reason.StartNerdctld, fmt.Sprintf("Failed to enable nerdctld.socket: %s", rest.Output()), err) } // sudo systemctl start nerdctld.service - if out, err := runner.RunCmd(exec.Command("sudo", "systemctl", "start", "nerdctld.service")); err != nil { - exit.Error(reason.StartNerdctld, fmt.Sprintf("Failed to enable nerdctld.service: %s", out.Output()), err) + if rest, err := runner.RunCmd(exec.Command("sudo", "systemctl", "start", "nerdctld.service")); err != nil { + exit.Error(reason.StartNerdctld, fmt.Sprintf("Failed to enable nerdctld.service: %s", rest.Output()), err) } // set up environment variable on remote machine. docker client uses 'non-login & non-interactive shell' therefore the only way is to modify .bashrc file of user 'docker' // insert this at 4th line envSetupCommand := exec.Command("/bin/bash", "-c", "sed -i '4i export DOCKER_HOST=unix:///run/nerdctld.sock' .bashrc") - if out, err := runner.RunCmd(envSetupCommand); err != nil { - exit.Error(reason.StartNerdctld, fmt.Sprintf("Failed to set up DOCKER_HOST: %s", out.Output()), err) + if rest, err := runner.RunCmd(envSetupCommand); err != nil { + exit.Error(reason.StartNerdctld, fmt.Sprintf("Failed to set up DOCKER_HOST: %s", rest.Output()), err) } } diff --git a/cmd/minikube/main.go b/cmd/minikube/main.go index af9a29c924..eb3fa841e2 100644 --- a/cmd/minikube/main.go +++ b/cmd/minikube/main.go @@ -156,13 +156,13 @@ func checkLogFileMaxSize(file string, maxSizeKB int64) bool { // logFileName generates a default logfile name in the form minikube___.log from args func logFileName(dir string, logIdx int64) string { h := sha1.New() - user, err := user.Current() + userInfo, err := user.Current() if err != nil { klog.Warningf("Unable to get username to add to log filename hash: %v", err) } else { - _, err := h.Write([]byte(user.Username)) + _, err := h.Write([]byte(userInfo.Username)) if err != nil { - klog.Warningf("Unable to add username %s to log filename hash: %v", user.Username, err) + klog.Warningf("Unable to add username %s to log filename hash: %v", userInfo.Username, err) } } for _, s := range pflag.Args() { diff --git a/hack/benchmark/cpu_usage/auto_pause/chart.go b/hack/benchmark/cpu_usage/auto_pause/chart.go index 295ba645a1..86c618136b 100644 --- a/hack/benchmark/cpu_usage/auto_pause/chart.go +++ b/hack/benchmark/cpu_usage/auto_pause/chart.go @@ -63,11 +63,13 @@ func execute() error { p := plot.New() // Set view options - if runtime.GOOS == "darwin" { + switch runtime.GOOS { + case "darwin": p.Title.Text = "CPU% Busy Overhead - With Auto Pause vs. Non Auto Pause (less is better)" - } else if runtime.GOOS == "linux" { + case "linux": p.Title.Text = "CPU% Busy Overhead - With Auto Pause vs. Non Auto Pause (less is better)" } + p.Y.Label.Text = "CPU overhead%" // Open non-autopause csv file of benchmark summary @@ -158,9 +160,10 @@ func execute() error { p.Legend.Top = true // Add x-lay names - if runtime.GOOS == "darwin" { + switch runtime.GOOS { + case "darwin": p.NominalX("OS idle", "minikube hyperkit", "minikube virtualbox", "minikube docker", "Docker for Mac Kubernetes", "k3d", "kind") - } else if runtime.GOOS == "linux" { + case "linux": p.NominalX("OS idle", "minikube kvm2", "minikube virtualbox", "minikube docker", "Docker idle", "k3d", "kind") } @@ -223,16 +226,18 @@ func execute() error { p.Add(napl, apl) // Output bar graph - if runtime.GOOS == "darwin" { + switch runtime.GOOS { + case "darwin": if err := p.Save(13*vg.Inch, 8*vg.Inch, FOLDER+"/mac.png"); err != nil { return errors.Wrap(err, "Failed to create bar graph png") } log.Printf("Generated graph png to %s/mac.png", FOLDER) - } else if runtime.GOOS == "linux" { + case "linux": if err := p.Save(13*vg.Inch, 10*vg.Inch, FOLDER+"/linux.png"); err != nil { return errors.Wrap(err, "Failed to create bar graph png") } log.Printf("Generated graph png to %s/linux.png", FOLDER) } + return nil } diff --git a/hack/benchmark/cpu_usage/idle_only/chart.go b/hack/benchmark/cpu_usage/idle_only/chart.go index f3f4e1f759..aaf466b67c 100644 --- a/hack/benchmark/cpu_usage/idle_only/chart.go +++ b/hack/benchmark/cpu_usage/idle_only/chart.go @@ -62,11 +62,13 @@ func execute() error { p := plot.New() // Set view options - if runtime.GOOS == "darwin" { + switch runtime.GOOS { + case "darwin": p.Title.Text = "CPU% Busy Overhead - Average first 5 minutes on macOS (less is better)" - } else if runtime.GOOS == "linux" { + case "linux": p.Title.Text = "CPU% Busy Overhead - Average first 5 minutes on Linux (less is better)" } + p.Y.Label.Text = "CPU overhead%" // Open csv file of benchmark summary @@ -114,9 +116,10 @@ func execute() error { p.Legend.Top = true // Add x-lay names - if runtime.GOOS == "darwin" { + switch runtime.GOOS { + case "darwin": p.NominalX("OS idle", "minikube hyperkit", "minikube virtualbox", "minikube docker", "Docker for Mac Kubernetes", "k3d", "kind") - } else if runtime.GOOS == "linux" { + case "linux": p.NominalX("OS idle", "minikube kvm2", "minikube virtualbox", "minikube docker", "Docker idle", "k3d", "kind") } @@ -151,16 +154,18 @@ func execute() error { p.Add(cl) // Output bar graph - if runtime.GOOS == "darwin" { + switch runtime.GOOS { + case "darwin": if err := p.Save(13*vg.Inch, 8*vg.Inch, FOLDER+"/mac.png"); err != nil { return errors.Wrap(err, "Failed to create bar graph png") } log.Printf("Generated graph png to %s/mac.png", FOLDER) - } else if runtime.GOOS == "linux" { + case "linux": if err := p.Save(13*vg.Inch, 10*vg.Inch, FOLDER+"/linux.png"); err != nil { return errors.Wrap(err, "Failed to create bar graph png") } log.Printf("Generated graph png to %s/linux.png", FOLDER) } + return nil } diff --git a/hack/update/buildkit_version/update_buildkit_version.go b/hack/update/buildkit_version/update_buildkit_version.go index cfb98dcd69..92a1f2afd9 100644 --- a/hack/update/buildkit_version/update_buildkit_version.go +++ b/hack/update/buildkit_version/update_buildkit_version.go @@ -113,7 +113,7 @@ func updateHashFile(version, arch, filePath string) error { return fmt.Errorf("failed to open hash file: %v", err) } defer f.Close() - if _, err := f.WriteString(fmt.Sprintf("sha256 %x buildkit-%s.linux-%s.tar.gz\n", sum, version, arch)); err != nil { + if _, err := fmt.Fprintf(f, "sha256 %x buildkit-%s.linux-%s.tar.gz\n", sum, version, arch); err != nil { return fmt.Errorf("failed to write to hash file: %v", err) } return nil diff --git a/hack/update/cni_plugins_version/update_cni_plugins_version.go b/hack/update/cni_plugins_version/update_cni_plugins_version.go index ad3fc4b7a7..c8f3d86a22 100644 --- a/hack/update/cni_plugins_version/update_cni_plugins_version.go +++ b/hack/update/cni_plugins_version/update_cni_plugins_version.go @@ -117,7 +117,7 @@ func updateHashFile(version, arch, packagePath string) error { return fmt.Errorf("failed to open hash file: %v", err) } defer f.Close() - if _, err := f.WriteString(fmt.Sprintf("sha256 %x cni-plugins-linux-%s-%s.tgz\n", sum, arch, version)); err != nil { + if _, err := fmt.Fprintf(f, "sha256 %x cni-plugins-linux-%s-%s.tgz\n", sum, arch, version); err != nil { return fmt.Errorf("failed to write to hash file: %v", err) } return nil diff --git a/hack/update/containerd_version/update_containerd_version.go b/hack/update/containerd_version/update_containerd_version.go index bfdceed62f..8af4c8a711 100644 --- a/hack/update/containerd_version/update_containerd_version.go +++ b/hack/update/containerd_version/update_containerd_version.go @@ -107,7 +107,7 @@ func updateHashFile(version, arch, folderSuffix string, shaSum [sha256.Size]byte return fmt.Errorf("failed to open hash file: %v", err) } defer f.Close() - if _, err := f.WriteString(fmt.Sprintf("sha256 %x %s.tar.gz\n", shaSum, version)); err != nil { + if _, err := fmt.Fprintf(f, "sha256 %x %s.tar.gz\n", shaSum, version); err != nil { return fmt.Errorf("failed to write to hash file: %v", err) } return nil diff --git a/hack/update/cri-o_version/update_cri-o_version.go b/hack/update/cri-o_version/update_cri-o_version.go index e842881ada..abdb86a81e 100644 --- a/hack/update/cri-o_version/update_cri-o_version.go +++ b/hack/update/cri-o_version/update_cri-o_version.go @@ -107,7 +107,7 @@ func updateHashFile(version string) error { return fmt.Errorf("failed to open hash file: %v", err) } defer f.Close() - if _, err := f.WriteString(fmt.Sprintf("sha256 %x %s.tar.gz\n", sum, version)); err != nil { + if _, err := fmt.Fprintf(f, "sha256 %x %s.tar.gz\n", sum, version); err != nil { return fmt.Errorf("failed to write to hash file: %v", err) } return nil diff --git a/hack/update/cri_dockerd_version/update_cri_dockerd_version.go b/hack/update/cri_dockerd_version/update_cri_dockerd_version.go index f76f685911..7423172752 100644 --- a/hack/update/cri_dockerd_version/update_cri_dockerd_version.go +++ b/hack/update/cri_dockerd_version/update_cri_dockerd_version.go @@ -135,7 +135,7 @@ func updateHashFile(filePath, commit string, shaSum [sha256.Size]byte) error { return fmt.Errorf("failed to open hash file: %v", err) } defer f.Close() - if _, err := f.WriteString(fmt.Sprintf("sha256 %x %s.tar.gz\n", shaSum, commit)); err != nil { + if _, err := fmt.Fprintf(f, "sha256 %x %s.tar.gz\n", shaSum, commit); err != nil { return fmt.Errorf("failed to write to hash file: %v", err) } return nil diff --git a/hack/update/crictl_version/update_crictl_version.go b/hack/update/crictl_version/update_crictl_version.go index 17a07a91e1..72dd12a3a7 100644 --- a/hack/update/crictl_version/update_crictl_version.go +++ b/hack/update/crictl_version/update_crictl_version.go @@ -111,7 +111,7 @@ func updateHashFile(version, arch, packagePath string) error { return fmt.Errorf("failed to open hash file: %v", err) } defer f.Close() - if _, err := f.WriteString(fmt.Sprintf("sha256 %x crictl-%s-linux-%s.tar.gz\n", sum, version, arch)); err != nil { + if _, err := fmt.Fprintf(f, "sha256 %x crictl-%s-linux-%s.tar.gz\n", sum, version, arch); err != nil { return fmt.Errorf("failed to write to hash file: %v", err) } return nil diff --git a/hack/update/crun_version/update_crun_version.go b/hack/update/crun_version/update_crun_version.go index c04f0e24be..039738a4b3 100644 --- a/hack/update/crun_version/update_crun_version.go +++ b/hack/update/crun_version/update_crun_version.go @@ -92,7 +92,7 @@ func updateHashFiles(version string) error { return fmt.Errorf("failed to open hash file: %v", err) } defer f.Close() - if _, err := f.WriteString(fmt.Sprintf("sha256 %x crun-%s.tar.gz\n", sum, version)); err != nil { + if _, err := fmt.Fprintf(f, "sha256 %x crun-%s.tar.gz\n", sum, version); err != nil { return fmt.Errorf("failed to write to hash file: %v", err) } return nil diff --git a/hack/update/docker_buildx_version/update_docker_buildx_version.go b/hack/update/docker_buildx_version/update_docker_buildx_version.go index b484736a3a..7ca6062b36 100644 --- a/hack/update/docker_buildx_version/update_docker_buildx_version.go +++ b/hack/update/docker_buildx_version/update_docker_buildx_version.go @@ -105,7 +105,7 @@ func updateHashFile(version, arch, folderSuffix string, shaSum [sha256.Size]byte return fmt.Errorf("failed to open hash file: %v", err) } defer f.Close() - if _, err := f.WriteString(fmt.Sprintf("sha256 %x %s.tar.gz\n", shaSum, version)); err != nil { + if _, err := fmt.Fprintf(f, "sha256 %x %s.tar.gz\n", shaSum, version); err != nil { return fmt.Errorf("failed to write to hash file: %v", err) } return nil diff --git a/hack/update/docker_version/update_docker_version.go b/hack/update/docker_version/update_docker_version.go index 704902e4d8..1dca891e56 100644 --- a/hack/update/docker_version/update_docker_version.go +++ b/hack/update/docker_version/update_docker_version.go @@ -95,7 +95,7 @@ func updateHashFile(version, arch, folderSuffix string) error { return fmt.Errorf("failed to open hash file: %v", err) } defer f.Close() - if _, err := f.WriteString(fmt.Sprintf("sha256 %x docker-%s.tgz\n", sum, version)); err != nil { + if _, err := fmt.Fprintf(f, "sha256 %x docker-%s.tgz\n", sum, version); err != nil { return fmt.Errorf("failed to write to hash file: %v", err) } return nil diff --git a/hack/update/golang_version/update_golang_version.go b/hack/update/golang_version/update_golang_version.go index 7096324f15..8f672218b9 100644 --- a/hack/update/golang_version/update_golang_version.go +++ b/hack/update/golang_version/update_golang_version.go @@ -154,7 +154,7 @@ func updateGoHashFile(version string) error { return fmt.Errorf("failed to open go.hash file: %v", err) } defer f.Close() - if _, err := f.WriteString(fmt.Sprintf("sha256 %s go%s.src.tar.gz\n", sha, version)); err != nil { + if _, err := fmt.Fprintf(f, "sha256 %s go%s.src.tar.gz\n", sha, version); err != nil { return fmt.Errorf("failed to write to go.hash file: %v", err) } return nil diff --git a/hack/update/nerdctl_version/update_nerdctl_version.go b/hack/update/nerdctl_version/update_nerdctl_version.go index 5f196255b0..01d2a3a83a 100644 --- a/hack/update/nerdctl_version/update_nerdctl_version.go +++ b/hack/update/nerdctl_version/update_nerdctl_version.go @@ -105,7 +105,7 @@ func updateHashFile(version, arch, packagePath string) error { return fmt.Errorf("failed to open hash file: %v", err) } defer f.Close() - if _, err := f.WriteString(fmt.Sprintf("sha256 %x nerdctl-%s-linux-%s.tar.gz\n", sum, version, arch)); err != nil { + if _, err := fmt.Fprintf(f, "sha256 %x nerdctl-%s-linux-%s.tar.gz\n", sum, version, arch); err != nil { return fmt.Errorf("failed to write to hash file: %v", err) } return nil diff --git a/hack/update/runc_version/update_runc_version.go b/hack/update/runc_version/update_runc_version.go index 27c4263d69..ef89e79ed3 100644 --- a/hack/update/runc_version/update_runc_version.go +++ b/hack/update/runc_version/update_runc_version.go @@ -91,7 +91,7 @@ func updateHashFiles(version string) error { return fmt.Errorf("failed to open hash file: %v", err) } defer f.Close() - if _, err := f.WriteString(fmt.Sprintf("sha256 %x %s.tar.gz\n", sum, version)); err != nil { + if _, err := fmt.Fprintf(f, "sha256 %x %s.tar.gz\n", sum, version); err != nil { return fmt.Errorf("failed to write to hash file: %v", err) } return nil diff --git a/pkg/addons/addons_storage_classes.go b/pkg/addons/addons_storage_classes.go index a921294343..45e8648593 100644 --- a/pkg/addons/addons_storage_classes.go +++ b/pkg/addons/addons_storage_classes.go @@ -37,9 +37,10 @@ func enableOrDisableStorageClasses(cc *config.ClusterConfig, name string, val st } class := defaultStorageClassProvisioner - if name == "storage-provisioner-gluster" { + switch name { + case "storage-provisioner-gluster": class = "glusterfile" - } else if name == "storage-provisioner-rancher" { + case "storage-provisioner-rancher": class = "local-path" } diff --git a/pkg/drivers/kic/kic.go b/pkg/drivers/kic/kic.go index 9fae7a457c..6be2547ea8 100644 --- a/pkg/drivers/kic/kic.go +++ b/pkg/drivers/kic/kic.go @@ -456,20 +456,20 @@ func (d *Driver) Stop() error { } } - runtime, err := cruntime.New(cruntime.Config{Type: d.NodeConfig.ContainerRuntime, Runner: d.exec}) + crMgr, err := cruntime.New(cruntime.Config{Type: d.NodeConfig.ContainerRuntime, Runner: d.exec}) if err != nil { // won't return error because: // even though we can't stop the cotainers inside, we still wanna stop the minikube container itself klog.Errorf("unable to get container runtime: %v", err) } else { - containers, err := runtime.ListContainers(cruntime.ListContainersOptions{Namespaces: constants.DefaultNamespaces}) + containers, err := crMgr.ListContainers(cruntime.ListContainersOptions{Namespaces: constants.DefaultNamespaces}) if err != nil { klog.Infof("unable list containers : %v", err) } if len(containers) > 0 { - if err := runtime.StopContainers(containers); err != nil { + if err := crMgr.StopContainers(containers); err != nil { klog.Infof("unable to stop containers : %v", err) } - if err := runtime.KillContainers(containers); err != nil { + if err := crMgr.KillContainers(containers); err != nil { klog.Errorf("unable to kill containers : %v", err) } } diff --git a/pkg/drivers/kic/oci/network_create.go b/pkg/drivers/kic/oci/network_create.go index cbdc1076e6..cd38dc785c 100644 --- a/pkg/drivers/kic/oci/network_create.go +++ b/pkg/drivers/kic/oci/network_create.go @@ -109,7 +109,7 @@ func CreateNetwork(ociBin, networkName, subnet, staticIP string) (net.IP, error) return info.gateway, nil } // don't retry if error is not address is taken - if !(errors.Is(err, ErrNetworkSubnetTaken) || errors.Is(err, ErrNetworkGatewayTaken)) { + if !errors.Is(err, ErrNetworkSubnetTaken) && !errors.Is(err, ErrNetworkGatewayTaken) { klog.Errorf("error while trying to create %s network %s %s: %v", ociBin, networkName, subnet.CIDR, err) return nil, fmt.Errorf("un-retryable: %w", err) } diff --git a/pkg/drivers/kic/oci/oci.go b/pkg/drivers/kic/oci/oci.go index 5e761db724..b02fb22397 100644 --- a/pkg/drivers/kic/oci/oci.go +++ b/pkg/drivers/kic/oci/oci.go @@ -191,9 +191,10 @@ func CreateContainerNode(p CreateParams) error { //nolint to suppress cyclomatic runArgs = append(runArgs, "--ip", p.IP) } - if p.GPUs == "all" || p.GPUs == "nvidia" { + switch p.GPUs { + case "all", "nvidia": runArgs = append(runArgs, "--gpus", "all", "--env", "NVIDIA_DRIVER_CAPABILITIES=all") - } else if p.GPUs == "amd" { + case "amd": /* https://rocm.docs.amd.com/projects/install-on-linux/en/latest/how-to/docker.html * "--security-opt seccomp=unconfined" is also required but included above. */ diff --git a/pkg/drivers/kvm/network.go b/pkg/drivers/kvm/network.go index 66e947ed5f..633a672bc8 100644 --- a/pkg/drivers/kvm/network.go +++ b/pkg/drivers/kvm/network.go @@ -225,15 +225,15 @@ func (d *Driver) createNetwork() error { log.Debugf("created network xml: %s", networkXML.String()) // define the network using our template - var network *libvirt.Network - network, err = conn.NetworkDefineXML(networkXML.String()) + var libvirtNet *libvirt.Network + libvirtNet, err = conn.NetworkDefineXML(networkXML.String()) if err != nil { return fmt.Errorf("defining private KVM network %s %s from xml %s: %w", d.PrivateNetwork, subnet.CIDR, networkXML.String(), err) } // and finally create & start it log.Debugf("trying to create private KVM network %s %s...", d.PrivateNetwork, subnet.CIDR) - if err = network.Create(); err == nil { + if err = libvirtNet.Create(); err == nil { log.Debugf("private KVM network %s %s created", d.PrivateNetwork, subnet.CIDR) return nil } @@ -263,7 +263,7 @@ func (d *Driver) deleteNetwork() error { // network: private log.Debugf("Checking if network %s exists...", d.PrivateNetwork) - network, err := conn.LookupNetworkByName(d.PrivateNetwork) + libvirtNet, err := conn.LookupNetworkByName(d.PrivateNetwork) if err != nil { if lvErr(err).Code == libvirt.ERR_NO_NETWORK { log.Warnf("Network %s does not exist. Skipping deletion", d.PrivateNetwork) @@ -271,7 +271,7 @@ func (d *Driver) deleteNetwork() error { } return errors.Wrapf(err, "failed looking up network %s", d.PrivateNetwork) } - defer func() { _ = network.Free() }() + defer func() { _ = libvirtNet.Free() }() log.Debugf("Network %s exists", d.PrivateNetwork) err = d.checkDomains(conn) @@ -283,18 +283,18 @@ func (d *Driver) deleteNetwork() error { log.Debugf("Trying to delete network %s...", d.PrivateNetwork) deleteFunc := func() error { - active, err := network.IsActive() + active, err := libvirtNet.IsActive() if err != nil { return err } if active { log.Debugf("Destroying active network %s", d.PrivateNetwork) - if err := network.Destroy(); err != nil { + if err := libvirtNet.Destroy(); err != nil { return err } } log.Debugf("Undefining inactive network %s", d.PrivateNetwork) - return network.Undefine() + return libvirtNet.Undefine() } if err := retry.Local(deleteFunc, 10*time.Second); err != nil { return errors.Wrap(err, "deleting network") @@ -391,23 +391,23 @@ func (d *Driver) checkDomains(conn *libvirt.Connect) error { // addStaticIP appends new host's name, MAC and static IP address record to list of network DHCP leases. // It will return nil if host record already exists. -func addStaticIP(conn *libvirt.Connect, network, hostname, mac, ip string) error { - l, err := dhcpLease(conn, network, hostname, mac, ip) +func addStaticIP(conn *libvirt.Connect, networkName, hostname, mac, ip string) error { + l, err := dhcpLease(conn, networkName, hostname, mac, ip) if err != nil { - return fmt.Errorf("failed looking up network %s for host DHCP lease {name: %q, mac: %q, ip: %q}: %w", network, hostname, mac, ip, err) + return fmt.Errorf("failed looking up network %s for host DHCP lease {name: %q, mac: %q, ip: %q}: %w", networkName, hostname, mac, ip, err) } if l != nil { - log.Debugf("skip adding static IP to network %s - found existing host DHCP lease matching {name: %q, mac: %q, ip: %q}", network, hostname, mac, ip) + log.Debugf("skip adding static IP to network %s - found existing host DHCP lease matching {name: %q, mac: %q, ip: %q}", networkName, hostname, mac, ip) return nil } - net, err := conn.LookupNetworkByName(network) + libvirtNet, err := conn.LookupNetworkByName(networkName) if err != nil { - return fmt.Errorf("failed looking up network %s: %w", network, err) + return fmt.Errorf("failed looking up network %s: %w", networkName, err) } - defer func() { _ = net.Free() }() + defer func() { _ = libvirtNet.Free() }() - return net.Update( + return libvirtNet.Update( libvirt.NETWORK_UPDATE_COMMAND_ADD_LAST, libvirt.NETWORK_SECTION_IP_DHCP_HOST, -1, @@ -417,23 +417,23 @@ func addStaticIP(conn *libvirt.Connect, network, hostname, mac, ip string) error // delStaticIP deletes static IP address record that matches given combination of host's name, MAC and IP from list of network DHCP leases. // It will return nil if record doesn't exist. -func delStaticIP(conn *libvirt.Connect, network, hostname, mac, ip string) error { - l, err := dhcpLease(conn, network, hostname, mac, ip) +func delStaticIP(conn *libvirt.Connect, networkName, hostname, mac, ip string) error { + l, err := dhcpLease(conn, networkName, hostname, mac, ip) if err != nil { - return fmt.Errorf("failed looking up network %s for host DHCP lease {name: %q, mac: %q, ip: %q}: %w", network, hostname, mac, ip, err) + return fmt.Errorf("failed looking up network %s for host DHCP lease {name: %q, mac: %q, ip: %q}: %w", networkName, hostname, mac, ip, err) } if l == nil { - log.Debugf("skip deleting static IP from network %s - couldn't find host DHCP lease matching {name: %q, mac: %q, ip: %q}", network, hostname, mac, ip) + log.Debugf("skip deleting static IP from network %s - couldn't find host DHCP lease matching {name: %q, mac: %q, ip: %q}", networkName, hostname, mac, ip) return nil } - net, err := conn.LookupNetworkByName(network) + libvirtNet, err := conn.LookupNetworkByName(networkName) if err != nil { - return fmt.Errorf("failed looking up network %s: %w", network, err) + return fmt.Errorf("failed looking up network %s: %w", networkName, err) } - defer func() { _ = net.Free() }() + defer func() { _ = libvirtNet.Free() }() - return net.Update( + return libvirtNet.Update( libvirt.NETWORK_UPDATE_COMMAND_DELETE, libvirt.NETWORK_SECTION_IP_DHCP_HOST, -1, @@ -442,56 +442,56 @@ func delStaticIP(conn *libvirt.Connect, network, hostname, mac, ip string) error } // dhcpLease returns network DHCP lease that matches given combination of host's name, MAC and IP. -func dhcpLease(conn *libvirt.Connect, network, hostname, mac, ip string) (lease *libvirt.NetworkDHCPLease, err error) { +func dhcpLease(conn *libvirt.Connect, networkName, hostname, mac, ip string) (lease *libvirt.NetworkDHCPLease, err error) { if hostname == "" && mac == "" && ip == "" { return nil, nil } - net, err := conn.LookupNetworkByName(network) + libvirtNet, err := conn.LookupNetworkByName(networkName) if err != nil { - return nil, fmt.Errorf("failed looking up network %s: %w", network, err) + return nil, fmt.Errorf("failed looking up network %s: %w", networkName, err) } - defer func() { _ = net.Free() }() + defer func() { _ = libvirtNet.Free() }() - leases, err := net.GetDHCPLeases() + leases, err := libvirtNet.GetDHCPLeases() if err != nil { return nil, fmt.Errorf("failed getting host DHCP leases: %w", err) } for _, l := range leases { if (hostname == "" || hostname == l.Hostname) && (mac == "" || mac == l.Mac) && (ip == "" || ip == l.IPaddr) { - log.Debugf("found host DHCP lease matching {name: %q, mac: %q, ip: %q} in network %s: %+v", hostname, mac, ip, network, l) + log.Debugf("found host DHCP lease matching {name: %q, mac: %q, ip: %q} in network %s: %+v", hostname, mac, ip, networkName, l) return &l, nil } } - log.Debugf("unable to find host DHCP lease matching {name: %q, mac: %q, ip: %q} in network %s", hostname, mac, ip, network) + log.Debugf("unable to find host DHCP lease matching {name: %q, mac: %q, ip: %q} in network %s", hostname, mac, ip, networkName) return nil, nil } // ipFromAPI returns current primary IP address of domain interface in network. -func ipFromAPI(conn *libvirt.Connect, domain, network string) (string, error) { - mac, err := macFromXML(conn, domain, network) +func ipFromAPI(conn *libvirt.Connect, domain, networkName string) (string, error) { + mac, err := macFromXML(conn, domain, networkName) if err != nil { return "", fmt.Errorf("failed getting MAC address: %w", err) } ifaces, err := ifListFromAPI(conn, domain) if err != nil { - return "", fmt.Errorf("failed getting network %s interfaces using API of domain %s: %w", network, domain, err) + return "", fmt.Errorf("failed getting network %s interfaces using API of domain %s: %w", networkName, domain, err) } for _, i := range ifaces { if i.Hwaddr == mac { if i.Addrs != nil { - log.Debugf("domain %s has current primary IP address %s and MAC address %s in network %s", domain, i.Addrs[0].Addr, mac, network) + log.Debugf("domain %s has current primary IP address %s and MAC address %s in network %s", domain, i.Addrs[0].Addr, mac, networkName) return i.Addrs[0].Addr, nil } - log.Debugf("domain %s with MAC address %s doesn't have current IP address in network %s: %+v", domain, mac, network, i) + log.Debugf("domain %s with MAC address %s doesn't have current IP address in network %s: %+v", domain, mac, networkName, i) return "", nil } } - log.Debugf("unable to find current IP address of domain %s in network %s", domain, network) + log.Debugf("unable to find current IP address of domain %s in network %s", domain, networkName) return "", nil } @@ -522,40 +522,40 @@ func ifListFromAPI(conn *libvirt.Connect, domain string) ([]libvirt.DomainInterf } // ipFromXML returns defined IP address of interface in network. -func ipFromXML(conn *libvirt.Connect, domain, network string) (string, error) { - mac, err := macFromXML(conn, domain, network) +func ipFromXML(conn *libvirt.Connect, domain, networkName string) (string, error) { + mac, err := macFromXML(conn, domain, networkName) if err != nil { return "", fmt.Errorf("failed getting MAC address: %w", err) } - lease, err := dhcpLease(conn, network, "", mac, "") + lease, err := dhcpLease(conn, networkName, "", mac, "") if err != nil { - return "", fmt.Errorf("failed looking up network %s for host DHCP lease {name: , mac: %q, ip: }: %w", network, mac, err) + return "", fmt.Errorf("failed looking up network %s for host DHCP lease {name: , mac: %q, ip: }: %w", networkName, mac, err) } if lease == nil { - log.Debugf("unable to find defined IP address of network %s interface with MAC address %s", network, mac) + log.Debugf("unable to find defined IP address of network %s interface with MAC address %s", networkName, mac) return "", nil } - log.Debugf("domain %s has defined IP address %s and MAC address %s in network %s", domain, lease.IPaddr, mac, network) + log.Debugf("domain %s has defined IP address %s and MAC address %s in network %s", domain, lease.IPaddr, mac, networkName) return lease.IPaddr, nil } // macFromXML returns defined MAC address of interface in network from domain XML. -func macFromXML(conn *libvirt.Connect, domain, network string) (string, error) { +func macFromXML(conn *libvirt.Connect, domain, networkName string) (string, error) { domIfs, err := ifListFromXML(conn, domain) if err != nil { - return "", fmt.Errorf("failed getting network %s interfaces using XML of domain %s: %w", network, domain, err) + return "", fmt.Errorf("failed getting network %s interfaces using XML of domain %s: %w", networkName, domain, err) } for _, i := range domIfs { - if i.Source.Network == network { - log.Debugf("domain %s has defined MAC address %s in network %s", domain, i.Mac.Address, network) + if i.Source.Network == networkName { + log.Debugf("domain %s has defined MAC address %s in network %s", domain, i.Mac.Address, networkName) return i.Mac.Address, nil } } - return "", fmt.Errorf("unable to get defined MAC address of network %s interface using XML of domain %s: network %s not found", network, domain, network) + return "", fmt.Errorf("unable to get defined MAC address of network %s interface using XML of domain %s: network %s not found", networkName, domain, networkName) } // ifListFromXML returns defined domain interfaces from domain XML. diff --git a/pkg/generate/docs.go b/pkg/generate/docs.go index 42230c7540..bdfac319a7 100644 --- a/pkg/generate/docs.go +++ b/pkg/generate/docs.go @@ -97,17 +97,17 @@ func GenMarkdownCustom(cmd *cobra.Command, w io.Writer) error { buf.WriteString(long + "\n\n") if cmd.Runnable() { - buf.WriteString(fmt.Sprintf("```shell\n%s\n```\n\n", cmd.UseLine())) + fmt.Fprintf(buf, "```shell\n%s\n```\n\n", cmd.UseLine()) } if len(cmd.Aliases) > 0 { buf.WriteString("### Aliases\n\n") - buf.WriteString(fmt.Sprintf("%s\n\n", cmd.Aliases)) + fmt.Fprintf(buf, "%s\n\n", cmd.Aliases) } if len(cmd.Example) > 0 { buf.WriteString("### Examples\n\n") - buf.WriteString(fmt.Sprintf("```\n%s\n```\n\n", cmd.Example)) + fmt.Fprintf(buf, "```\n%s\n```\n\n", cmd.Example) } if err := printOptions(buf, cmd); err != nil { diff --git a/pkg/generate/errorcodes.go b/pkg/generate/errorcodes.go index a81decdce4..145d92d47d 100644 --- a/pkg/generate/errorcodes.go +++ b/pkg/generate/errorcodes.go @@ -83,7 +83,7 @@ func ErrorCodes(docPath string, pathsToCheck []string) error { // This is the numeric code of the error, e.g. 80 for ExGuest Error code := s.Value - buf.WriteString(fmt.Sprintf("%s: %s \n", code, currentError)) + fmt.Fprintf(buf, "%s: %s \n", code, currentError) } return true }) @@ -100,7 +100,7 @@ func ErrorCodes(docPath string, pathsToCheck []string) error { currentNode = id.Name if strings.HasPrefix(currentNode, "Ex") && currentNode != "ExitCode" { // We have all the info we're going to get on this error, print it out - buf.WriteString(fmt.Sprintf("%s (Exit code %v) \n", currentID, currentNode)) + fmt.Fprintf(buf, "%s (Exit code %v) \n", currentID, currentNode) if currentComment != "" { buf.WriteString(currentComment + " \n") } diff --git a/pkg/kapi/kapi.go b/pkg/kapi/kapi.go index c7f2786017..4b34297c37 100644 --- a/pkg/kapi/kapi.go +++ b/pkg/kapi/kapi.go @@ -48,21 +48,21 @@ var ( ) // ClientConfig returns the client configuration for a kubectl context -func ClientConfig(context string) (*rest.Config, error) { +func ClientConfig(ctx string) (*rest.Config, error) { loader := clientcmd.NewDefaultClientConfigLoadingRules() - cc := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loader, &clientcmd.ConfigOverrides{CurrentContext: context}) + cc := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loader, &clientcmd.ConfigOverrides{CurrentContext: ctx}) c, err := cc.ClientConfig() if err != nil { return nil, fmt.Errorf("client config: %v", err) } c = proxy.UpdateTransport(c) - klog.V(1).Infof("client config for %s: %+v", context, c) + klog.V(1).Infof("client config for %s: %+v", ctx, c) return c, nil } // Client gets the Kubernetes client for a kubectl context name -func Client(context string) (*kubernetes.Clientset, error) { - c, err := ClientConfig(context) +func Client(ctx string) (*kubernetes.Clientset, error) { + c, err := ClientConfig(ctx) if err != nil { return nil, err } diff --git a/pkg/minikube/bootstrapper/certs.go b/pkg/minikube/bootstrapper/certs.go index 23f2cb3788..3354f6bd82 100644 --- a/pkg/minikube/bootstrapper/certs.go +++ b/pkg/minikube/bootstrapper/certs.go @@ -579,8 +579,8 @@ func installCertSymlinks(cr command.Runner, caCerts map[string]string) error { // canRead returns true if the file represented // by path exists and is readable, otherwise false. -func canRead(path string) bool { - f, err := os.Open(path) +func canRead(filePath string) bool { + f, err := os.Open(filePath) if err != nil { return false } diff --git a/pkg/minikube/bootstrapper/images/images.go b/pkg/minikube/bootstrapper/images/images.go index f139e18a5b..27b5b7f1d6 100644 --- a/pkg/minikube/bootstrapper/images/images.go +++ b/pkg/minikube/bootstrapper/images/images.go @@ -164,9 +164,11 @@ func auxiliary(mirror string) []string { func storageProvisioner(mirror string) string { cv := version.GetStorageProvisionerVersion() in := "k8s-minikube/storage-provisioner:" + cv - if mirror == "" { + + switch mirror { + case "": mirror = "gcr.io" - } else if mirror == constants.AliyunMirror { + case constants.AliyunMirror: in = "storage-provisioner:" + cv } return path.Join(mirror, in) diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go index fc6c25de15..04c67b6362 100644 --- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go +++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go @@ -172,7 +172,7 @@ func (k *Bootstrapper) clearStaleConfigs(cfg config.ClusterConfig) { // init initialises primary control-plane using kubeadm. func (k *Bootstrapper) init(cfg config.ClusterConfig) error { - version, err := util.ParseKubernetesVersion(cfg.KubernetesConfig.KubernetesVersion) + ver, err := util.ParseKubernetesVersion(cfg.KubernetesConfig.KubernetesVersion) if err != nil { return errors.Wrap(err, "parsing Kubernetes version") } @@ -195,7 +195,7 @@ func (k *Bootstrapper) init(cfg config.ClusterConfig) error { "Swap", // For "none" users who have swap configured "NumCPU", // For "none" users who have too few CPUs } - if version.GE(semver.MustParse("1.20.0")) { + if ver.GE(semver.MustParse("1.20.0")) { ignore = append(ignore, "Mem", // For "none" users who have too little memory ) @@ -719,7 +719,7 @@ func (k *Bootstrapper) restartPrimaryControlPlane(cfg config.ClusterConfig) erro // and by that time we would exit completely, so we wait until kubelet begins restarting pods klog.Info("waiting for restarted kubelet to initialise ...") start := time.Now() - wait := func() error { + waitFunc := func() error { pods, err := client.CoreV1().Pods(meta.NamespaceSystem).List(context.Background(), meta.ListOptions{LabelSelector: "tier=control-plane"}) if err != nil { return err @@ -731,7 +731,7 @@ func (k *Bootstrapper) restartPrimaryControlPlane(cfg config.ClusterConfig) erro } return fmt.Errorf("kubelet not initialised") } - _ = retry.Expo(wait, 250*time.Millisecond, 1*time.Minute) + _ = retry.Expo(waitFunc, 250*time.Millisecond, 1*time.Minute) klog.Infof("kubelet initialised") klog.Infof("duration metric: took %s waiting for restarted kubelet to initialise ...", time.Since(start)) } @@ -784,11 +784,11 @@ func (k *Bootstrapper) GenerateToken(cc config.ClusterConfig) (string, error) { joinCmd = fmt.Sprintf("%s --ignore-preflight-errors=all", strings.TrimSpace(joinCmd)) // avoid "Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the 'criSocket' field in the kubeadm configuration file: unix:///var/run/containerd/containerd.sock, unix:///var/run/cri-dockerd.sock" error - version, err := util.ParseKubernetesVersion(cc.KubernetesConfig.KubernetesVersion) + ver, err := util.ParseKubernetesVersion(cc.KubernetesConfig.KubernetesVersion) if err != nil { return "", errors.Wrap(err, "parsing Kubernetes version") } - cr, err := cruntime.New(cruntime.Config{Type: cc.KubernetesConfig.ContainerRuntime, Runner: k.c, Socket: cc.KubernetesConfig.CRISocket, KubernetesVersion: version}) + cr, err := cruntime.New(cruntime.Config{Type: cc.KubernetesConfig.ContainerRuntime, Runner: k.c, Socket: cc.KubernetesConfig.CRISocket, KubernetesVersion: ver}) if err != nil { klog.Errorf("cruntime: %v", err) } @@ -840,11 +840,11 @@ func StopKubernetes(runner command.Runner, cr cruntime.Manager) { // DeleteCluster removes the components that were started earlier func (k *Bootstrapper) DeleteCluster(k8s config.KubernetesConfig) error { - version, err := util.ParseKubernetesVersion(k8s.KubernetesVersion) + ver, err := util.ParseKubernetesVersion(k8s.KubernetesVersion) if err != nil { return errors.Wrap(err, "parsing Kubernetes version") } - cr, err := cruntime.New(cruntime.Config{Type: k8s.ContainerRuntime, Runner: k.c, Socket: k8s.CRISocket, KubernetesVersion: version}) + cr, err := cruntime.New(cruntime.Config{Type: k8s.ContainerRuntime, Runner: k.c, Socket: k8s.CRISocket, KubernetesVersion: ver}) if err != nil { return errors.Wrap(err, "runtime") } @@ -852,7 +852,7 @@ func (k *Bootstrapper) DeleteCluster(k8s config.KubernetesConfig) error { ka := bsutil.InvokeKubeadm(k8s.KubernetesVersion) sp := cr.SocketPath() cmd := fmt.Sprintf("%s reset --cri-socket %s --force", ka, sp) - if version.LT(semver.MustParse("1.11.0")) { + if ver.LT(semver.MustParse("1.11.0")) { cmd = fmt.Sprintf("%s reset --cri-socket %s", ka, sp) } @@ -874,12 +874,12 @@ func (k *Bootstrapper) SetupCerts(k8s config.ClusterConfig, n config.Node, pcpCm func (k *Bootstrapper) UpdateCluster(cfg config.ClusterConfig) error { klog.Infof("updating cluster %+v ...", cfg) - images, err := images.Kubeadm(cfg.KubernetesConfig.ImageRepository, cfg.KubernetesConfig.KubernetesVersion) + imgs, err := images.Kubeadm(cfg.KubernetesConfig.ImageRepository, cfg.KubernetesConfig.KubernetesVersion) if err != nil { return errors.Wrap(err, "kubeadm images") } - version, err := util.ParseKubernetesVersion(cfg.KubernetesConfig.KubernetesVersion) + ver, err := util.ParseKubernetesVersion(cfg.KubernetesConfig.KubernetesVersion) if err != nil { return errors.Wrap(err, "parsing Kubernetes version") } @@ -887,7 +887,7 @@ func (k *Bootstrapper) UpdateCluster(cfg config.ClusterConfig) error { Type: cfg.KubernetesConfig.ContainerRuntime, Runner: k.c, Socket: cfg.KubernetesConfig.CRISocket, - KubernetesVersion: version, + KubernetesVersion: ver, }) if err != nil { return errors.Wrap(err, "runtime") @@ -903,7 +903,7 @@ func (k *Bootstrapper) UpdateCluster(cfg config.ClusterConfig) error { } if cfg.KubernetesConfig.ShouldLoadCachedImages { - if err := machine.LoadCachedImages(&cfg, k.c, images, detect.ImageCacheDir(), false); err != nil { + if err := machine.LoadCachedImages(&cfg, k.c, imgs, detect.ImageCacheDir(), false); err != nil { out.FailureT("Unable to load cached images: {{.error}}", out.V{"error": err}) } } diff --git a/pkg/minikube/cluster/ip.go b/pkg/minikube/cluster/ip.go index 1f28d50c20..0e64bae991 100644 --- a/pkg/minikube/cluster/ip.go +++ b/pkg/minikube/cluster/ip.go @@ -34,21 +34,21 @@ import ( ) // HostIP gets the ip address to be used for mapping host -> VM and VM -> host -func HostIP(host *host.Host, clusterName string) (net.IP, error) { - switch host.DriverName { +func HostIP(hostInfo *host.Host, clusterName string) (net.IP, error) { + switch hostInfo.DriverName { case driver.Docker: - return oci.RoutableHostIPFromInside(oci.Docker, clusterName, host.Name) + return oci.RoutableHostIPFromInside(oci.Docker, clusterName, hostInfo.Name) case driver.Podman: - return oci.RoutableHostIPFromInside(oci.Podman, clusterName, host.Name) + return oci.RoutableHostIPFromInside(oci.Podman, clusterName, hostInfo.Name) case driver.SSH: - ip, err := host.Driver.GetIP() + ip, err := hostInfo.Driver.GetIP() if err != nil { return []byte{}, errors.Wrap(err, "Error getting VM/Host IP address") } return net.ParseIP(ip), nil case driver.KVM2: // `host.Driver.GetIP` returns dhcp lease info for a given network(=`virsh net-dhcp-leases minikube-net`) - vmIPString, err := host.Driver.GetIP() + vmIPString, err := hostInfo.Driver.GetIP() if err != nil { return []byte{}, errors.Wrap(err, "Error getting VM/Host IP address") } @@ -59,7 +59,7 @@ func HostIP(host *host.Host, clusterName string) (net.IP, error) { } return net.IPv4(vmIP[0], vmIP[1], vmIP[2], byte(1)), nil case driver.QEMU, driver.QEMU2: - ipString, err := host.Driver.GetIP() + ipString, err := hostInfo.Driver.GetIP() if err != nil { return []byte{}, errors.Wrap(err, "Error getting IP address") } @@ -70,7 +70,7 @@ func HostIP(host *host.Host, clusterName string) (net.IP, error) { // socket_vmnet network case return net.ParseIP("192.168.105.1"), nil case driver.HyperV: - v := reflect.ValueOf(host.Driver).Elem() + v := reflect.ValueOf(hostInfo.Driver).Elem() var hypervVirtualSwitch string // We don't have direct access to hyperv.Driver so use reflection to retrieve the virtual switch name for i := 0; i < v.NumField(); i++ { @@ -91,7 +91,7 @@ func HostIP(host *host.Host, clusterName string) (net.IP, error) { return ip, nil case driver.VirtualBox: vBoxManageCmd := driver.VBoxManagePath() - out, err := exec.Command(vBoxManageCmd, "showvminfo", host.Name, "--machinereadable").Output() + out, err := exec.Command(vBoxManageCmd, "showvminfo", hostInfo.Name, "--machinereadable").Output() if err != nil { return []byte{}, errors.Wrap(err, "vboxmanage") } @@ -126,11 +126,11 @@ func HostIP(host *host.Host, clusterName string) (net.IP, error) { return net.ParseIP(ip), nil case driver.HyperKit: - vmIPString, _ := host.Driver.GetIP() + vmIPString, _ := hostInfo.Driver.GetIP() gatewayIPString := vmIPString[:strings.LastIndex(vmIPString, ".")+1] + "1" return net.ParseIP(gatewayIPString), nil case driver.VMware: - vmIPString, err := host.Driver.GetIP() + vmIPString, err := hostInfo.Driver.GetIP() if err != nil { return []byte{}, errors.Wrap(err, "Error getting VM IP address") } @@ -140,28 +140,28 @@ func HostIP(host *host.Host, clusterName string) (net.IP, error) { } return net.IPv4(vmIP[0], vmIP[1], vmIP[2], byte(1)), nil case driver.VFKit: - vmIPString, _ := host.Driver.GetIP() + vmIPString, _ := hostInfo.Driver.GetIP() gatewayIPString := vmIPString[:strings.LastIndex(vmIPString, ".")+1] + "1" return net.ParseIP(gatewayIPString), nil case driver.None: return net.ParseIP("127.0.0.1"), nil default: - return []byte{}, fmt.Errorf("HostIP not yet implemented for %q driver", host.DriverName) + return []byte{}, fmt.Errorf("HostIP not yet implemented for %q driver", hostInfo.DriverName) } } // DriverIP gets the ip address of the current minikube cluster func DriverIP(api libmachine.API, machineName string) (net.IP, error) { - host, err := machine.LoadHost(api, machineName) + hostInfo, err := machine.LoadHost(api, machineName) if err != nil { return nil, err } - ipStr, err := host.Driver.GetIP() + ipStr, err := hostInfo.Driver.GetIP() if err != nil { return nil, errors.Wrap(err, "getting IP") } - if driver.IsKIC(host.DriverName) { + if driver.IsKIC(hostInfo.DriverName) { ipStr = oci.DefaultBindIPV4 } ip := net.ParseIP(ipStr) diff --git a/pkg/minikube/cni/cni.go b/pkg/minikube/cni/cni.go index bb8b0bb8fc..a8c3147915 100644 --- a/pkg/minikube/cni/cni.go +++ b/pkg/minikube/cni/cni.go @@ -245,18 +245,18 @@ func ConfigureDefaultBridgeCNIs(r Runner, networkPlugin string) error { // disableAllBridgeCNIs disables all bridge cnis by changing extension to "mk_disabled" of all *bridge* config file(s) found in default location (ie, /etc/cni/net.d). func disableAllBridgeCNIs(r Runner) error { - path := "/etc/cni/net.d" + cniPath := "/etc/cni/net.d" out, err := r.RunCmd(exec.Command( // for cri-o, we also disable 87-podman.conflist (that does not have 'bridge' in its name) - "sudo", "find", path, "-maxdepth", "1", "-type", "f", "(", "(", "-name", "*bridge*", "-or", "-name", "*podman*", ")", "-and", "-not", "-name", "*.mk_disabled", ")", "-printf", "%p, ", "-exec", "sh", "-c", + "sudo", "find", cniPath, "-maxdepth", "1", "-type", "f", "(", "(", "-name", "*bridge*", "-or", "-name", "*podman*", ")", "-and", "-not", "-name", "*.mk_disabled", ")", "-printf", "%p, ", "-exec", "sh", "-c", `sudo mv {} {}.mk_disabled`, ";")) if err != nil { - return fmt.Errorf("failed to disable all bridge cni configs in %q: %v", path, err) + return fmt.Errorf("failed to disable all bridge cni configs in %q: %v", cniPath, err) } configs := strings.Trim(out.Stdout.String(), ", ") if len(configs) == 0 { - klog.Infof("no active bridge cni configs found in %q - nothing to disable", path) + klog.Infof("no active bridge cni configs found in %q - nothing to disable", cniPath) return nil } klog.Infof("disabled [%s] bridge cni config(s)", configs) diff --git a/pkg/minikube/command/kic_runner.go b/pkg/minikube/command/kic_runner.go index 8c393b123f..8eacd7a743 100644 --- a/pkg/minikube/command/kic_runner.go +++ b/pkg/minikube/command/kic_runner.go @@ -44,10 +44,10 @@ type kicRunner struct { } // NewKICRunner returns a kicRunner implementor of runner which runs cmds inside a container -func NewKICRunner(containerNameOrID string, oci string) Runner { +func NewKICRunner(containerNameOrID string, ociName string) Runner { return &kicRunner{ nameOrID: containerNameOrID, - ociBin: oci, // docker or podman + ociBin: ociName, // docker or podman } } @@ -271,8 +271,8 @@ func copyToPodman(src string, dest string) error { defer file.Close() parts := strings.Split(dest, ":") container := parts[0] - path := parts[1] - cmd := exec.Command(oci.Podman, "exec", "-i", container, "tee", path) + containerPath := parts[1] + cmd := exec.Command(oci.Podman, "exec", "-i", container, "tee", containerPath) cmd.Stdin = file klog.Infof("Run: %v", cmd) if err := cmd.Run(); err != nil { diff --git a/pkg/minikube/config/profile.go b/pkg/minikube/config/profile.go index 0f67fa0960..b9f7ea9da8 100644 --- a/pkg/minikube/config/profile.go +++ b/pkg/minikube/config/profile.go @@ -58,7 +58,7 @@ func ControlPlanes(cc ClusterConfig) []Node { func IsPrimaryControlPlane(cc ClusterConfig, node Node) bool { // TODO (prezha): find where, for "none" driver, we set first (ie, primary control-plane) node name to "m01" - that should not happen but it's happening before pr #17909 // return node.ControlPlane && node.Name == "" - return cc.Nodes != nil && cc.Nodes[0].Name == node.Name + return len(cc.Nodes) > 0 && cc.Nodes[0].Name == node.Name } // IsValid checks if the profile has the essential info needed for a profile diff --git a/pkg/minikube/cruntime/containerd.go b/pkg/minikube/cruntime/containerd.go index 290007e1bd..931ee6bb1b 100644 --- a/pkg/minikube/cruntime/containerd.go +++ b/pkg/minikube/cruntime/containerd.go @@ -281,9 +281,9 @@ func (r *Containerd) ListImages(ListImagesOptions) ([]ListImage, error) { } // LoadImage loads an image into this runtime -func (r *Containerd) LoadImage(path string) error { - klog.Infof("Loading image: %s", path) - c := exec.Command("sudo", "ctr", "-n=k8s.io", "images", "import", path) +func (r *Containerd) LoadImage(imagePath string) error { + klog.Infof("Loading image: %s", imagePath) + c := exec.Command("sudo", "ctr", "-n=k8s.io", "images", "import", imagePath) if _, err := r.Runner.RunCmd(c); err != nil { return errors.Wrapf(err, "ctr images import") } @@ -296,9 +296,9 @@ func (r *Containerd) PullImage(name string) error { } // SaveImage save an image from this runtime -func (r *Containerd) SaveImage(name string, path string) error { - klog.Infof("Saving image %s: %s", name, path) - c := exec.Command("sudo", "ctr", "-n=k8s.io", "images", "export", path, name) +func (r *Containerd) SaveImage(name string, destPath string) error { + klog.Infof("Saving image %s: %s", name, destPath) + c := exec.Command("sudo", "ctr", "-n=k8s.io", "images", "export", destPath, name) if _, err := r.Runner.RunCmd(c); err != nil { return errors.Wrapf(err, "ctr images export") } @@ -526,11 +526,11 @@ func (r *Containerd) Preload(cc config.ClusterConfig) error { cRuntime := cc.KubernetesConfig.ContainerRuntime // If images already exist, return - images, err := images.Kubeadm(cc.KubernetesConfig.ImageRepository, k8sVersion) + imgs, err := images.Kubeadm(cc.KubernetesConfig.ImageRepository, k8sVersion) if err != nil { return errors.Wrap(err, "getting images") } - if containerdImagesPreloaded(r.Runner, images) { + if containerdImagesPreloaded(r.Runner, imgs) { klog.Info("Images already preloaded, skipping extraction") return nil } @@ -583,7 +583,7 @@ func (r *Containerd) Restart() error { } // containerdImagesPreloaded returns true if all images have been preloaded -func containerdImagesPreloaded(runner command.Runner, images []string) bool { +func containerdImagesPreloaded(runner command.Runner, imgs []string) bool { var rr *command.RunResult imageList := func() (err error) { @@ -604,7 +604,7 @@ func containerdImagesPreloaded(runner command.Runner, images []string) bool { } // Make sure images == imgs - for _, i := range images { + for _, i := range imgs { found := false for _, ji := range jsonImages.Images { for _, rt := range ji.RepoTags { @@ -629,6 +629,6 @@ func containerdImagesPreloaded(runner command.Runner, images []string) bool { } // ImagesPreloaded returns true if all images have been preloaded -func (r *Containerd) ImagesPreloaded(images []string) bool { - return containerdImagesPreloaded(r.Runner, images) +func (r *Containerd) ImagesPreloaded(imgs []string) bool { + return containerdImagesPreloaded(r.Runner, imgs) } diff --git a/pkg/minikube/cruntime/crio.go b/pkg/minikube/cruntime/crio.go index fec6339b6b..85699fa0d3 100644 --- a/pkg/minikube/cruntime/crio.go +++ b/pkg/minikube/cruntime/crio.go @@ -271,9 +271,9 @@ func (r *CRIO) ListImages(ListImagesOptions) ([]ListImage, error) { } // LoadImage loads an image into this runtime -func (r *CRIO) LoadImage(path string) error { - klog.Infof("Loading image: %s", path) - c := exec.Command("sudo", "podman", "load", "-i", path) +func (r *CRIO) LoadImage(imgPath string) error { + klog.Infof("Loading image: %s", imgPath) + c := exec.Command("sudo", "podman", "load", "-i", imgPath) if _, err := r.Runner.RunCmd(c); err != nil { return errors.Wrap(err, "crio load image") } @@ -286,9 +286,9 @@ func (r *CRIO) PullImage(name string) error { } // SaveImage saves an image from this runtime -func (r *CRIO) SaveImage(name string, path string) error { - klog.Infof("Saving image %s: %s", name, path) - c := exec.Command("sudo", "podman", "save", name, "-o", path) +func (r *CRIO) SaveImage(name string, destPath string) error { + klog.Infof("Saving image %s: %s", name, destPath) + c := exec.Command("sudo", "podman", "save", name, "-o", destPath) if _, err := r.Runner.RunCmd(c); err != nil { return errors.Wrap(err, "crio save image") } @@ -425,11 +425,11 @@ func (r *CRIO) Preload(cc config.ClusterConfig) error { cRuntime := cc.KubernetesConfig.ContainerRuntime // If images already exist, return - images, err := images.Kubeadm(cc.KubernetesConfig.ImageRepository, k8sVersion) + imgs, err := images.Kubeadm(cc.KubernetesConfig.ImageRepository, k8sVersion) if err != nil { return errors.Wrap(err, "getting images") } - if crioImagesPreloaded(r.Runner, images) { + if crioImagesPreloaded(r.Runner, imgs) { klog.Info("Images already preloaded, skipping extraction") return nil } @@ -477,7 +477,7 @@ func (r *CRIO) Preload(cc config.ClusterConfig) error { } // crioImagesPreloaded returns true if all images have been preloaded -func crioImagesPreloaded(runner command.Runner, images []string) bool { +func crioImagesPreloaded(runner command.Runner, imgs []string) bool { rr, err := runner.RunCmd(exec.Command("sudo", "crictl", "images", "--output", "json")) if err != nil { return false @@ -491,7 +491,7 @@ func crioImagesPreloaded(runner command.Runner, images []string) bool { } // Make sure images == imgs - for _, i := range images { + for _, i := range imgs { found := false for _, ji := range jsonImages.Images { for _, rt := range ji.RepoTags { @@ -516,6 +516,6 @@ func crioImagesPreloaded(runner command.Runner, images []string) bool { } // ImagesPreloaded returns true if all images have been preloaded -func (r *CRIO) ImagesPreloaded(images []string) bool { - return crioImagesPreloaded(r.Runner, images) +func (r *CRIO) ImagesPreloaded(imgs []string) bool { + return crioImagesPreloaded(r.Runner, imgs) } diff --git a/pkg/minikube/cruntime/docker.go b/pkg/minikube/cruntime/docker.go index b54e8175df..db97878d0c 100644 --- a/pkg/minikube/cruntime/docker.go +++ b/pkg/minikube/cruntime/docker.go @@ -285,9 +285,9 @@ func (r *Docker) ListImages(ListImagesOptions) ([]ListImage, error) { Tag string `json:"Tag"` Size string `json:"Size"` } - images := strings.Split(rr.Stdout.String(), "\n") + imgs := strings.Split(rr.Stdout.String(), "\n") result := []ListImage{} - for _, img := range images { + for _, img := range imgs { if img == "" { continue } @@ -313,9 +313,9 @@ func (r *Docker) ListImages(ListImagesOptions) ([]ListImage, error) { } // LoadImage loads an image into this runtime -func (r *Docker) LoadImage(path string) error { - klog.Infof("Loading image: %s", path) - c := exec.Command("/bin/bash", "-c", fmt.Sprintf("sudo cat %s | docker load", path)) +func (r *Docker) LoadImage(imgPath string) error { + klog.Infof("Loading image: %s", imgPath) + c := exec.Command("/bin/bash", "-c", fmt.Sprintf("sudo cat %s | docker load", imgPath)) if _, err := r.Runner.RunCmd(c); err != nil { return errors.Wrap(err, "loadimage docker") } @@ -336,9 +336,9 @@ func (r *Docker) PullImage(name string) error { } // SaveImage saves an image from this runtime -func (r *Docker) SaveImage(name string, path string) error { - klog.Infof("Saving image %s: %s", name, path) - c := exec.Command("/bin/bash", "-c", fmt.Sprintf("docker save '%s' | sudo tee %s >/dev/null", name, path)) +func (r *Docker) SaveImage(name string, imagePath string) error { + klog.Infof("Saving image %s: %s", name, imagePath) + c := exec.Command("/bin/bash", "-c", fmt.Sprintf("docker save '%s' | sudo tee %s >/dev/null", name, imagePath)) if _, err := r.Runner.RunCmd(c); err != nil { return errors.Wrap(err, "saveimage docker") } @@ -594,13 +594,14 @@ func (r *Docker) configureDocker(driver string) error { StorageDriver: "overlay2", } - if r.GPUs == "all" || r.GPUs == "nvidia" { + switch r.GPUs { + case "all", "nvidia": assets.Addons["nvidia-device-plugin"].EnableByDefault() daemonConfig.DefaultRuntime = "nvidia" runtimes := &dockerDaemonRuntimes{} runtimes.Nvidia.Path = "/usr/bin/nvidia-container-runtime" daemonConfig.Runtimes = runtimes - } else if r.GPUs == "amd" { + case "amd": assets.Addons["amd-gpu-device-plugin"].EnableByDefault() } @@ -624,11 +625,11 @@ func (r *Docker) Preload(cc config.ClusterConfig) error { cRuntime := cc.KubernetesConfig.ContainerRuntime // If images already exist, return - images, err := images.Kubeadm(cc.KubernetesConfig.ImageRepository, k8sVersion) + imgs, err := images.Kubeadm(cc.KubernetesConfig.ImageRepository, k8sVersion) if err != nil { return errors.Wrap(err, "getting images") } - if dockerImagesPreloaded(r.Runner, images) { + if dockerImagesPreloaded(r.Runner, imgs) { klog.Info("Images already preloaded, skipping extraction") return nil } @@ -687,7 +688,7 @@ func (r *Docker) Preload(cc config.ClusterConfig) error { } // dockerImagesPreloaded returns true if all images have been preloaded -func dockerImagesPreloaded(runner command.Runner, images []string) bool { +func dockerImagesPreloaded(runner command.Runner, imgs []string) bool { rr, err := runner.RunCmd(exec.Command("docker", "images", "--format", "{{.Repository}}:{{.Tag}}")) if err != nil { klog.Warning(err) @@ -702,7 +703,7 @@ func dockerImagesPreloaded(runner command.Runner, images []string) bool { klog.Infof("Got preloaded images: %s", rr.Output()) // Make sure images == imgs - for _, i := range images { + for _, i := range imgs { i = image.TrimDockerIO(i) if _, ok := preloadedImages[i]; !ok { klog.Infof("%s wasn't preloaded", i) @@ -759,8 +760,8 @@ func dockerBoundToContainerd(runner command.Runner) bool { } // ImagesPreloaded returns true if all images have been preloaded -func (r *Docker) ImagesPreloaded(images []string) bool { - return dockerImagesPreloaded(r.Runner, images) +func (r *Docker) ImagesPreloaded(imgs []string) bool { + return dockerImagesPreloaded(r.Runner, imgs) } const ( diff --git a/pkg/minikube/download/iso.go b/pkg/minikube/download/iso.go index 2e86d3865c..19f4fe1152 100644 --- a/pkg/minikube/download/iso.go +++ b/pkg/minikube/download/iso.go @@ -67,8 +67,8 @@ func LocalISOResource(isoURL string) string { } // fileURI returns a file:// URI for a path -func fileURI(path string) string { - return "file://" + filepath.ToSlash(path) +func fileURI(filePath string) string { + return "file://" + filepath.ToSlash(filePath) } // localISOPath returns where an ISO should be stored locally diff --git a/pkg/minikube/download/preload.go b/pkg/minikube/download/preload.go index 970ad656e5..6d6696b7a6 100644 --- a/pkg/minikube/download/preload.go +++ b/pkg/minikube/download/preload.go @@ -250,10 +250,10 @@ func saveChecksumFile(k8sVersion, containerRuntime string, checksum []byte) erro // verifyChecksum returns true if the checksum of the local binary matches // the checksum of the remote binary -func verifyChecksum(k8sVersion, containerRuntime, path string) error { - klog.Infof("verifying checksum of %s ...", path) +func verifyChecksum(k8sVersion, containerRuntime, binaryPath string) error { + klog.Infof("verifying checksum of %s ...", binaryPath) // get md5 checksum of tarball path - contents, err := os.ReadFile(path) + contents, err := os.ReadFile(binaryPath) if err != nil { return errors.Wrap(err, "reading tarball") } @@ -266,7 +266,7 @@ func verifyChecksum(k8sVersion, containerRuntime, path string) error { // create a slice of checksum, which is [16]byte if string(remoteChecksum) != string(checksum[:]) { - return fmt.Errorf("checksum of %s does not match remote checksum (%s != %s)", path, string(remoteChecksum), string(checksum[:])) + return fmt.Errorf("checksum of %s does not match remote checksum (%s != %s)", binaryPath, string(remoteChecksum), string(checksum[:])) } return nil } diff --git a/pkg/minikube/driver/auxdriver/install.go b/pkg/minikube/driver/auxdriver/install.go index 854e9a48b5..76e3b78333 100644 --- a/pkg/minikube/driver/auxdriver/install.go +++ b/pkg/minikube/driver/auxdriver/install.go @@ -159,7 +159,7 @@ func extractDriverVersion(s string) string { return strings.TrimPrefix(v, "v") } -func driverExists(driver string) bool { - _, err := exec.LookPath(driver) +func driverExists(driverName string) bool { + _, err := exec.LookPath(driverName) return err == nil } diff --git a/pkg/minikube/firewall/firewall.go b/pkg/minikube/firewall/firewall.go index 9d879433ef..63ccdfb414 100644 --- a/pkg/minikube/firewall/firewall.go +++ b/pkg/minikube/firewall/firewall.go @@ -38,28 +38,28 @@ func IsBootpdBlocked(cc config.ClusterConfig) bool { if cc.Driver != driver.QEMU2 || runtime.GOOS != "darwin" || cc.Network != "socket_vmnet" { return false } - out, err := exec.Command("/usr/libexec/ApplicationFirewall/socketfilterfw", "--getglobalstate").Output() + rest, err := exec.Command("/usr/libexec/ApplicationFirewall/socketfilterfw", "--getglobalstate").Output() if err != nil { klog.Warningf("failed to get firewall state: %v", err) return false } - if regexp.MustCompile(`Firewall is disabled`).Match(out) { + if regexp.MustCompile(`Firewall is disabled`).Match(rest) { return false } - out, err = exec.Command("/usr/libexec/ApplicationFirewall/socketfilterfw", "--getallowsigned").Output() + rest, err = exec.Command("/usr/libexec/ApplicationFirewall/socketfilterfw", "--getallowsigned").Output() if err != nil { // macOS < 15 or other issue: need to use --list. klog.Warningf("failed to list firewall allowedsinged option: %v", err) // macOS >= 15: bootpd may be allowed as builtin software - } else if regexp.MustCompile(`Automatically allow built-in signed software ENABLED`).Match(out) { + } else if regexp.MustCompile(`Automatically allow built-in signed software ENABLED`).Match(rest) { return false } - out, err = exec.Command("/usr/libexec/ApplicationFirewall/socketfilterfw", "--listapps").Output() + rest, err = exec.Command("/usr/libexec/ApplicationFirewall/socketfilterfw", "--listapps").Output() if err != nil { klog.Warningf("failed to list firewall apps: %v", err) return false } - return !regexp.MustCompile(`\/usr\/libexec\/bootpd.*\n.*\( Allow`).Match(out) + return !regexp.MustCompile(`\/usr\/libexec\/bootpd.*\n.*\( Allow`).Match(rest) } // UnblockBootpd adds bootpd to the built-in macOS firewall and then unblocks it diff --git a/pkg/minikube/image/image.go b/pkg/minikube/image/image.go index b567036c63..d2bfc9a93f 100644 --- a/pkg/minikube/image/image.go +++ b/pkg/minikube/image/image.go @@ -340,6 +340,6 @@ func normalizeTagName(image string) string { // Remove docker.io prefix since it won't be included in image names // when we call `docker images`. -func TrimDockerIO(name string) string { - return strings.TrimPrefix(name, "docker.io/") +func TrimDockerIO(imageName string) string { + return strings.TrimPrefix(imageName, "docker.io/") } diff --git a/pkg/minikube/localpath/localpath.go b/pkg/minikube/localpath/localpath.go index ef77e07dc7..f3ce7de894 100644 --- a/pkg/minikube/localpath/localpath.go +++ b/pkg/minikube/localpath/localpath.go @@ -184,9 +184,9 @@ func replaceWinDriveLetterToVolumeName(s string) (string, error) { if err != nil { return "", err } - path := vname + s[3:] + p := vname + s[3:] - return path, nil + return p, nil } func getWindowsVolumeNameCmd(d string) (string, error) { diff --git a/pkg/minikube/machine/build_images.go b/pkg/minikube/machine/build_images.go index 8b5f77c5af..5366c2e710 100644 --- a/pkg/minikube/machine/build_images.go +++ b/pkg/minikube/machine/build_images.go @@ -42,7 +42,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, allNodes bool, nodeName string) error { +func BuildImage(srcPath 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") @@ -52,12 +52,12 @@ func BuildImage(path string, file string, tag string, push bool, env []string, o succeeded := []string{} failed := []string{} - u, err := url.Parse(path) + u, err := url.Parse(srcPath) if err == nil && u.Scheme == "file" { - path = u.Path + srcPath = u.Path } remote := err == nil && u.Scheme != "" - if runtime.GOOS == "windows" && filepath.VolumeName(path) != "" { + if runtime.GOOS == "windows" && filepath.VolumeName(srcPath) != "" { remote = false } @@ -116,9 +116,9 @@ func BuildImage(path string, file string, tag string, push bool, env []string, o return err } if remote { - err = buildImage(cr, c.KubernetesConfig, path, file, tag, push, env, opt) + err = buildImage(cr, c.KubernetesConfig, srcPath, file, tag, push, env, opt) } else { - err = transferAndBuildImage(cr, c.KubernetesConfig, path, file, tag, push, env, opt) + err = transferAndBuildImage(cr, c.KubernetesConfig, srcPath, file, tag, push, env, opt) } if err != nil { failed = append(failed, m) diff --git a/pkg/minikube/machine/cache_images.go b/pkg/minikube/machine/cache_images.go index df8d081103..73f29c427d 100644 --- a/pkg/minikube/machine/cache_images.go +++ b/pkg/minikube/machine/cache_images.go @@ -73,19 +73,19 @@ func CacheImagesForBootstrapper(imageRepository, version string) error { } // LoadCachedImages loads previously cached images into the container runtime -func LoadCachedImages(cc *config.ClusterConfig, runner command.Runner, images []string, cacheDir string, overwrite bool) error { +func LoadCachedImages(cc *config.ClusterConfig, runner command.Runner, imgs []string, cacheDir string, overwrite bool) error { cr, err := cruntime.New(cruntime.Config{Type: cc.KubernetesConfig.ContainerRuntime, Runner: runner}) if err != nil { return errors.Wrap(err, "runtime") } // Skip loading images if images already exist - if !overwrite && cr.ImagesPreloaded(images) { + if !overwrite && cr.ImagesPreloaded(imgs) { klog.Infof("Images are preloaded, skipping loading") return nil } - klog.Infof("LoadCachedImages start: %s", images) + klog.Infof("LoadCachedImages start: %s", imgs) start := time.Now() defer func() { @@ -102,19 +102,19 @@ func LoadCachedImages(cc *config.ClusterConfig, runner command.Runner, images [] } } - for _, image := range images { - image := image + for _, img := range imgs { + img := img g.Go(func() error { // Put a ten second limit on deciding if an image needs transfer // because it takes much less than that time to just transfer the image. // This is needed because if running in offline mode, we can spend minutes here // waiting for i/o timeout. - err := timedNeedsTransfer(imgClient, image, cr, 10*time.Second) + err := timedNeedsTransfer(imgClient, img, cr, 10*time.Second) if err == nil { return nil } - klog.Infof("%q needs transfer: %v", image, err) - return transferAndLoadCachedImage(runner, cc.KubernetesConfig, image, cacheDir) + klog.Infof("%q needs transfer: %v", img, err) + return transferAndLoadCachedImage(runner, cc.KubernetesConfig, img, cacheDir) }) } if err := g.Wait(); err != nil { @@ -172,10 +172,10 @@ func needsTransfer(imgClient *client.Client, imgName string, cr cruntime.Manager // LoadLocalImages loads images into the container runtime func LoadLocalImages(cc *config.ClusterConfig, runner command.Runner, images []string) error { var g errgroup.Group - for _, image := range images { - image := image + for _, img := range images { + img := img g.Go(func() error { - return transferAndLoadImage(runner, cc.KubernetesConfig, image, image) + return transferAndLoadImage(runner, cc.KubernetesConfig, img, img) }) } if err := g.Wait(); err != nil { @@ -353,10 +353,10 @@ func SaveCachedImages(cc *config.ClusterConfig, runner command.Runner, images [] var g errgroup.Group - for _, image := range images { - image := image + for _, img := range images { + img := img g.Go(func() error { - return transferAndSaveCachedImage(runner, cc.KubernetesConfig, image, cacheDir) + return transferAndSaveCachedImage(runner, cc.KubernetesConfig, img, cacheDir) }) } if err := g.Wait(); err != nil { @@ -369,10 +369,10 @@ func SaveCachedImages(cc *config.ClusterConfig, runner command.Runner, images [] // SaveLocalImages saves images from the container runtime func SaveLocalImages(cc *config.ClusterConfig, runner command.Runner, images []string, output string) error { var g errgroup.Group - for _, image := range images { - image := image + for _, img := range images { + img := img g.Go(func() error { - return transferAndSaveImage(runner, cc.KubernetesConfig, output, image) + return transferAndSaveImage(runner, cc.KubernetesConfig, output, img) }) } if err := g.Wait(); err != nil { @@ -527,8 +527,8 @@ func transferAndSaveImage(cr command.Runner, k8s config.KubernetesConfig, dst st } // pullImages pulls images to the container run time -func pullImages(cruntime cruntime.Manager, images []string) error { - klog.Infof("pullImages start: %s", images) +func pullImages(crMgr cruntime.Manager, imgs []string) error { + klog.Infof("pullImages start: %s", imgs) start := time.Now() defer func() { @@ -537,10 +537,10 @@ func pullImages(cruntime cruntime.Manager, images []string) error { var g errgroup.Group - for _, image := range images { - image := image + for _, img := range imgs { + img := img g.Go(func() error { - return cruntime.PullImage(image) + return crMgr.PullImage(img) }) } if err := g.Wait(); err != nil { @@ -588,11 +588,11 @@ func PullImages(images []string, profile *config.Profile) error { if err != nil { return err } - cruntime, err := cruntime.New(cruntime.Config{Type: c.KubernetesConfig.ContainerRuntime, Runner: runner}) + crMgr, err := cruntime.New(cruntime.Config{Type: c.KubernetesConfig.ContainerRuntime, Runner: runner}) if err != nil { return errors.Wrap(err, "error creating container runtime") } - err = pullImages(cruntime, images) + err = pullImages(crMgr, images) if err != nil { failed = append(failed, m) klog.Warningf("Failed to pull images for profile %s %v", pName, err.Error()) @@ -608,8 +608,8 @@ func PullImages(images []string, profile *config.Profile) error { } // removeImages removes images from the container run time -func removeImages(cruntime cruntime.Manager, images []string) error { - klog.Infof("removeImages start: %s", images) +func removeImages(crMgr cruntime.Manager, imgs []string) error { + klog.Infof("removeImages start: %s", imgs) start := time.Now() defer func() { @@ -618,10 +618,10 @@ func removeImages(cruntime cruntime.Manager, images []string) error { var g errgroup.Group - for _, image := range images { - image := image + for _, img := range imgs { + img := img g.Go(func() error { - return cruntime.RemoveImage(image) + return crMgr.RemoveImage(img) }) } if err := g.Wait(); err != nil { @@ -669,11 +669,11 @@ func RemoveImages(images []string, profile *config.Profile) error { if err != nil { return err } - cruntime, err := cruntime.New(cruntime.Config{Type: c.KubernetesConfig.ContainerRuntime, Runner: runner}) + crMgr, err := cruntime.New(cruntime.Config{Type: c.KubernetesConfig.ContainerRuntime, Runner: runner}) if err != nil { return errors.Wrap(err, "error creating container runtime") } - err = removeImages(cruntime, images) + err = removeImages(crMgr, images) if err != nil { failed = append(failed, m) klog.Warningf("Failed to remove images for profile %s %v", pName, err.Error()) @@ -757,19 +757,19 @@ func ListImages(profile *config.Profile, format string) error { } renderImagesTable(data) case "json": - json, err := json.Marshal(uniqueImages) + jsondata, err := json.Marshal(uniqueImages) if err != nil { klog.Warningf("Error marshalling images list: %v", err.Error()) return nil } - fmt.Printf("%s\n", json) + fmt.Printf("%s\n", jsondata) case "yaml": - yaml, err := yaml.Marshal(uniqueImages) + yamldata, err := yaml.Marshal(uniqueImages) if err != nil { klog.Warningf("Error marshalling images list: %v", err.Error()) return nil } - fmt.Printf("%s\n", yaml) + fmt.Printf("%s\n", yamldata) default: res := []string{} for _, item := range uniqueImages { @@ -892,11 +892,11 @@ func TagImage(profile *config.Profile, source string, target string) error { if err != nil { return err } - cruntime, err := cruntime.New(cruntime.Config{Type: c.KubernetesConfig.ContainerRuntime, Runner: runner}) + crMgr, err := cruntime.New(cruntime.Config{Type: c.KubernetesConfig.ContainerRuntime, Runner: runner}) if err != nil { return errors.Wrap(err, "error creating container runtime") } - err = cruntime.TagImage(source, target) + err = crMgr.TagImage(source, target) if err != nil { failed = append(failed, m) klog.Warningf("Failed to tag image for profile %s %v", pName, err.Error()) @@ -912,8 +912,8 @@ func TagImage(profile *config.Profile, source string, target string) error { } // pushImages pushes images from the container run time -func pushImages(cruntime cruntime.Manager, images []string) error { - klog.Infof("pushImages start: %s", images) +func pushImages(crMgr cruntime.Manager, imgs []string) error { + klog.Infof("pushImages start: %s", imgs) start := time.Now() defer func() { @@ -922,10 +922,10 @@ func pushImages(cruntime cruntime.Manager, images []string) error { var g errgroup.Group - for _, image := range images { - image := image + for _, img := range imgs { + img := img g.Go(func() error { - return cruntime.PushImage(image) + return crMgr.PushImage(img) }) } if err := g.Wait(); err != nil { @@ -973,11 +973,11 @@ func PushImages(images []string, profile *config.Profile) error { if err != nil { return err } - cruntime, err := cruntime.New(cruntime.Config{Type: c.KubernetesConfig.ContainerRuntime, Runner: runner}) + crMgr, err := cruntime.New(cruntime.Config{Type: c.KubernetesConfig.ContainerRuntime, Runner: runner}) if err != nil { return errors.Wrap(err, "error creating container runtime") } - err = pushImages(cruntime, images) + err = pushImages(crMgr, images) if err != nil { failed = append(failed, m) klog.Warningf("Failed to push image for profile %s %v", pName, err.Error()) diff --git a/pkg/minikube/machine/delete.go b/pkg/minikube/machine/delete.go index 056e042fbe..a883f1028a 100644 --- a/pkg/minikube/machine/delete.go +++ b/pkg/minikube/machine/delete.go @@ -37,7 +37,7 @@ import ( // deleteOrphanedKIC attempts to delete an orphaned docker instance for machines without a config file // used as last effort clean up not returning errors, won't warn user. func deleteOrphanedKIC(ociBin string, name string) { - if !(ociBin == oci.Podman || ociBin == oci.Docker) { + if ociBin != oci.Podman && ociBin != oci.Docker { return } @@ -68,8 +68,8 @@ func DeleteHost(api libmachine.API, machineName string, deleteAbandoned ...bool) delAbandoned = deleteAbandoned[0] } - host, err := api.Load(machineName) - if err != nil && host == nil && delAbandoned { + hostInfo, err := api.Load(machineName) + if err != nil && hostInfo == nil && delAbandoned { deleteOrphanedKIC(oci.Docker, machineName) deleteOrphanedKIC(oci.Podman, machineName) // Keep going even if minikube does not know about the host @@ -88,7 +88,7 @@ func DeleteHost(api libmachine.API, machineName string, deleteAbandoned ...bool) } // some drivers need manual shut down before delete to avoid getting stuck. - if driver.NeedsShutdown(host.Driver.DriverName()) { + if driver.NeedsShutdown(hostInfo.Driver.DriverName()) { if err := StopHost(api, machineName); err != nil { klog.Warningf("stop host: %v", err) } @@ -96,8 +96,8 @@ func DeleteHost(api libmachine.API, machineName string, deleteAbandoned ...bool) time.Sleep(1 * time.Second) } - out.Step(style.DeletingHost, `Deleting "{{.profile_name}}" in {{.driver_name}} ...`, out.V{"profile_name": machineName, "driver_name": host.DriverName}) - return deleteHost(api, host, machineName) + out.Step(style.DeletingHost, `Deleting "{{.profile_name}}" in {{.driver_name}} ...`, out.V{"profile_name": machineName, "driver_name": hostInfo.DriverName}) + return deleteHost(api, hostInfo, machineName) } // delete removes a host and its local data files diff --git a/pkg/minikube/machine/fix.go b/pkg/minikube/machine/fix.go index 63faa5acb1..082e624d42 100644 --- a/pkg/minikube/machine/fix.go +++ b/pkg/minikube/machine/fix.go @@ -209,12 +209,12 @@ func ensureSyncedGuestClock(h hostRunner, drv string) error { // guestClockDelta returns the approximate difference between the host and guest system clock // NOTE: This does not currently take into account ssh latency. func guestClockDelta(h hostRunner, local time.Time) (time.Duration, error) { - out, err := h.RunSSHCommand("date +%s.%N") + rest, err := h.RunSSHCommand("date +%s.%N") if err != nil { return 0, errors.Wrap(err, "get clock") } - klog.Infof("guest clock: %s", out) - ns := strings.Split(strings.TrimSpace(out), ".") + klog.Infof("guest clock: %s", rest) + ns := strings.Split(strings.TrimSpace(rest), ".") secs, err := strconv.ParseInt(strings.TrimSpace(ns[0]), 10, 64) if err != nil { return 0, errors.Wrap(err, "atoi") @@ -232,8 +232,8 @@ func guestClockDelta(h hostRunner, local time.Time) (time.Duration, error) { // adjustGuestClock adjusts the guest system clock to be nearer to the host system clock func adjustGuestClock(h hostRunner, t time.Time) error { - out, err := h.RunSSHCommand(fmt.Sprintf("sudo date -s @%d", t.Unix())) - klog.Infof("clock set: %s (err=%v)", out, err) + rest, err := h.RunSSHCommand(fmt.Sprintf("sudo date -s @%d", t.Unix())) + klog.Infof("clock set: %s (err=%v)", rest, err) return err } @@ -253,10 +253,12 @@ func machineExistsMessage(s state.State, err error, msg string) (bool, error) { } func machineExistsDocker(s state.State, err error) (bool, error) { - if s == state.Error { + + switch s { + case state.Error: // if the kic image is not present on the host machine, when user cancel `minikube start`, state.Error will be return return false, constants.ErrMachineMissing - } else if s == state.None { + case state.None: // if the kic image is present on the host machine, when user cancel `minikube start`, state.None will be return return false, constants.ErrMachineMissing } diff --git a/pkg/minikube/machine/host.go b/pkg/minikube/machine/host.go index 02aff3bdbb..bf9c332510 100644 --- a/pkg/minikube/machine/host.go +++ b/pkg/minikube/machine/host.go @@ -35,12 +35,12 @@ func Status(api libmachine.API, machineName string) (string, error) { return state.None.String(), nil } - host, err := api.Load(machineName) + hostInfo, err := api.Load(machineName) if err != nil { return "", errors.Wrapf(err, "load") } - s, err := host.Driver.GetState() + s, err := hostInfo.Driver.GetState() if err != nil { return "", errors.Wrap(err, "state") } diff --git a/pkg/minikube/machine/info.go b/pkg/minikube/machine/info.go index 1e28b79984..968a1e1440 100644 --- a/pkg/minikube/machine/info.go +++ b/pkg/minikube/machine/info.go @@ -193,11 +193,11 @@ func cachedCPUInfo() ([]cpu.InfoStat, error) { } // ParseMemFree parses the output of the `free -m` command -func parseMemFree(out string) (int64, error) { +func parseMemFree(s string) (int64, error) { // total used free shared buff/cache available //Mem: 1987 706 194 1 1086 1173 //Swap: 0 0 0 - outlines := strings.Split(out, "\n") + outlines := strings.Split(s, "\n") l := len(outlines) for _, line := range outlines[1 : l-1] { parsedLine := strings.Fields(line) @@ -217,10 +217,10 @@ func parseMemFree(out string) (int64, error) { } // ParseDiskFree parses the output of the `df -m` command -func parseDiskFree(out string) (int64, error) { +func parseDiskFree(s string) (int64, error) { // Filesystem 1M-blocks Used Available Use% Mounted on // /dev/sda1 39643 3705 35922 10% / - outlines := strings.Split(out, "\n") + outlines := strings.Split(s, "\n") l := len(outlines) for _, line := range outlines[1 : l-1] { parsedLine := strings.Fields(line) diff --git a/pkg/minikube/machine/ssh.go b/pkg/minikube/machine/ssh.go index 4f37487bbe..a0206a5678 100644 --- a/pkg/minikube/machine/ssh.go +++ b/pkg/minikube/machine/ssh.go @@ -31,12 +31,12 @@ import ( // GetHost find node's host information by name in the given cluster. func GetHost(api libmachine.API, cc config.ClusterConfig, n config.Node) (*host.Host, error) { machineName := config.MachineName(cc, n) - host, err := LoadHost(api, machineName) + hostInfo, err := LoadHost(api, machineName) if err != nil { return nil, errors.Wrap(err, "host exists and load") } - currentState, err := host.Driver.GetState() + currentState, err := hostInfo.Driver.GetState() if err != nil { return nil, errors.Wrap(err, "state") } @@ -45,12 +45,12 @@ func GetHost(api libmachine.API, cc config.ClusterConfig, n config.Node) (*host. return nil, errors.Errorf("%q is not running", machineName) } - return host, nil + return hostInfo, nil } // CreateSSHShell creates a new SSH shell / client func CreateSSHShell(api libmachine.API, cc config.ClusterConfig, n config.Node, args []string, native bool) error { - host, err := GetHost(api, cc, n) + hostInfo, err := GetHost(api, cc, n) if err != nil { return err } @@ -61,7 +61,7 @@ func CreateSSHShell(api libmachine.API, cc config.ClusterConfig, n config.Node, ssh.SetDefaultClient(ssh.External) } - client, err := host.CreateSSHClient() + client, err := hostInfo.CreateSSHClient() if err != nil { return errors.Wrap(err, "Creating ssh client") @@ -71,16 +71,16 @@ func CreateSSHShell(api libmachine.API, cc config.ClusterConfig, n config.Node, // GetSSHHostAddrPort returns the host address and port for ssh func GetSSHHostAddrPort(api libmachine.API, cc config.ClusterConfig, n config.Node) (string, int, error) { - host, err := GetHost(api, cc, n) + hostInfo, err := GetHost(api, cc, n) if err != nil { return "", 0, err } - addr, err := host.Driver.GetSSHHostname() + addr, err := hostInfo.Driver.GetSSHHostname() if err != nil { return "", 0, err } - port, err := host.Driver.GetSSHPort() + port, err := hostInfo.Driver.GetSSHPort() if err != nil { return "", 0, err } diff --git a/pkg/minikube/machine/start.go b/pkg/minikube/machine/start.go index d71fa5e140..34a1f1b58c 100644 --- a/pkg/minikube/machine/start.go +++ b/pkg/minikube/machine/start.go @@ -412,7 +412,7 @@ func AddHostAlias(c command.Runner, name string, ip net.IP) error { return nil } -func addHostAliasCommand(name string, record string, sudo bool, path string) *exec.Cmd { +func addHostAliasCommand(name string, record string, sudo bool, destPath string) *exec.Cmd { sudoCmd := "sudo" if !sudo { // for testing sudoCmd = "" @@ -421,9 +421,9 @@ func addHostAliasCommand(name string, record string, sudo bool, path string) *ex script := fmt.Sprintf( `{ grep -v $'\t%s$' "%s"; echo "%s"; } > /tmp/h.$$; %s cp /tmp/h.$$ "%s"`, name, - path, + destPath, record, sudoCmd, - path) + destPath) return exec.Command("/bin/bash", "-c", script) } diff --git a/pkg/minikube/machine/stop.go b/pkg/minikube/machine/stop.go index 4397052c74..e6a83029b2 100644 --- a/pkg/minikube/machine/stop.go +++ b/pkg/minikube/machine/stop.go @@ -95,9 +95,9 @@ func trySSHPowerOff(h *host.Host) error { err := oci.ShutDown(h.DriverName, h.Name) klog.Infof("shutdown container: err=%v", err) } else { - out, err := h.RunSSHCommand("sudo poweroff") + rest, err := h.RunSSHCommand("sudo poweroff") // poweroff always results in an error, since the host disconnects. - klog.Infof("poweroff result: out=%s, err=%v", out, err) + klog.Infof("poweroff result: out=%s, err=%v", rest, err) } return nil } diff --git a/pkg/minikube/mustload/mustload.go b/pkg/minikube/mustload/mustload.go index 5090698d87..7d61b81e6d 100644 --- a/pkg/minikube/mustload/mustload.go +++ b/pkg/minikube/mustload/mustload.go @@ -132,7 +132,7 @@ func running(name string, first bool) []ClusterController { continue } - host, err := machine.LoadHost(api, machineName) + hostInfo, err := machine.LoadHost(api, machineName) if err != nil { if last { exit.Message(reason.GuestLoadHost, `Unable to load control-plane node {{.name}} host: {{.err}}`, out.V{"name": machineName, "err": err}) @@ -141,7 +141,7 @@ func running(name string, first bool) []ClusterController { continue } - cr, err := machine.CommandRunner(host) + cr, err := machine.CommandRunner(hostInfo) if err != nil { if last { exit.Message(reason.InternalCommandRunner, `Unable to get control-plane node {{.name}} host command runner: {{.err}}`, out.V{"name": machineName, "err": err}) @@ -150,7 +150,7 @@ func running(name string, first bool) []ClusterController { continue } - hostname, ip, port, err := driver.ControlPlaneEndpoint(cc, &cp, host.DriverName) + hostname, ip, port, err := driver.ControlPlaneEndpoint(cc, &cp, hostInfo.DriverName) if err != nil { if last { exit.Message(reason.DrvCPEndpoint, `Unable to get control-plane node {{.name}} endpoint: {{.err}}`, out.V{"name": machineName, "err": err}) @@ -164,7 +164,7 @@ func running(name string, first bool) []ClusterController { Config: cc, CP: ControlPlane{ Runner: cr, - Host: host, + Host: hostInfo, Node: &cp, Hostname: hostname, IP: ip, @@ -223,8 +223,8 @@ func Healthy(name string) ClusterController { // exitTip returns an action tip and exits func exitTip(action string, profile string, code int) { - command := ExampleCmd(profile, action) - out.Styled(style.Workaround, `To start a cluster, run: "{{.command}}"`, out.V{"command": command}) + cmd := ExampleCmd(profile, action) + out.Styled(style.Workaround, `To start a cluster, run: "{{.command}}"`, out.V{"command": cmd}) exit.Code(code) } diff --git a/pkg/minikube/node/cache.go b/pkg/minikube/node/cache.go index 4efb50efef..34871d12b9 100644 --- a/pkg/minikube/node/cache.go +++ b/pkg/minikube/node/cache.go @@ -282,12 +282,12 @@ func imagesInConfigFile() ([]string, error) { } func updateKicImageRepo(imgName string, repo string) string { - image := strings.TrimPrefix(imgName, "gcr.io/") + imageName := strings.TrimPrefix(imgName, "gcr.io/") if repo == constants.AliyunMirror { // 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/") + imageName = strings.TrimPrefix(imageName, "k8s-minikube/") } - return path.Join(repo, image) + return path.Join(repo, imageName) } diff --git a/pkg/minikube/node/start.go b/pkg/minikube/node/start.go index 5f1d4ce127..9b6418c66e 100755 --- a/pkg/minikube/node/start.go +++ b/pkg/minikube/node/start.go @@ -522,8 +522,8 @@ func cgroupDriver(cc config.ClusterConfig) string { return detect.CgroupDriver() } -func pathExists(runner cruntime.CommandRunner, path string) (bool, error) { - _, err := runner.RunCmd(exec.Command("stat", path)) +func pathExists(runner cruntime.CommandRunner, p string) (bool, error) { + _, err := runner.RunCmd(exec.Command("stat", p)) if err == nil { return true, nil } @@ -624,18 +624,18 @@ func setupKubeadm(mAPI libmachine.API, cfg config.ClusterConfig, n config.Node, // setupKubeconfig generates kubeconfig. func setupKubeconfig(h host.Host, cc config.ClusterConfig, n config.Node, clusterName string) *kubeconfig.Settings { - host := cc.KubernetesConfig.APIServerHAVIP + hostIP := cc.KubernetesConfig.APIServerHAVIP port := cc.APIServerPort if !config.IsHA(cc) || driver.NeedsPortForward(cc.Driver) { var err error - if host, _, port, err = driver.ControlPlaneEndpoint(&cc, &n, h.DriverName); err != nil { + if hostIP, _, port, err = driver.ControlPlaneEndpoint(&cc, &n, h.DriverName); err != nil { exit.Message(reason.DrvCPEndpoint, fmt.Sprintf("failed to construct cluster server address: %v", err), out.V{"profileArg": fmt.Sprintf("--profile=%s", clusterName)}) } } - addr := fmt.Sprintf("https://%s", net.JoinHostPort(host, strconv.Itoa(port))) + addr := fmt.Sprintf("https://%s", net.JoinHostPort(hostIP, strconv.Itoa(port))) if cc.KubernetesConfig.APIServerName != constants.APIServerName { - addr = strings.ReplaceAll(addr, host, cc.KubernetesConfig.APIServerName) + addr = strings.ReplaceAll(addr, hostIP, cc.KubernetesConfig.APIServerName) } kcs := &kubeconfig.Settings{ @@ -654,29 +654,29 @@ func setupKubeconfig(h host.Host, cc config.ClusterConfig, n config.Node, cluste } // StartMachine starts a VM -func startMachine(cfg *config.ClusterConfig, node *config.Node, delOnFail bool) (runner command.Runner, preExists bool, machineAPI libmachine.API, host *host.Host, err error) { +func startMachine(cfg *config.ClusterConfig, node *config.Node, delOnFail bool) (runner command.Runner, preExists bool, machineAPI libmachine.API, hostInfo *host.Host, err error) { m, err := machine.NewAPIClient() if err != nil { - return runner, preExists, m, host, errors.Wrap(err, "Failed to get machine client") + return runner, preExists, m, hostInfo, errors.Wrap(err, "Failed to get machine client") } - host, preExists, err = startHostInternal(m, cfg, node, delOnFail) + hostInfo, preExists, err = startHostInternal(m, cfg, node, delOnFail) if err != nil { - return runner, preExists, m, host, errors.Wrap(err, "Failed to start host") + return runner, preExists, m, hostInfo, errors.Wrap(err, "Failed to start host") } - runner, err = machine.CommandRunner(host) + runner, err = machine.CommandRunner(hostInfo) if err != nil { - return runner, preExists, m, host, errors.Wrap(err, "Failed to get command runner") + return runner, preExists, m, hostInfo, errors.Wrap(err, "Failed to get command runner") } - ip, err := validateNetwork(host, runner, cfg.KubernetesConfig.ImageRepository) + ip, err := validateNetwork(hostInfo, runner, cfg.KubernetesConfig.ImageRepository) if err != nil { - return runner, preExists, m, host, errors.Wrap(err, "Failed to validate network") + return runner, preExists, m, hostInfo, errors.Wrap(err, "Failed to validate network") } - if driver.IsQEMU(host.Driver.DriverName()) && network.IsBuiltinQEMU(cfg.Network) { + if driver.IsQEMU(hostInfo.Driver.DriverName()) && network.IsBuiltinQEMU(cfg.Network) { apiServerPort, err := getPort() if err != nil { - return runner, preExists, m, host, errors.Wrap(err, "Failed to find apiserver port") + return runner, preExists, m, hostInfo, errors.Wrap(err, "Failed to find apiserver port") } cfg.APIServerPort = apiServerPort } @@ -687,7 +687,7 @@ func startMachine(cfg *config.ClusterConfig, node *config.Node, delOnFail bool) out.FailureT("Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}`.", out.V{"ip": ip}) } - return runner, preExists, m, host, err + return runner, preExists, m, hostInfo, err } // getPort asks the kernel for a free open port that is ready to use @@ -707,9 +707,9 @@ func getPort() (int, error) { // startHostInternal starts a new minikube host using a VM or None func startHostInternal(api libmachine.API, cc *config.ClusterConfig, n *config.Node, delOnFail bool) (*host.Host, bool, error) { - host, exists, err := machine.StartHost(api, cc, n) + hostInfo, exists, err := machine.StartHost(api, cc, n) if err == nil { - return host, exists, nil + return hostInfo, exists, nil } klog.Warningf("error starting host: %v", err) // NOTE: People get very cranky if you delete their preexisting VM. Only delete new ones. @@ -722,7 +722,7 @@ func startHostInternal(api libmachine.API, cc *config.ClusterConfig, n *config.N if err, ff := errors.Cause(err).(*oci.FailFastError); ff { klog.Infof("will skip retrying to create machine because error is not retriable: %v", err) - return host, exists, err + return hostInfo, exists, err } out.ErrT(style.Embarrassed, "StartHost failed, but will try again: {{.error}}", out.V{"error": err}) @@ -739,15 +739,15 @@ func startHostInternal(api libmachine.API, cc *config.ClusterConfig, n *config.N } } - host, exists, err = machine.StartHost(api, cc, n) + hostInfo, exists, err = machine.StartHost(api, cc, n) if err == nil { - return host, exists, nil + return hostInfo, exists, nil } // Don't use host.Driver to avoid nil pointer deref drv := cc.Driver out.ErrT(style.Sad, `Failed to start {{.driver}} {{.driver_type}}. Running "{{.cmd}}" may fix it: {{.error}}`, out.V{"driver": drv, "driver_type": driver.MachineType(drv), "cmd": mustload.ExampleCmd(cc.Name, "delete"), "error": err}) - return host, exists, err + return hostInfo, exists, err } // validateNetwork tries to catch network problems as soon as possible @@ -760,7 +760,8 @@ func validateNetwork(h *host.Host, r command.Runner, imageRepository string) (st optSeen := false warnedOnce := false for _, k := range proxy.EnvVars { - if v := os.Getenv(k); v != "" { + v := os.Getenv(k) + if v != "" { if !optSeen { out.Styled(style.Internet, "Found network options:") optSeen = true @@ -847,9 +848,9 @@ func tryRegistry(r command.Runner, driverName, imageRepository, ip string) { // 2 second timeout. For best results, call tryRegistry in a non-blocking manner. opts := []string{"-sS", "-m", "2"} - proxy := os.Getenv("HTTPS_PROXY") - if proxy != "" && !strings.HasPrefix(proxy, "localhost") && !strings.HasPrefix(proxy, "127.0") { - opts = append([]string{"-x", proxy}, opts...) + httpsProxy := os.Getenv("HTTPS_PROXY") + if httpsProxy != "" && !strings.HasPrefix(httpsProxy, "localhost") && !strings.HasPrefix(httpsProxy, "127.0") { + opts = append([]string{"-x", httpsProxy}, opts...) } if imageRepository == "" { @@ -931,16 +932,16 @@ func addCoreDNSEntry(runner command.Runner, name, ip string, cc config.ClusterCo // get current coredns configmap via kubectl get := fmt.Sprintf("sudo %s --kubeconfig=%s -n kube-system get configmap coredns -o yaml", kubectl, kubecfg) - out, err := runner.RunCmd(exec.Command("/bin/bash", "-c", get)) + rest, err := runner.RunCmd(exec.Command("/bin/bash", "-c", get)) if err != nil { klog.Errorf("failed to get current CoreDNS ConfigMap: %v", err) return err } - cm := strings.TrimSpace(out.Stdout.String()) + cm := strings.TrimSpace(rest.Stdout.String()) // check if this specific host entry already exists in coredns configmap, so not to duplicate/override it - host := regexp.MustCompile(fmt.Sprintf(`(?smU)^ *hosts {.*%s.*}`, name)) - if host.MatchString(cm) { + hostInfo := regexp.MustCompile(fmt.Sprintf(`(?smU)^ *hosts {.*%s.*}`, name)) + if hostInfo.MatchString(cm) { klog.Infof("CoreDNS already contains %q host record, skipping...", name) return nil } @@ -956,8 +957,8 @@ func addCoreDNSEntry(runner command.Runner, name, ip string, cc config.ClusterCo } // check if logging is already enabled (via log plugin) in coredns configmap, so not to duplicate it - logs := regexp.MustCompile(`(?smU)^ *log *$`) - if !logs.MatchString(cm) { + regex := regexp.MustCompile(`(?smU)^ *log *$`) + if !regex.MatchString(cm) { // inject log plugin into coredns configmap sed = fmt.Sprintf("%s -e '/^ errors *$/i \\ log'", sed) } diff --git a/pkg/minikube/notify/notify.go b/pkg/minikube/notify/notify.go index f398a645ed..489137bbe0 100644 --- a/pkg/minikube/notify/notify.go +++ b/pkg/minikube/notify/notify.go @@ -96,21 +96,21 @@ func maybePrintBetaUpdateText(betaReleasesURL string, localVersion semver.Versio return true } -func printUpdateTextCommon(version semver.Version) { +func printUpdateTextCommon(ver semver.Version) { if err := writeTimeToFile(lastUpdateCheckFilePath, time.Now().UTC()); err != nil { klog.Errorf("write time failed: %v", err) } - url := "https://github.com/kubernetes/minikube/releases/tag/v" + version.String() - out.Styled(style.Celebrate, `minikube {{.version}} is available! Download it: {{.url}}`, out.V{"version": version, "url": url}) + url := "https://github.com/kubernetes/minikube/releases/tag/v" + ver.String() + out.Styled(style.Celebrate, `minikube {{.version}} is available! Download it: {{.url}}`, out.V{"version": ver, "url": url}) } -func printUpdateText(version semver.Version) { - printUpdateTextCommon(version) +func printUpdateText(ver semver.Version) { + printUpdateTextCommon(ver) out.Styled(style.Tip, "To disable this notice, run: 'minikube config set WantUpdateNotification false'\n") } -func printBetaUpdateText(version semver.Version) { - printUpdateTextCommon(version) +func printBetaUpdateText(ver semver.Version) { + printUpdateTextCommon(ver) out.Styled(style.Tip, "To disable beta notices, run: 'minikube config set WantBetaUpdateNotification false'") out.Styled(style.Tip, "To disable update notices in general, run: 'minikube config set WantUpdateNotification false'\n") } @@ -248,14 +248,14 @@ func timeFromFileIfExists(path string) time.Time { } // DownloadURL returns a URL to get minikube binary version ver for platform os/arch -func DownloadURL(ver, os, arch string) string { - if ver == "" || strings.HasSuffix(ver, "-unset") || os == "" || arch == "" { +func DownloadURL(ver, osName, arch string) string { + if ver == "" || strings.HasSuffix(ver, "-unset") || osName == "" || arch == "" { return "https://github.com/kubernetes/minikube/releases" } sfx := "" - if os == "windows" { + if osName == "windows" { sfx = ".exe" } return fmt.Sprintf("https://github.com/kubernetes/minikube/releases/download/%s/minikube-%s-%s%s", - ver, os, arch, sfx) + ver, osName, arch, sfx) } diff --git a/pkg/minikube/out/out.go b/pkg/minikube/out/out.go index 9c3dcae952..065abc7dc3 100644 --- a/pkg/minikube/out/out.go +++ b/pkg/minikube/out/out.go @@ -107,8 +107,8 @@ func Styled(st style.Enum, format string, a ...V) { Infof(format, a...) return } - outStyled, spinner := stylized(st, useColor, format, a...) - if spinner { + outStyled, useSpinner := stylized(st, useColor, format, a...) + if useSpinner { spinnerString(outStyled) } else { String(outStyled) @@ -116,12 +116,12 @@ func Styled(st style.Enum, format string, a ...V) { } func boxedCommon(printFunc func(format string, a ...interface{}), cfg box.Config, title string, format string, a ...V) { - box := box.New(cfg) + b := box.New(cfg) if !useColor { - box.Config.Color = nil + b.Config.Color = nil } str := Sprintf(style.None, format, a...) - printFunc(box.String(title, strings.TrimSpace(str))) + printFunc(b.String(title, strings.TrimSpace(str))) } // Boxed writes a stylized and templated message in a box to stdout using the default style config diff --git a/pkg/minikube/perf/logs.go b/pkg/minikube/perf/logs.go index a76fc44656..1ac440abc2 100644 --- a/pkg/minikube/perf/logs.go +++ b/pkg/minikube/perf/logs.go @@ -51,13 +51,13 @@ func timeCommandLogs(cmd *exec.Cmd) (*result, error) { var timings []float64 for scanner.Scan() { - log := scanner.Text() + logData := scanner.Text() // this is the time it took to complete the previous log timeTaken := time.Since(timer).Seconds() - klog.Infof("%f: %s", timeTaken, log) + klog.Infof("%f: %s", timeTaken, logData) timer = time.Now() - logs = append(logs, log) + logs = append(logs, logData) timings = append(timings, timeTaken) } // add the time it took to get from the final log to finishing the command diff --git a/pkg/minikube/perf/start.go b/pkg/minikube/perf/start.go index 9a942da8cd..4ba3f9ba6c 100644 --- a/pkg/minikube/perf/start.go +++ b/pkg/minikube/perf/start.go @@ -63,12 +63,12 @@ func CompareMinikubeStart(ctx context.Context, binaries []*Binary) error { return nil } -func collectResults(ctx context.Context, binaries []*Binary, driver string, runtime string) (*resultManager, error) { +func collectResults(ctx context.Context, binaries []*Binary, driver string, runtimeName string) (*resultManager, error) { rm := newResultManager() for run := 0; run < runs; run++ { log.Printf("Executing run %d/%d...", run+1, runs) for _, binary := range binaries { - r, err := timeMinikubeStart(ctx, binary, driver, runtime) + r, err := timeMinikubeStart(ctx, binary, driver, runtimeName) if err != nil { return nil, errors.Wrapf(err, "timing run %d with %s", run, binary.Name()) } @@ -97,9 +97,9 @@ func average(nums []float64) float64 { return total / float64(len(nums)) } -func downloadArtifacts(ctx context.Context, binaries []*Binary, driver string, runtime string) error { +func downloadArtifacts(ctx context.Context, binaries []*Binary, driver string, runtimeName string) error { for _, b := range binaries { - c := exec.CommandContext(ctx, b.path, "start", fmt.Sprintf("--driver=%s", driver), fmt.Sprintf("--container-runtime=%s", runtime)) + c := exec.CommandContext(ctx, b.path, "start", fmt.Sprintf("--driver=%s", driver), fmt.Sprintf("--container-runtime=%s", runtimeName)) c.Stderr = os.Stderr log.Printf("Running: %v...", c.Args) if err := c.Run(); err != nil { @@ -115,8 +115,8 @@ func downloadArtifacts(ctx context.Context, binaries []*Binary, driver string, r } // timeMinikubeStart returns the time it takes to execute `minikube start` -func timeMinikubeStart(ctx context.Context, binary *Binary, driver string, runtime string) (*result, error) { - startCmd := exec.CommandContext(ctx, binary.path, "start", fmt.Sprintf("--driver=%s", driver), fmt.Sprintf("--container-runtime=%s", runtime)) +func timeMinikubeStart(ctx context.Context, binary *Binary, driver string, runtimeName string) (*result, error) { + startCmd := exec.CommandContext(ctx, binary.path, "start", fmt.Sprintf("--driver=%s", driver), fmt.Sprintf("--container-runtime=%s", runtimeName)) startCmd.Stderr = os.Stderr r, err := timeCommandLogs(startCmd) @@ -147,6 +147,6 @@ func skipIngress(driver string) bool { // We only want to run the tests if: // 1. It's a VM driver and docker container runtime // 2. It's docker driver with any container runtime -func proceed(driver string, runtime string) bool { - return runtime == "docker" || driver == "docker" +func proceed(driver string, runtimeName string) bool { + return runtimeName == "docker" || driver == "docker" } diff --git a/pkg/minikube/service/service.go b/pkg/minikube/service/service.go index 87d89ad21e..188e8ef261 100644 --- a/pkg/minikube/service/service.go +++ b/pkg/minikube/service/service.go @@ -66,8 +66,8 @@ func init() { } // GetCoreClient returns a core client -func (k *K8sClientGetter) GetCoreClient(context string) (typed_core.CoreV1Interface, error) { - client, err := kapi.Client(context) +func (k *K8sClientGetter) GetCoreClient(ctx string) (typed_core.CoreV1Interface, error) { + client, err := kapi.Client(ctx) if err != nil { return nil, errors.Wrap(err, "client") } @@ -288,8 +288,8 @@ func WaitForService(api libmachine.API, cname string, namespace string, service } for _, bareURLString := range serviceURL.URLs { - url, _ := OptionallyHTTPSFormattedURLString(bareURLString, https) - urlList = append(urlList, url) + urlString, _ := OptionallyHTTPSFormattedURLString(bareURLString, https) + urlList = append(urlList, urlString) } return urlList, nil } @@ -314,7 +314,7 @@ func getServiceListFromServicesByLabel(services typed_core.ServiceInterface, key } // CreateSecret creates or modifies secrets -func CreateSecret(cname string, namespace, name string, dataValues map[string]string, labels map[string]string) error { +func CreateSecret(cname string, namespace, name string, dataValues map[string]string, labelData map[string]string) error { client, err := K8s.GetCoreClient(cname) if err != nil { return &retry.RetriableError{Err: err} @@ -344,7 +344,7 @@ func CreateSecret(cname string, namespace, name string, dataValues map[string]st secretObj := &core.Secret{ ObjectMeta: meta.ObjectMeta{ Name: name, - Labels: labels, + Labels: labelData, }, Data: data, Type: core.SecretTypeOpaque, diff --git a/pkg/minikube/shell/shell.go b/pkg/minikube/shell/shell.go index 0c9958e423..d3ff9957d7 100644 --- a/pkg/minikube/shell/shell.go +++ b/pkg/minikube/shell/shell.go @@ -165,11 +165,11 @@ func Detect() (string, error) { } func (c EnvConfig) getShell() shellData { - shell, ok := shellConfigMap[c.Shell] + shellData, ok := shellConfigMap[c.Shell] if !ok { - shell = defaultShell + shellData = defaultShell } - return shell + return shellData } func generateUsageHint(ec EnvConfig, usgPlz, usgCmd string) string { diff --git a/pkg/minikube/storageclass/storageclass.go b/pkg/minikube/storageclass/storageclass.go index e64b4af1ab..055933d3ae 100644 --- a/pkg/minikube/storageclass/storageclass.go +++ b/pkg/minikube/storageclass/storageclass.go @@ -71,8 +71,8 @@ func SetDefaultStorageClass(storage storagev1.StorageV1Interface, name string) e } // GetStoragev1 return storage v1 interface for client -func GetStoragev1(context string) (storagev1.StorageV1Interface, error) { - client, err := kapi.Client(context) +func GetStoragev1(ctx string) (storagev1.StorageV1Interface, error) { + client, err := kapi.Client(ctx) if err != nil { return nil, err } diff --git a/pkg/minikube/tests/api_mock.go b/pkg/minikube/tests/api_mock.go index 022d1103c5..4f553b027f 100644 --- a/pkg/minikube/tests/api_mock.go +++ b/pkg/minikube/tests/api_mock.go @@ -137,10 +137,10 @@ func (api *MockAPI) Remove(name string) error { } // Save saves a host to disk. -func (api *MockAPI) Save(host *host.Host) error { +func (api *MockAPI) Save(hostInfo *host.Host) error { api.SaveCalled = true - api.Logf("MockAPI.Save: %+v", host) - return api.FakeStore.Save(host) + api.Logf("MockAPI.Save: %+v", hostInfo) + return api.FakeStore.Save(hostInfo) } // GetMachinesDir returns the directory to store machines in. diff --git a/pkg/minikube/tunnel/cluster_inspector.go b/pkg/minikube/tunnel/cluster_inspector.go index 95aae6c459..658c60a92a 100644 --- a/pkg/minikube/tunnel/cluster_inspector.go +++ b/pkg/minikube/tunnel/cluster_inspector.go @@ -80,10 +80,10 @@ func (m *clusterInspector) getStateAndRoute() (HostState, *Route, error) { return hostState, route, nil } -func getRoute(host *host.Host, clusterConfig config.ClusterConfig) (*Route, error) { - hostDriverIP, err := host.Driver.GetIP() +func getRoute(hostInfo *host.Host, clusterConfig config.ClusterConfig) (*Route, error) { + hostDriverIP, err := hostInfo.Driver.GetIP() if err != nil { - return nil, errors.Wrapf(err, "error getting host IP for %s", host.Name) + return nil, errors.Wrapf(err, "error getting host IP for %s", hostInfo.Name) } _, ipNet, err := net.ParseCIDR(clusterConfig.KubernetesConfig.ServiceCIDR) diff --git a/pkg/minikube/tunnel/kic/service_tunnel.go b/pkg/minikube/tunnel/kic/service_tunnel.go index 264301f74c..aa8997d596 100644 --- a/pkg/minikube/tunnel/kic/service_tunnel.go +++ b/pkg/minikube/tunnel/kic/service_tunnel.go @@ -28,7 +28,8 @@ import ( "k8s.io/klog/v2" ) -// ServiceTunnel ... +// ServiceTunnel manages an SSH tunnel for a Kubernetes service. +// It holds configuration for the SSH connection and the tunnel's state. type ServiceTunnel struct { sshPort string sshKey string @@ -37,7 +38,11 @@ type ServiceTunnel struct { suppressStdOut bool } -// NewServiceTunnel ... +// NewServiceTunnel creates and returns a new ServiceTunnel instance. +// sshPort is the port number for the SSH connection. +// sshKey is the path to the SSH private key file. +// v1Core is the Kubernetes CoreV1 client interface for interacting with services. +// suppressStdOut controls whether standard output from the tunnel process should be suppressed. func NewServiceTunnel(sshPort, sshKey string, v1Core typed_core.CoreV1Interface, suppressStdOut bool) *ServiceTunnel { return &ServiceTunnel{ sshPort: sshPort, @@ -47,7 +52,12 @@ func NewServiceTunnel(sshPort, sshKey string, v1Core typed_core.CoreV1Interface, } } -// Start ... +// Start establishes an SSH tunnel for the specified Kubernetes service. +// It retrieves service details, creates an SSH connection with random local ports +// for each service port, and starts the tunnel in a new goroutine. +// It returns a slice of URLs (e.g., "http://127.0.0.1:local_port") corresponding +// to the tunnelled ports, or an error if the setup fails. +// Errors from the tunnel running in the background are logged via klog. func (t *ServiceTunnel) Start(svcName, namespace string) ([]string, error) { svc, err := t.v1Core.Services(namespace).Get(context.Background(), svcName, metav1.GetOptions{}) if err != nil { @@ -75,7 +85,8 @@ func (t *ServiceTunnel) Start(svcName, namespace string) ([]string, error) { return urls, nil } -// Stop ... +// Stop attempts to gracefully stop the active SSH tunnel. +// Any errors encountered during the stop process are logged as warnings. func (t *ServiceTunnel) Stop() { err := t.sshConn.stop() if err != nil { diff --git a/pkg/minikube/tunnel/kic/ssh_conn.go b/pkg/minikube/tunnel/kic/ssh_conn.go index ead2ec5768..7410019112 100644 --- a/pkg/minikube/tunnel/kic/ssh_conn.go +++ b/pkg/minikube/tunnel/kic/ssh_conn.go @@ -130,20 +130,20 @@ func createSSHConnWithRandomPorts(name, sshPort, sshKey string, svc *v1.Service) usedPorts := make([]int, 0, len(svc.Spec.Ports)) for _, port := range svc.Spec.Ports { - freeport, err := freeport.GetFreePort() + freePort, err := freeport.GetFreePort() if err != nil { return nil, err } arg := fmt.Sprintf( "-L %d:%s:%d", - freeport, + freePort, svc.Spec.ClusterIP, port.Port, ) sshArgs = append(sshArgs, arg) - usedPorts = append(usedPorts, freeport) + usedPorts = append(usedPorts, freePort) } cmd := exec.Command("ssh", sshArgs...) diff --git a/pkg/minikube/tunnel/kic/ssh_tunnel.go b/pkg/minikube/tunnel/kic/ssh_tunnel.go index 001639ef76..fcf795358d 100644 --- a/pkg/minikube/tunnel/kic/ssh_tunnel.go +++ b/pkg/minikube/tunnel/kic/ssh_tunnel.go @@ -32,7 +32,9 @@ import ( "k8s.io/minikube/pkg/minikube/tunnel" ) -// SSHTunnel ... +// SSHTunnel manages and reconciles SSH tunnels for Kubernetes Services +// (specifically type LoadBalancer) and Ingress resources. It periodically +// checks the cluster state and creates, maintains, or removes tunnels as needed. type SSHTunnel struct { ctx context.Context sshPort string @@ -45,7 +47,13 @@ type SSHTunnel struct { connsToStop map[string]*sshConn } -// NewSSHTunnel ... +// NewSSHTunnel creates and returns a new SSHTunnel instance. +// ctx is the context that controls the lifecycle of the tunnel manager. +// sshPort is the port number of the SSH server to connect to. +// sshKey is the path to the SSH private key file for authentication. +// bindAddress is the local address on which the tunnels will listen. +// v1Core is a Kubernetes CoreV1 client interface for interacting with Services. +// v1Networking is a Kubernetes NetworkingV1 client interface for interacting with Ingresses. func NewSSHTunnel(ctx context.Context, sshPort, sshKey, bindAddress string, v1Core typed_core.CoreV1Interface, v1Networking typed_networking.NetworkingV1Interface) *SSHTunnel { return &SSHTunnel{ ctx: ctx, @@ -60,7 +68,12 @@ func NewSSHTunnel(ctx context.Context, sshPort, sshKey, bindAddress string, v1Co } } -// Start ... +// Start begins the main reconciliation loop for the SSHTunnel. +// This loop periodically scans for Kubernetes Services (type LoadBalancer) +// and Ingresses, creating or tearing down SSH tunnels as necessary. +// This method blocks until the provided context (t.ctx) is canceled. +// It returns any error associated with context cancellation or initial setup. +// Runtime errors during the tunnel management loop are logged via klog. func (t *SSHTunnel) Start() error { for { select { diff --git a/pkg/minikube/tunnel/registry.go b/pkg/minikube/tunnel/registry.go index 374ab23124..b443df96a4 100644 --- a/pkg/minikube/tunnel/registry.go +++ b/pkg/minikube/tunnel/registry.go @@ -91,17 +91,18 @@ func (r *persistentRegistry) Register(tunnel *ID) (rerr error) { // tunnels simultaneously. It is possible that an old tunnel // from an old profile has duplicated route information so we // need to check both machine name and route information. - if tunnel.MachineName == t.MachineName && t.Route.Equal(tunnel.Route) { - isRunning, err := checkIfRunning(t.Pid) - if err != nil { - return fmt.Errorf("error checking whether conflicting tunnel (%v) is running: %s", t, err) - } - if isRunning { - return errorTunnelAlreadyExists(t) - } - tunnels[i] = tunnel - alreadyExists = true + if tunnel.MachineName != t.MachineName || !tunnel.Route.Equal(t.Route) { + continue + } + isRunning, err := checkIfRunning(t.Pid) + if err != nil { + return fmt.Errorf("error checking whether conflicting tunnel (%v) is running: %s", t, err) + } + if isRunning { + return errorTunnelAlreadyExists(t) } + tunnels[i] = tunnel + alreadyExists = true } if !alreadyExists { diff --git a/pkg/minikube/tunnel/reporter.go b/pkg/minikube/tunnel/reporter.go index 8535a7dcdf..e6502f929e 100644 --- a/pkg/minikube/tunnel/reporter.go +++ b/pkg/minikube/tunnel/reporter.go @@ -68,7 +68,7 @@ func (r *simpleReporter) Report(tunnelState *Status) { loadbalancer emulator: %s `, minikubeError, routerError, lbError) - _, err := r.out.Write([]byte(fmt.Sprintf( + _, err := fmt.Fprintf(r.out, `Status: machine: %s pid: %d @@ -80,7 +80,7 @@ func (r *simpleReporter) Report(tunnelState *Status) { tunnelState.TunnelID.Route, minikubeState, managedServices, - errors))) + errors) if err != nil { klog.Errorf("failed to report state %s", err) } diff --git a/pkg/minikube/tunnel/route.go b/pkg/minikube/tunnel/route.go index 68f4888770..dbd0bbaf66 100644 --- a/pkg/minikube/tunnel/route.go +++ b/pkg/minikube/tunnel/route.go @@ -105,7 +105,7 @@ func (t *routingTable) Equal(other *routingTable) bool { for i := range *t { routesEqual := (*t)[i].route.Equal((*other)[i].route) linesEqual := (*t)[i].line == ((*other)[i].line) - if !(routesEqual && linesEqual) { + if !routesEqual || !linesEqual { return false } } diff --git a/pkg/storage/storage_provisioner.go b/pkg/storage/storage_provisioner.go index 1a3f753e31..569f7bca19 100644 --- a/pkg/storage/storage_provisioner.go +++ b/pkg/storage/storage_provisioner.go @@ -57,14 +57,14 @@ var _ controller.Provisioner = &hostPathProvisioner{} // Provision creates a storage asset and returns a PV object representing it. func (p *hostPathProvisioner) Provision(_ context.Context, options controller.ProvisionOptions) (*core.PersistentVolume, controller.ProvisioningState, error) { - path := path.Join(p.pvDir, options.PVC.Namespace, options.PVC.Name) - klog.Infof("Provisioning volume %v to %s", options, path) - if err := os.MkdirAll(path, 0777); err != nil { + hostPath := path.Join(p.pvDir, options.PVC.Namespace, options.PVC.Name) + klog.Infof("Provisioning volume %v to %s", options, hostPath) + if err := os.MkdirAll(hostPath, 0777); err != nil { return nil, controller.ProvisioningFinished, err } // Explicitly chmod created dir, so we know mode is set to 0777 regardless of umask - if err := os.Chmod(path, 0777); err != nil { + if err := os.Chmod(hostPath, 0777); err != nil { return nil, controller.ProvisioningFinished, err } @@ -83,7 +83,7 @@ func (p *hostPathProvisioner) Provision(_ context.Context, options controller.Pr }, PersistentVolumeSource: core.PersistentVolumeSource{ HostPath: &core.HostPathVolumeSource{ - Path: path, + Path: hostPath, }, }, }, From c306a0fbd6532e69dd0349164fee80ec164d9294 Mon Sep 17 00:00:00 2001 From: Nir Soffer Date: Wed, 28 May 2025 00:06:31 +0300 Subject: [PATCH 05/60] docs: Fix instructions for building iso (#20830) Testing shows that we need changes changes: - x86_64 cpu - Ubuntu 22.04 - docker is required even if building without docker - python2 instead of python - genisoimage (for mkisofs) - Installing Go manually (Ubuntu 22.04 have only Go 1.18) - Target should be minikube-iso-aarch64 or minikube-iso-x86_64. Using arm64 and amd64 fails. I also cleaned up a little bit the formatting to make it easier to maintain (one package per line). Tested building: - minikube-iso-aarch64 - minikube-iso-x86_64 I did not test the built iso images. --- site/content/en/docs/contrib/building/iso.md | 52 ++++++++++++++++---- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/site/content/en/docs/contrib/building/iso.md b/site/content/en/docs/contrib/building/iso.md index 2af07c6eba..05d13d7d98 100644 --- a/site/content/en/docs/contrib/building/iso.md +++ b/site/content/en/docs/contrib/building/iso.md @@ -10,6 +10,9 @@ The minikube ISO is booted by each hypervisor to provide a stable minimal Linux ## Prerequisites +* Machine with x86\_64 CPU +* Ubuntu 22.04.5 LTS (Jammy Jellyfish) +* docker * A recent GNU Make distribution (>=4.0) * A recent Go distribution (>=1.22.0) * If you are on Windows or Mac, you'll need Docker to be installed. @@ -25,30 +28,59 @@ cd minikube ## Building ### Building in Docker -To build for x86 + +To build for x86: + ```shell $ make buildroot-image -$ make out/minikube-amd64.iso +$ make minikube-iso-x86_64 ``` -To build for ARM +To build for ARM: + ```shell $ make buildroot-image -$ make out/minikube-arm64.iso +$ make minikube-iso-aarch64 ``` -The build will occur inside a docker container. +The build will occur inside a docker container. The bootable ISO image will be available in `out/minikube-.iso`. -### Building on Baremetal -If you want to do this on baremetal, replace `make out/minikube-.iso` with `IN_DOCKER=1 make out/minikube-.iso`. +### Building without docker + +Install required tools: + +```shell +sudo apt-get install \ + automake \ + bc \ + build-essential \ + cpio \ + gcc-multilib \ + genisoimage \ + git \ + gnupg2 \ + libtool \ + locales \ + p7zip-full \ + python2 \ + unzip \ + wget \ +``` + +Install Go using these instructions: +https://go.dev/doc/install + +To build without docker run: -* Prerequisite build tools to install: ```shell -sudo apt-get install build-essential gnupg2 p7zip-full git wget cpio python \ - unzip bc gcc-multilib automake libtool locales +IN_DOCKER=1 make minikube-iso- ``` +> [!IMPORTANT] +> Some external projects will try to use docker even when building +> without docker. You must install docker on the build host. + ## Using a local ISO image ```shell From 0dfd71a6ad30c2cd413c0c3ceae5cf352c8089ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 May 2025 14:13:27 -0700 Subject: [PATCH 06/60] Build(deps): Bump k8s.io/component-base from 0.32.2 to 0.33.1 (#20846) Bumps [k8s.io/component-base](https://github.com/kubernetes/component-base) from 0.32.2 to 0.33.1. - [Commits](https://github.com/kubernetes/component-base/compare/v0.32.2...v0.33.1) --- updated-dependencies: - dependency-name: k8s.io/component-base dependency-version: 0.33.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 ++++------ go.sum | 17 +++++++++-------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index 58a07ae9f4..f235799809 100644 --- a/go.mod +++ b/go.mod @@ -83,7 +83,7 @@ require ( k8s.io/apimachinery v0.33.1 k8s.io/client-go v0.33.1 k8s.io/cluster-bootstrap v0.0.0 - k8s.io/component-base v0.32.2 + k8s.io/component-base v0.33.1 k8s.io/klog/v2 v2.130.1 k8s.io/kubectl v0.32.2 k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 @@ -171,7 +171,7 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/juju/errors v0.0.0-20220203013757-bd733f3c86b9 // indirect - github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/compress v1.18.0 // indirect github.com/lib/pq v1.10.9 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect @@ -201,9 +201,9 @@ require ( github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_golang v1.22.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/common v0.62.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/prometheus/prometheus v0.35.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect @@ -229,10 +229,8 @@ require ( go.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 // indirect go.opentelemetry.io/otel/metric v1.35.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.35.0 // indirect - go.opentelemetry.io/proto/otlp v1.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect golang.org/x/image v0.25.0 // indirect diff --git a/go.sum b/go.sum index 2859967c86..00450ef905 100644 --- a/go.sum +++ b/go.sum @@ -1582,8 +1582,8 @@ github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdY github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid v1.2.0 h1:NMpwD2G9JSFOE1/TJjGSo5zG7Yb2bTe7eq1jH+irmeE= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -1605,6 +1605,7 @@ github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= @@ -1884,8 +1885,8 @@ github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= +github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1906,8 +1907,8 @@ github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= github.com/prometheus/common/assets v0.1.0/go.mod h1:D17UVUE12bHbim7HzwUvtqm6gwBEaDQ0F+hIGbFbccI= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/exporter-toolkit v0.7.1/go.mod h1:ZUBIj498ePooX9t/2xtDjeQYwvRpiPP2lh5u4iblj2g= @@ -3179,8 +3180,8 @@ k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeY k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= -k8s.io/component-base v0.32.2 h1:1aUL5Vdmu7qNo4ZsE+569PV5zFatM9hl+lb3dEea2zU= -k8s.io/component-base v0.32.2/go.mod h1:PXJ61Vx9Lg+P5mS8TLd7bCIr+eMJRQTyXe8KvkrvJq0= +k8s.io/component-base v0.33.1 h1:EoJ0xA+wr77T+G8p6T3l4efT2oNwbqBVKR71E0tBIaI= +k8s.io/component-base v0.33.1/go.mod h1:guT/w/6piyPfTgq7gfvgetyXMIh10zuXA6cRRm3rDuY= k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= From 7138f2bc9160a1f9b5352473ef51bbe8739ded3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 May 2025 15:35:48 -0700 Subject: [PATCH 07/60] Build(deps): Bump google.golang.org/api from 0.233.0 to 0.234.0 (#20850) Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.233.0 to 0.234.0. - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.233.0...v0.234.0) --- updated-dependencies: - dependency-name: google.golang.org/api dependency-version: 0.234.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 16 ++++++++-------- go.sum | 32 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index f235799809..f78347f71d 100644 --- a/go.mod +++ b/go.mod @@ -77,7 +77,7 @@ require ( golang.org/x/term v0.32.0 golang.org/x/text v0.25.0 gonum.org/v1/plot v0.16.0 - google.golang.org/api v0.233.0 + google.golang.org/api v0.234.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.33.1 k8s.io/apimachinery v0.33.1 @@ -96,10 +96,10 @@ require ( cloud.google.com/go v0.121.0 // indirect cloud.google.com/go/auth v0.16.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect - cloud.google.com/go/compute/metadata v0.6.0 // indirect + cloud.google.com/go/compute/metadata v0.7.0 // indirect cloud.google.com/go/iam v1.5.2 // indirect - cloud.google.com/go/monitoring v1.24.0 // indirect - cloud.google.com/go/trace v1.11.3 // indirect + cloud.google.com/go/monitoring v1.24.2 // indirect + cloud.google.com/go/trace v1.11.6 // indirect codeberg.org/go-fonts/liberation v0.5.0 // indirect codeberg.org/go-latex/latex v0.1.0 // indirect codeberg.org/go-pdf/fpdf v0.10.0 // indirect @@ -157,7 +157,7 @@ require ( github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect - github.com/googleapis/gax-go/v2 v2.14.1 // indirect + github.com/googleapis/gax-go/v2 v2.14.2 // indirect github.com/gookit/color v1.5.2 // indirect github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -237,10 +237,10 @@ require ( golang.org/x/net v0.40.0 // indirect golang.org/x/time v0.11.0 // indirect golang.org/x/tools v0.29.0 // indirect - google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb // indirect + google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 // indirect - google.golang.org/grpc v1.72.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250512202823-5a2f75b736a9 // indirect + google.golang.org/grpc v1.72.1 // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index 00450ef905..9c464ceeda 100644 --- a/go.sum +++ b/go.sum @@ -187,8 +187,8 @@ cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZ cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= -cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= +cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= +cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= @@ -384,8 +384,8 @@ cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhI cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.24.0 h1:csSKiCJ+WVRgNkRzzz3BPoGjFhjPY23ZTcaenToJxMM= -cloud.google.com/go/monitoring v1.24.0/go.mod h1:Bd1PRK5bmQBQNnuGwHBfUamAV1ys9049oEPHnn4pcsc= +cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= +cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= @@ -570,8 +570,8 @@ cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/trace v1.11.3 h1:c+I4YFjxRQjvAhRmSsmjpASUKq88chOX854ied0K/pE= -cloud.google.com/go/trace v1.11.3/go.mod h1:pt7zCYiDSQjC9Y2oqCsh9jF4GStB/hmjrYLsxRR27q8= +cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= +cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= @@ -1398,8 +1398,8 @@ github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqE github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= -github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= +github.com/googleapis/gax-go/v2 v2.14.2 h1:eBLnkZ9635krYIPD+ag1USrOAI0Nr0QYF3+/3GqO0k0= +github.com/googleapis/gax-go/v2 v2.14.2/go.mod h1:ON64QhlJkhVtSqp4v1uaK92VyZ2gmvDQsweuyLV+8+w= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= @@ -2860,8 +2860,8 @@ google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/ google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.233.0 h1:iGZfjXAJiUFSSaekVB7LzXl6tRfEKhUN7FkZN++07tI= -google.golang.org/api v0.233.0/go.mod h1:TCIVLLlcwunlMpZIhIp7Ltk77W+vUSdUKAAIlbxY44c= +google.golang.org/api v0.234.0 h1:d3sAmYq3E9gdr2mpmiWGbm9pHsA/KJmyiLkwKfHBqU4= +google.golang.org/api v0.234.0/go.mod h1:QpeJkemzkFKe5VCE/PMv7GsUfn9ZF+u+q1Q7w6ckxTg= 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= @@ -3008,12 +3008,12 @@ google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb h1:ITgPrl429bc6+2ZraNSzMDk3I95nmQln2fuPstKwFDE= -google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE= +google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 h1:1tXaIXCracvtsRxSBsYDiSBN0cuJvM7QYW+MrpIRY78= +google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:49MsLSx0oWMOZqcpB3uL8ZOkAh1+TndpJ8ONoCBWiZk= google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 h1:vPV0tzlsK6EzEDHNNH5sa7Hs9bd7iXR7B1tSiPepkV0= google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:pKLAc5OolXC3ViWGI62vvC0n10CpwAtRcTNCFwTKBEw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 h1:IqsN8hx+lWLqlN+Sc3DoMy/watjofWiU8sRFgQ8fhKM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250512202823-5a2f75b736a9 h1:IkAfh6J/yllPtpYFU0zZN1hUPYdT0ogkBT/9hMxHjvg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250512202823-5a2f75b736a9/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= 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= @@ -3060,8 +3060,8 @@ google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= -google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA= +google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= 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 759214fd313ad31365a01156006dc21087182c4e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 May 2025 17:13:05 -0700 Subject: [PATCH 08/60] Build(deps): Bump go.opentelemetry.io/otel/trace from 1.35.0 to 1.36.0 (#20849) Bumps [go.opentelemetry.io/otel/trace](https://github.com/open-telemetry/opentelemetry-go) from 1.35.0 to 1.36.0. - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.35.0...v1.36.0) --- updated-dependencies: - dependency-name: go.opentelemetry.io/otel/trace dependency-version: 1.36.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index f78347f71d..d4d4bd6ac0 100644 --- a/go.mod +++ b/go.mod @@ -64,9 +64,9 @@ require ( github.com/spf13/viper v1.20.1 github.com/zchee/go-vmnet v0.0.0-20161021174912-97ebf9174097 go.opencensus.io v0.24.0 - go.opentelemetry.io/otel v1.35.0 + go.opentelemetry.io/otel v1.36.0 go.opentelemetry.io/otel/sdk v1.35.0 - go.opentelemetry.io/otel/trace v1.35.0 + go.opentelemetry.io/otel/trace v1.36.0 golang.org/x/build v0.0.0-20190927031335-2835ba2e683f golang.org/x/crypto v0.38.0 golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c @@ -229,7 +229,7 @@ require ( go.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect - go.opentelemetry.io/otel/metric v1.35.0 // indirect + go.opentelemetry.io/otel/metric v1.36.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.35.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect diff --git a/go.sum b/go.sum index 9c464ceeda..dfd537622c 100644 --- a/go.sum +++ b/go.sum @@ -2164,8 +2164,8 @@ go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzox go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= go.opentelemetry.io/otel v1.6.0/go.mod h1:bfJD2DZVw0LBxghOTlgnlI0CV3hLDu9XF/QKOUXMTQQ= go.opentelemetry.io/otel v1.6.1/go.mod h1:blzUabWHkX6LJewxvadmzafgh/wnvBSDBdOuwkAtrWQ= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= +go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= @@ -2184,8 +2184,8 @@ go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0 h1:PB3Zrjs1sG1GBX go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0/go.mod h1:U2R3XyVPzn0WX7wOIypPuptulsMcPDPs/oiSVOMVnHY= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= +go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= +go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= @@ -2200,8 +2200,8 @@ go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16g go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/otel/trace v1.6.0/go.mod h1:qs7BrU5cZ8dXQHBGxHMOxwME/27YH2qEp4/+tZLLwJE= go.opentelemetry.io/otel/trace v1.6.1/go.mod h1:RkFRM1m0puWIq10oxImnGEduNBzxiN7TXluRBtE+5j0= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= +go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= go.opentelemetry.io/proto/otlp v0.12.1/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= From 85a9ffb4ecca3fa4b7cfb9aa1a0921fb8b947e1b Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Wed, 28 May 2025 13:01:29 -0700 Subject: [PATCH 09/60] CI: Update gh from 2.72.0 to 2.73.0 (#20839) --- hack/jenkins/installers/check_install_gh.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/jenkins/installers/check_install_gh.sh b/hack/jenkins/installers/check_install_gh.sh index 8adb29c062..11281eec05 100755 --- a/hack/jenkins/installers/check_install_gh.sh +++ b/hack/jenkins/installers/check_install_gh.sh @@ -16,7 +16,7 @@ set -eux -o pipefail -GH_VERSION="2.72.0" +GH_VERSION="2.73.0" echo "Installing latest version of gh" curl -qLO "https://github.com/cli/cli/releases/download/v${GH_VERSION}/gh_${GH_VERSION}_linux_amd64.tar.gz" From a340e3e22aa32ec76bfc15cedea6a38455e790be Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Wed, 28 May 2025 13:03:56 -0700 Subject: [PATCH 10/60] Site: Update hugo from v0.147.2 to v0.147.5 (#20840) --- netlify.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netlify.toml b/netlify.toml index 90d21a0b8d..f0f9fe55f3 100644 --- a/netlify.toml +++ b/netlify.toml @@ -5,7 +5,7 @@ command = "pwd && cd themes/docsy && npm install && git submodule update -f --in [build.environment] NODE_VERSION = "20.19.2" -HUGO_VERSION = "v0.147.2" +HUGO_VERSION = "v0.147.5" [context.production.environment] HUGO_ENV = "production" From f439f0c3a4f5a34abc622bc5077aec790396ffe8 Mon Sep 17 00:00:00 2001 From: Medya Ghazizadeh Date: Thu, 29 May 2025 10:16:02 -0700 Subject: [PATCH 11/60] add short hand -m for --memory (#20854) * add short hand -m for --memory * hide deperecated flags --- cmd/minikube/cmd/start_flags.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/cmd/minikube/cmd/start_flags.go b/cmd/minikube/cmd/start_flags.go index cb4cfc4093..67b092891e 100644 --- a/cmd/minikube/cmd/start_flags.go +++ b/cmd/minikube/cmd/start_flags.go @@ -61,8 +61,8 @@ const ( hostOnlyCIDR = "host-only-cidr" containerRuntime = "container-runtime" criSocket = "cri-socket" - networkPlugin = "network-plugin" - enableDefaultCNI = "enable-default-cni" + networkPlugin = "network-plugin" // deprecated, use --cni instead + enableDefaultCNI = "enable-default-cni" // deprecated, use --cni=bridge instead cniFlag = "cni" hypervVirtualSwitch = "hyperv-virtual-switch" hypervUseExternalSwitch = "hyperv-use-external-switch" @@ -163,7 +163,7 @@ func initMinikubeFlags() { startCmd.Flags().Bool(dryRun, false, "dry-run mode. Validates configuration, but does not mutate system state") startCmd.Flags().String(cpus, "2", fmt.Sprintf("Number of CPUs allocated to Kubernetes. Use %q to use the maximum number of CPUs. Use %q to not specify a limit (Docker/Podman only)", constants.MaxResources, constants.NoLimit)) - startCmd.Flags().String(memory, "", fmt.Sprintf("Amount of RAM to allocate to Kubernetes (format: [], where unit = b, k, m or g). Use %q to use the maximum amount of memory. Use %q to not specify a limit (Docker/Podman only)", constants.MaxResources, constants.NoLimit)) + startCmd.Flags().StringP(memory, "m", "", fmt.Sprintf("Amount of RAM to allocate to Kubernetes (format: [], where unit = b, k, m or g). Use %q to use the maximum amount of memory. Use %q to not specify a limit (Docker/Podman only)", constants.MaxResources, constants.NoLimit)) startCmd.Flags().String(humanReadableDiskSize, defaultDiskSize, "Disk size allocated to the minikube VM (format: [], where unit = b, k, m or g).") startCmd.Flags().Bool(downloadOnly, false, "If true, only download and cache files for later use - don't install or start anything.") startCmd.Flags().Bool(cacheImages, true, "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none.") @@ -232,6 +232,20 @@ func initKubernetesFlags() { func initDriverFlags() { startCmd.Flags().StringP("driver", "d", "", fmt.Sprintf("Driver is one of: %v (defaults to auto-detect)", driver.DisplaySupportedDrivers())) startCmd.Flags().String("vm-driver", "", "DEPRECATED, use `driver` instead.") + // Hide the deprecated vm-driver flag from help text + if err := startCmd.Flags().MarkHidden("vm-driver"); err != nil { + klog.Warningf("Failed to hide vm-driver flag: %v\n", err) + } + // Hide the deprecated flag from help text so new users dont use it (still will be processed) + if err := startCmd.Flags().MarkHidden(enableDefaultCNI); err != nil { + klog.Warningf("Failed to hide %s flag: %v\n", enableDefaultCNI, err) + } + + // Hide the deprecated flag from help text so new users dont use it (still will be processed) + if err := startCmd.Flags().MarkHidden(networkPlugin); err != nil { + klog.Warningf("Failed to hide %s flag: %v\n", networkPlugin, err) + } + startCmd.Flags().Bool(disableDriverMounts, false, "Disables the filesystem mounts provided by the hypervisors") startCmd.Flags().Bool("vm", false, "Filter to use only VM Drivers") From 97cc0cab231cdafdc35aee41aa655891f5d43f11 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Thu, 29 May 2025 18:21:47 -0700 Subject: [PATCH 12/60] Update auto-generated docs and translations (#20861) --- site/content/en/docs/commands/start.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/site/content/en/docs/commands/start.md b/site/content/en/docs/commands/start.md index 02a9215d42..7f2ac9971d 100644 --- a/site/content/en/docs/commands/start.md +++ b/site/content/en/docs/commands/start.md @@ -48,7 +48,6 @@ minikube start [flags] -d, --driver string Used to specify the driver to run Kubernetes in. The list of available drivers depends on operating system. --dry-run dry-run mode. Validates configuration, but does not mutate system state --embed-certs if true, will embed the certs in kubeconfig. - --enable-default-cni DEPRECATED: Replaced by --cni=bridge --extra-config ExtraOption A set of key=value pairs that describe configuration that may be passed to different components. 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 @@ -81,7 +80,7 @@ minikube start [flags] --kvm-numa-count int Simulate numa node count in minikube, supported numa node count range is 1-8 (kvm2 driver only) (default 1) --kvm-qemu-uri string The KVM QEMU connection URI. (kvm2 driver only) (default "qemu:///system") --listen-address string IP Address to use to expose ports (docker and podman driver only) - --memory string Amount of RAM to allocate to Kubernetes (format: [], where unit = b, k, m or g). Use "max" to use the maximum amount of memory. Use "no-limit" to not specify a limit (Docker/Podman only) + -m, --memory string Amount of RAM to allocate to Kubernetes (format: [], where unit = b, k, m or g). Use "max" to use the maximum amount of memory. Use "no-limit" to not specify a limit (Docker/Podman only) --mount This will start the mount daemon and automatically mount files into minikube. --mount-9p-version string Specify the 9p version that the mount should use (default "9p2000.L") --mount-gid string Default group id used for the mount (default "docker") @@ -96,7 +95,6 @@ minikube start [flags] --nat-nic-type string NIC Type used for nat network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only) (default "virtio") --native-ssh Use native Golang SSH client (default true). Set to 'false' to use the command line 'ssh' command when accessing the docker machine. Useful for the machine drivers when they will not start with 'Waiting for SSH'. (default true) --network string network to run minikube with. Used by docker/podman, qemu, kvm, and vfkit drivers. If left empty, minikube will create a new network. - --network-plugin string DEPRECATED: Replaced by --cni --nfs-share strings Local folders to share with Guest via NFS mounts (hyperkit driver only) --nfs-shares-root string Where to root the NFS Shares, defaults to /nfsshares (hyperkit driver only) (default "/nfsshares") --no-kubernetes If set, minikube VM/container will start without starting or configuring Kubernetes. (only works on new clusters) @@ -119,7 +117,6 @@ minikube start [flags] --trace string Send trace events. Options include: [gcp] --uuid string Provide VM UUID to restore MAC address (hyperkit driver only) --vm Filter to use only VM Drivers - --vm-driver driver DEPRECATED, use driver instead. --wait strings comma separated list of Kubernetes components to verify and wait for after starting a cluster. defaults to "apiserver,system_pods", available options: "apiserver,system_pods,default_sa,apps_running,node_ready,kubelet,extra" . other acceptable values are 'all' or 'none', 'true' and 'false' (default [apiserver,system_pods]) --wait-timeout duration max time to wait per Kubernetes or host to be healthy. (default 6m0s) ``` From 64552bad4ca849c766fa01849e11bd745f449c28 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 2 Jun 2025 14:23:04 -0700 Subject: [PATCH 13/60] site: Update docsy version to v0.12.0 (#20875) --- site/themes/docsy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/themes/docsy b/site/themes/docsy index cf0c68f041..ace4e37cee 160000 --- a/site/themes/docsy +++ b/site/themes/docsy @@ -1 +1 @@ -Subproject commit cf0c68f041daac066a0292d521461dbd092d7c31 +Subproject commit ace4e37ceedcec9c48d329adb1128201061ef23d From 5d2e31172a537ad6ade2cf2d132beec0aedc2c7a Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 2 Jun 2025 14:31:47 -0700 Subject: [PATCH 14/60] Addon Volcano: Update volcano images from v1.11.2 to v1.12.1 (#20868) --- .../volcano/volcano-development.yaml.tmpl | 508 ++++++++++++++---- pkg/minikube/assets/addons.go | 6 +- 2 files changed, 420 insertions(+), 94 deletions(-) diff --git a/deploy/addons/volcano/volcano-development.yaml.tmpl b/deploy/addons/volcano/volcano-development.yaml.tmpl index e6889550db..ce450f4241 100644 --- a/deploy/addons/volcano/volcano-development.yaml.tmpl +++ b/deploy/addons/volcano/volcano-development.yaml.tmpl @@ -140,7 +140,7 @@ spec: priorityClassName: system-cluster-critical containers: - args: - - --enabled-admission=/jobs/mutate,/jobs/validate,/podgroups/mutate,/pods/validate,/pods/mutate,/queues/mutate,/queues/validate + - --enabled-admission=/jobs/mutate,/jobs/validate,/podgroups/validate,/queues/mutate,/queues/validate,/hypernodes/validate - --tls-cert-file=/admission.local.config/certificates/tls.crt - --tls-private-key-file=/admission.local.config/certificates/tls.key - --ca-cert-file=/admission.local.config/certificates/ca.crt @@ -269,7 +269,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.4 + controller-gen.kubebuilder.io/version: v0.17.0 name: jobs.batch.volcano.sh spec: group: batch.volcano.sh @@ -323,6 +323,18 @@ spec: format: int32 minimum: 1 type: integer + networkTopology: + properties: + highestTierAllowed: + default: 1 + type: integer + mode: + default: hard + enum: + - hard + - soft + type: string + type: object plugins: additionalProperties: items: @@ -3083,6 +3095,39 @@ spec: x-kubernetes-list-map-keys: - name x-kubernetes-list-type: map + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object restartPolicy: type: string runtimeClassName: @@ -3125,6 +3170,8 @@ spec: runAsUser: format: int64 type: integer + seLinuxChangePolicy: + type: string seLinuxOptions: properties: level: @@ -4264,7 +4311,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.4 + controller-gen.kubebuilder.io/version: v0.17.0 name: commands.bus.volcano.sh spec: group: bus.volcano.sh @@ -4361,6 +4408,15 @@ metadata: namespace: volcano-system --- # Source: volcano/templates/controllers.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: volcano-controller-configmap + namespace: volcano-system +data: + volcano-controller.conf: | +--- +# Source: volcano/templates/controllers.yaml kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: @@ -4415,10 +4471,10 @@ rules: resources: ["networkpolicies"] verbs: ["get", "create", "delete"] - apiGroups: ["apps"] - resources: ["daemonsets", "statefulsets"] + resources: ["daemonsets"] verbs: ["get"] - apiGroups: ["apps"] - resources: ["replicasets"] + resources: ["replicasets", "statefulsets"] verbs: ["get", "list", "watch"] - apiGroups: ["batch"] resources: ["jobs"] @@ -4426,6 +4482,9 @@ rules: - apiGroups: ["coordination.k8s.io"] resources: ["leases"] verbs: ["get", "create", "update", "watch"] + - apiGroups: ["topology.volcano.sh"] + resources: ["hypernodes", "hypernodes/status"] + verbs: ["list", "watch", "get", "create", "delete", "update", "patch"] --- # Source: volcano/templates/controllers.yaml kind: ClusterRoleBinding @@ -4513,6 +4572,11 @@ spec: - ALL runAsNonRoot: true runAsUser: 1000 + env: + - name: KUBE_POD_NAMESPACE + value: volcano-system + - name: HELM_RELEASE_NAME + value: volcano --- # Source: volcano/templates/scheduler.yaml apiVersion: v1 @@ -4601,13 +4665,16 @@ rules: verbs: ["get", "list", "watch", "create", "delete", "update"] - apiGroups: ["scheduling.incubator.k8s.io", "scheduling.volcano.sh"] resources: ["queues/status"] - verbs: ["patch"] + verbs: ["update"] - apiGroups: ["scheduling.incubator.k8s.io", "scheduling.volcano.sh"] resources: ["podgroups"] verbs: ["list", "watch", "update"] - apiGroups: ["nodeinfo.volcano.sh"] resources: ["numatopologies"] verbs: ["get", "list", "watch", "delete"] + - apiGroups: ["topology.volcano.sh"] + resources: ["hypernodes", "hypernodes/status"] + verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["configmaps"] verbs: ["get", "create", "delete", "update"] @@ -4617,6 +4684,15 @@ rules: - apiGroups: ["coordination.k8s.io"] resources: ["leases"] verbs: ["get", "create", "update", "watch"] + - apiGroups: ["resource.k8s.io"] + resources: ["resourceclaims"] + verbs: ["get", "list", "watch", "create", "update", "patch"] + - apiGroups: ["resource.k8s.io"] + resources: ["resourceclaims/status"] + verbs: ["update"] + - apiGroups: ["resource.k8s.io"] + resources: ["deviceclasses","resourceslices"] + verbs: ["get", "list", "watch", "create"] --- # Source: volcano/templates/scheduler.yaml kind: ClusterRoleBinding @@ -4717,15 +4793,14 @@ spec: configMap: name: volcano-scheduler-configmap - name: klog-sock - hostPath: - path: /tmp/klog-socks + emptyDir: {} --- # Source: volcano/templates/scheduling_v1beta1_podgroup.yaml apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.4 + controller-gen.kubebuilder.io/version: v0.17.0 name: podgroups.scheduling.volcano.sh spec: group: scheduling.volcano.sh @@ -4811,6 +4886,24 @@ spec: if there's not enough resources to start each task, the scheduler will not start anyone. type: object + networkTopology: + description: NetworkTopology defines the NetworkTopology config, this + field works in conjunction with network topology feature and hyperNode + CRD. + properties: + highestTierAllowed: + default: 1 + description: HighestTierAllowed specifies the highest tier that + a job allowed to cross when scheduling. + type: integer + mode: + default: hard + description: Mode specifies the mode of the network topology constrain. + enum: + - hard + - soft + type: string + type: object priorityClassName: description: |- If specified, indicates the PodGroup's priority. "system-node-critical" and @@ -4821,6 +4914,7 @@ spec: default. type: string queue: + default: default description: |- Queue defines the queue to allocate resource for PodGroup; if queue does not exist, the PodGroup will not be scheduled. Defaults to `default` Queue with the lowest weight. @@ -4887,7 +4981,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.4 + controller-gen.kubebuilder.io/version: v0.17.0 name: queues.scheduling.volcano.sh spec: group: scheduling.volcano.sh @@ -4901,7 +4995,11 @@ spec: singular: queue scope: Cluster versions: - - name: v1beta1 + - additionalPrinterColumns: + - jsonPath: .spec.parent + name: PARENT + type: string + name: v1beta1 schema: openAPIV3Schema: description: Queue is a queue of PodGroup. @@ -5033,7 +5131,10 @@ spec: description: Type define the type of queue type: string weight: + default: 1 format: int32 + maximum: 65535 + minimum: 1 type: integer type: object status: @@ -5103,7 +5204,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.4 + controller-gen.kubebuilder.io/version: v0.17.0 name: numatopologies.nodeinfo.volcano.sh spec: group: nodeinfo.volcano.sh @@ -5190,44 +5291,231 @@ spec: served: true storage: true --- -# Source: volcano/templates/webhooks.yaml -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration +# Source: volcano/templates/topology_v1alpha1_hypernodes.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition metadata: - name: volcano-admission-service-pods-mutate -webhooks: - - admissionReviewVersions: - - v1 - clientConfig: - service: - name: volcano-admission-service - namespace: volcano-system - path: /pods/mutate - port: 443 - failurePolicy: Fail - matchPolicy: Equivalent - name: mutatepod.volcano.sh - namespaceSelector: - matchExpressions: - - key: kubernetes.io/metadata.name - operator: NotIn - values: - - volcano-system - - kube-system - objectSelector: {} - reinvocationPolicy: Never - rules: - - apiGroups: - - "" - apiVersions: - - v1 - operations: - - CREATE - resources: - - pods - scope: '*' - sideEffects: NoneOnDryRun - timeoutSeconds: 10 + annotations: + controller-gen.kubebuilder.io/version: v0.17.0 + name: hypernodes.topology.volcano.sh +spec: + group: topology.volcano.sh + names: + kind: HyperNode + listKind: HyperNodeList + plural: hypernodes + shortNames: + - hn + singular: hypernode + scope: Cluster + versions: + - additionalPrinterColumns: + - jsonPath: .spec.tier + name: Tier + type: string + - jsonPath: .status.nodeCount + name: NodeCount + type: integer + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: HyperNode represents a collection of nodes sharing similar network + topology or performance characteristics. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: Spec defines the desired configuration of the HyperNode. + properties: + members: + description: Members defines a list of node groups or individual nodes + included in the HyperNode. + items: + description: MemberSpec represents a specific node or a hyperNodes + in the hyperNode. + properties: + selector: + description: Selector defines the selection rules for this member. + properties: + exactMatch: + description: ExactMatch defines the exact match criteria. + properties: + name: + description: Name specifies the exact name of the node + to match. + type: string + type: object + labelMatch: + description: LabelMatch defines the labels match criteria + (only take effect when Member Type is "Node"). + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + regexMatch: + description: RegexMatch defines the regex match criteria. + properties: + pattern: + description: Pattern defines the regex pattern to match + node names. + type: string + type: object + type: object + x-kubernetes-validations: + - message: Either ExactMatch or RegexMatch or LabelMatch must + be specified + rule: has(self.exactMatch) || has(self.regexMatch) || has(self.labelMatch) + - message: Only one of ExactMatch, RegexMatch, or LabelMatch + can be specified + rule: '(has(self.exactMatch) ? 1 : 0) + (has(self.regexMatch) + ? 1 : 0) + (has(self.labelMatch) ? 1 : 0) <= 1' + type: + description: Type specifies the member type. + enum: + - Node + - HyperNode + type: string + required: + - type + type: object + type: array + tier: + description: Tier categorizes the performance level of the HyperNode. + type: integer + required: + - tier + type: object + status: + description: Status provides the current state of the HyperNode. + properties: + conditions: + description: Conditions provide details about the current state of + the HyperNode. + items: + description: Condition contains details for one aspect of the current + state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + nodeCount: + description: NodeCount is the total number of nodes currently in the + HyperNode. + format: int64 + minimum: 0 + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} --- # Source: volcano/templates/webhooks.yaml apiVersion: admissionregistration.k8s.io/v1 @@ -5272,7 +5560,7 @@ webhooks: apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: - name: volcano-admission-service-podgroups-mutate + name: volcano-admission-service-jobs-mutate webhooks: - admissionReviewVersions: - v1 @@ -5280,11 +5568,11 @@ webhooks: service: name: volcano-admission-service namespace: volcano-system - path: /podgroups/mutate + path: /jobs/mutate port: 443 failurePolicy: Fail matchPolicy: Equivalent - name: mutatepodgroup.volcano.sh + name: mutatejob.volcano.sh namespaceSelector: matchExpressions: - key: kubernetes.io/metadata.name @@ -5296,22 +5584,22 @@ webhooks: reinvocationPolicy: Never rules: - apiGroups: - - scheduling.volcano.sh + - batch.volcano.sh apiVersions: - - v1beta1 + - v1alpha1 operations: - CREATE resources: - - podgroups + - jobs scope: '*' sideEffects: NoneOnDryRun timeoutSeconds: 10 --- # Source: volcano/templates/webhooks.yaml apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration +kind: ValidatingWebhookConfiguration metadata: - name: volcano-admission-service-jobs-mutate + name: volcano-admission-service-jobs-validate webhooks: - admissionReviewVersions: - v1 @@ -5319,11 +5607,11 @@ webhooks: service: name: volcano-admission-service namespace: volcano-system - path: /jobs/mutate + path: /jobs/validate port: 443 failurePolicy: Fail matchPolicy: Equivalent - name: mutatejob.volcano.sh + name: validatejob.volcano.sh namespaceSelector: matchExpressions: - key: kubernetes.io/metadata.name @@ -5332,7 +5620,6 @@ webhooks: - volcano-system - kube-system objectSelector: {} - reinvocationPolicy: Never rules: - apiGroups: - batch.volcano.sh @@ -5340,6 +5627,7 @@ webhooks: - v1alpha1 operations: - CREATE + - UPDATE resources: - jobs scope: '*' @@ -5350,7 +5638,7 @@ webhooks: apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: - name: volcano-admission-service-jobs-validate + name: volcano-admission-service-queues-validate webhooks: - admissionReviewVersions: - v1 @@ -5358,11 +5646,11 @@ webhooks: service: name: volcano-admission-service namespace: volcano-system - path: /jobs/validate + path: /queues/validate port: 443 failurePolicy: Fail matchPolicy: Equivalent - name: validatejob.volcano.sh + name: validatequeue.volcano.sh namespaceSelector: matchExpressions: - key: kubernetes.io/metadata.name @@ -5373,14 +5661,15 @@ webhooks: objectSelector: {} rules: - apiGroups: - - batch.volcano.sh + - scheduling.volcano.sh apiVersions: - - v1alpha1 + - v1beta1 operations: - CREATE - UPDATE + - DELETE resources: - - jobs + - queues scope: '*' sideEffects: NoneOnDryRun timeoutSeconds: 10 @@ -5389,7 +5678,7 @@ webhooks: apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: - name: volcano-admission-service-pods-validate + name: volcano-admission-service-podgroups-validate webhooks: - admissionReviewVersions: - v1 @@ -5397,11 +5686,11 @@ webhooks: service: name: volcano-admission-service namespace: volcano-system - path: /pods/validate + path: /podgroups/validate port: 443 failurePolicy: Fail matchPolicy: Equivalent - name: validatepod.volcano.sh + name: validatepodgroup.volcano.sh namespaceSelector: matchExpressions: - key: kubernetes.io/metadata.name @@ -5412,13 +5701,13 @@ webhooks: objectSelector: {} rules: - apiGroups: - - "" + - scheduling.volcano.sh apiVersions: - - v1 + - v1beta1 operations: - CREATE resources: - - pods + - podgroups scope: '*' sideEffects: NoneOnDryRun timeoutSeconds: 10 @@ -5427,7 +5716,7 @@ webhooks: apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: - name: volcano-admission-service-queues-validate + name: volcano-admission-service-hypernodes-validate webhooks: - admissionReviewVersions: - v1 @@ -5435,32 +5724,22 @@ webhooks: service: name: volcano-admission-service namespace: volcano-system - path: /queues/validate + path: /hypernodes/validate port: 443 failurePolicy: Fail matchPolicy: Equivalent - name: validatequeue.volcano.sh - namespaceSelector: - matchExpressions: - - key: kubernetes.io/metadata.name - operator: NotIn - values: - - volcano-system - - kube-system - objectSelector: {} + name: validatehypernodes.volcano.sh rules: - apiGroups: - - scheduling.volcano.sh + - topology.volcano.sh apiVersions: - - v1beta1 + - v1alpha1 operations: - CREATE - UPDATE - - DELETE resources: - - queues - scope: '*' - sideEffects: NoneOnDryRun + - hypernodes + sideEffects: None timeoutSeconds: 10 --- # Source: jobflow/templates/flow_v1alpha1_jobflows.yaml @@ -5468,7 +5747,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.4 + controller-gen.kubebuilder.io/version: v0.17.0 name: jobtemplates.flow.volcano.sh spec: group: flow.volcano.sh @@ -5504,6 +5783,18 @@ spec: format: int32 minimum: 1 type: integer + networkTopology: + properties: + highestTierAllowed: + default: 1 + type: integer + mode: + default: hard + enum: + - hard + - soft + type: string + type: object plugins: additionalProperties: items: @@ -8264,6 +8555,39 @@ spec: x-kubernetes-list-map-keys: - name x-kubernetes-list-type: map + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object restartPolicy: type: string runtimeClassName: @@ -8306,6 +8630,8 @@ spec: runAsUser: format: int64 type: integer + seLinuxChangePolicy: + type: string seLinuxOptions: properties: level: @@ -9382,7 +9708,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.4 + controller-gen.kubebuilder.io/version: v0.17.0 name: jobflows.flow.volcano.sh spec: group: flow.volcano.sh diff --git a/pkg/minikube/assets/addons.go b/pkg/minikube/assets/addons.go index 54400b4d71..ab49f26874 100644 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -610,9 +610,9 @@ var Addons = map[string]*Addon{ "volcano-deployment.yaml", "0640"), }, false, "volcano", "third-party (volcano)", "hwdef", "", map[string]string{ - "vc_webhook_manager": "volcanosh/vc-webhook-manager:v1.11.2@sha256:e3dd5fc9c8af79bfa2182ccd4f48ba0a87c2047d3bdd59dd415288bf19c80ddc", - "vc_controller_manager": "volcanosh/vc-controller-manager:v1.11.2@sha256:ef164e8b3061838a315442ad9ffeb9699a636a73123c5269665fd7aeab06757c", - "vc_scheduler": "volcanosh/vc-scheduler:v1.11.2@sha256:5b77f6b38127db41afe4a38bbf585fa2ea5555998459d34f4f1691233f506121", + "vc_webhook_manager": "volcanosh/vc-webhook-manager:v1.12.1@sha256:f8b50088a7329220cbdcc624067943a76a005bb18bda77647e618aab26cf759d", + "vc_controller_manager": "volcanosh/vc-controller-manager:v1.12.1@sha256:3815883c32f62c3a60b8208ba834f304d91d8f05cddfabd440aa15f7f8bef296", + "vc_scheduler": "volcanosh/vc-scheduler:v1.12.1@sha256:b24ea8af2d167a3525e8fc603b32eca6c9b46ef509fa7e87f09e1fadb992faf2", }, map[string]string{ "vc_webhook_manager": "docker.io", "vc_controller_manager": "docker.io", From 0e12a7d541b968db36cfb1c1fff6cc80923564f6 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 2 Jun 2025 14:32:24 -0700 Subject: [PATCH 15/60] Update yearly leaderboard (#20864) --- .../en/docs/contrib/leaderboard/2025.html | 104 +++++++++--------- 1 file changed, 55 insertions(+), 49 deletions(-) diff --git a/site/content/en/docs/contrib/leaderboard/2025.html b/site/content/en/docs/contrib/leaderboard/2025.html index 73c283911f..3c3d2276f1 100644 --- a/site/content/en/docs/contrib/leaderboard/2025.html +++ b/site/content/en/docs/contrib/leaderboard/2025.html @@ -87,7 +87,7 @@

kubernetes/minikube

-
2025-01-01 — 2025-04-30
+
2025-01-01 — 2025-05-31

Reviewers

@@ -103,9 +103,11 @@

Most Influential

function drawreviewCounts() { var data = new google.visualization.arrayToDataTable([ [{label:'',type:'string'},{label: '# of Merged PRs reviewed', type: 'number'}, { role: 'annotation' }], - ["medyagh", 13, "13"], - ["cfergeau", 1, "1"], - ["nirs", 1, "1"], + ["medyagh", 24, "24"], + ["nirs", 4, "4"], + ["prezha", 3, "3"], + ["cfergeau", 2, "2"], + ["afbjorklund", 1, "1"], ]); @@ -138,9 +140,11 @@

Most Helpful

function drawreviewWords() { var data = new google.visualization.arrayToDataTable([ [{label:'',type:'string'},{label: '# of words written in merged PRs', type: 'number'}, { role: 'annotation' }], - ["medyagh", 369, "369"], - ["nirs", 62, "62"], - ["cfergeau", 10, "10"], + ["medyagh", 857, "857"], + ["nirs", 615, "615"], + ["prezha", 523, "523"], + ["cfergeau", 228, "228"], + ["afbjorklund", 98, "98"], ]); @@ -173,9 +177,11 @@

Most Demanding

function drawreviewComments() { var data = new google.visualization.arrayToDataTable([ [{label:'',type:'string'},{label: '# of Review Comments in merged PRs', type: 'number'}, { role: 'annotation' }], - ["medyagh", 9, "9"], - ["nirs", 2, "2"], - ["cfergeau", 1, "1"], + ["nirs", 26, "26"], + ["medyagh", 19, "19"], + ["prezha", 9, "9"], + ["cfergeau", 2, "2"], + ["afbjorklund", 1, "1"], ]); @@ -212,21 +218,21 @@

Most Active

function drawprCounts() { var data = new google.visualization.arrayToDataTable([ [{label:'',type:'string'},{label: '# of Pull Requests Merged', type: 'number'}, { role: 'annotation' }], - ["medyagh", 9, "9"], - ["ComradeProgrammer", 7, "7"], + ["medyagh", 12, "12"], + ["nirs", 10, "10"], + ["ComradeProgrammer", 9, "9"], ["prezha", 6, "6"], - ["nirs", 3, "3"], + ["LJTian", 3, "3"], + ["Victorthedev", 2, "2"], + ["zvdy", 2, "2"], ["Aaina26", 1, "1"], + ["danielcristho", 1, "1"], + ["cdw8431", 1, "1"], + ["SzymonNadbrzezny", 1, "1"], + ["liangyuanpeng", 1, "1"], ["xcarolan", 1, "1"], - ["luchenhan", 1, "1"], ["jeffmaury", 1, "1"], ["wuwentao", 1, "1"], - ["cdw8431", 1, "1"], - ["liangyuanpeng", 1, "1"], - ["LJTian", 1, "1"], - ["danielcristho", 1, "1"], - ["joaquimrocha", 1, "1"], - ["SzymonNadbrzezny", 1, "1"], ]); @@ -259,21 +265,21 @@

Big Movers

function drawprDeltas() { var data = new google.visualization.arrayToDataTable([ [{label:'',type:'string'},{label: 'Lines of code (delta)', type: 'number'}, { role: 'annotation' }], - ["nirs", 598, "598"], + ["nirs", 1448, "1448"], + ["LJTian", 1264, "1264"], + ["ComradeProgrammer", 742, "742"], + ["panyam", 738, "738"], + ["Victorthedev", 507, "507"], ["prezha", 405, "405"], - ["medyagh", 299, "299"], - ["ComradeProgrammer", 262, "262"], + ["medyagh", 360, "360"], ["xcarolan", 27, "27"], + ["zvdy", 21, "21"], ["liangyuanpeng", 10, "10"], ["luchenhan", 4, "4"], ["wuwentao", 2, "2"], - ["SzymonNadbrzezny", 2, "2"], + ["Cosmicoppai", 2, "2"], ["joaquimrocha", 2, "2"], - ["Aaina26", 0, "0"], - ["LJTian", 0, "0"], - ["jeffmaury", 0, "0"], - ["cdw8431", 0, "0"], - ["danielcristho", 0, "0"], + ["SzymonNadbrzezny", 2, "2"], ]); @@ -306,21 +312,21 @@

Most difficult to review

function drawprSize() { var data = new google.visualization.arrayToDataTable([ [{label:'',type:'string'},{label: 'Average PR size (added+changed)', type: 'number'}, { role: 'annotation' }], - ["nirs", 186, "186"], + ["panyam", 504, "504"], + ["LJTian", 247, "247"], + ["Victorthedev", 155, "155"], + ["nirs", 131, "131"], + ["ComradeProgrammer", 47, "47"], ["prezha", 35, "35"], - ["ComradeProgrammer", 30, "30"], ["xcarolan", 25, "25"], - ["medyagh", 22, "22"], + ["medyagh", 20, "20"], + ["zvdy", 9, "9"], ["liangyuanpeng", 5, "5"], ["luchenhan", 2, "2"], ["wuwentao", 1, "1"], ["joaquimrocha", 1, "1"], ["SzymonNadbrzezny", 1, "1"], - ["danielcristho", 0, "0"], - ["Aaina26", 0, "0"], - ["jeffmaury", 0, "0"], - ["cdw8431", 0, "0"], - ["LJTian", 0, "0"], + ["Cosmicoppai", 1, "1"], ]); @@ -360,17 +366,17 @@

Most Active

["Ritikaa96", 60, "60"], ["Ruchi1499", 42, "42"], ["dhairya-seth", 31, "31"], - ["afbjorklund", 17, "17"], - ["medyagh", 16, "16"], + ["afbjorklund", 24, "24"], + ["medyagh", 19, "19"], + ["nirs", 11, "11"], ["AmarNathChary", 10, "10"], + ["LJTian", 8, "8"], ["kundan2707", 7, "7"], - ["nirs", 6, "6"], - ["LJTian", 6, "6"], - ["ljluestc", 4, "4"], ["xcarolan", 4, "4"], - ["Angelin01", 3, "3"], + ["ljluestc", 4, "4"], + ["rvs497", 3, "3"], ["panyam", 3, "3"], - ["azrulafiq", 3, "3"], + ["iankingori", 3, "3"], ["arlandi1974", 3, "3"], ]); @@ -405,20 +411,20 @@

Most Helpful

var data = new google.visualization.arrayToDataTable([ [{label:'',type:'string'},{label: '# of words (excludes authored)', type: 'number'}, { role: 'annotation' }], ["huttsMichael", 2234, "2234"], + ["nirs", 1205, "1205"], ["Ruchi1499", 1084, "1084"], ["Ritikaa96", 988, "988"], ["mardonner", 790, "790"], ["ljluestc", 715, "715"], ["dhairya-seth", 615, "615"], - ["medyagh", 520, "520"], - ["afbjorklund", 440, "440"], + ["medyagh", 603, "603"], + ["afbjorklund", 571, "571"], + ["polarathene", 556, "556"], ["Zenner2", 423, "423"], - ["nirs", 361, "361"], ["danmaninc", 336, "336"], ["ptiseo-mcs", 326, "326"], ["haoyun", 314, "314"], ["ComradeProgrammer", 221, "221"], - ["LJTian", 139, "139"], ]); @@ -451,7 +457,7 @@

Top Closers

function drawissueCloser() { var data = new google.visualization.arrayToDataTable([ [{label:'',type:'string'},{label: '# of issues closed (excludes authored)', type: 'number'}, { role: 'annotation' }], - ["medyagh", 6, "6"], + ["medyagh", 10, "10"], ["prezha", 2, "2"], ["afbjorklund", 1, "1"], From b12050d9467c93079a1be82b1a11b863421ac0a5 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Tue, 3 Jun 2025 12:17:07 -0700 Subject: [PATCH 16/60] Addon inspektor-gadget: Update inspektor-gadget image from v0.40.0 to v0.41.0 (#20873) --- deploy/addons/inspektor-gadget/ig-deployment.yaml.tmpl | 9 +++++++-- pkg/minikube/assets/addons.go | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/deploy/addons/inspektor-gadget/ig-deployment.yaml.tmpl b/deploy/addons/inspektor-gadget/ig-deployment.yaml.tmpl index 575cc81cfe..6b17117255 100644 --- a/deploy/addons/inspektor-gadget/ig-deployment.yaml.tmpl +++ b/deploy/addons/inspektor-gadget/ig-deployment.yaml.tmpl @@ -28,8 +28,6 @@ data: docker-socketpath: /run/docker.sock podman-socketpath: /run/podman/podman.sock operator: - ebpf: - enable-bpfstats: false oci: verify-image: true public-keys: @@ -180,6 +178,13 @@ spec: - -liveness periodSeconds: 5 timeoutSeconds: 2 + startupProbe: + exec: + command: + - /bin/gadgettracermanager + - -liveness + failureThreshold: 12 + periodSeconds: 5 env: - name: NODE_NAME valueFrom: diff --git a/pkg/minikube/assets/addons.go b/pkg/minikube/assets/addons.go index ab49f26874..e1815c3c07 100644 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -310,7 +310,7 @@ var Addons = map[string]*Addon{ MustBinAsset(addons.InspektorGadgetAssets, "inspektor-gadget/ig-deployment.yaml.tmpl", vmpath.GuestAddonsDir, "ig-deployment.yaml", "0640"), }, false, "inspektor-gadget", "3rd party (inspektor-gadget.io)", "https://github.com/orgs/inspektor-gadget/people", "https://minikube.sigs.k8s.io/docs/handbook/addons/inspektor-gadget/", map[string]string{ - "InspektorGadget": "inspektor-gadget/inspektor-gadget:v0.40.0@sha256:8675a014e349eb928dadd8109fd631595c645bb7efa226710cc5bbb85e0fcb6a", + "InspektorGadget": "inspektor-gadget/inspektor-gadget:v0.41.0@sha256:1ba1900f625d235ee85737a948b363f620b2494f0963eb06c39898f37e470469", }, map[string]string{ "InspektorGadget": "ghcr.io", }), From 9f50bdfe038d5793f79fcbe64bc4b29af908c79c Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Tue, 3 Jun 2025 12:42:21 -0700 Subject: [PATCH 17/60] Site: Update hugo from v0.147.5 to v0.147.7 (#20869) --- netlify.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netlify.toml b/netlify.toml index f0f9fe55f3..edb8de25a2 100644 --- a/netlify.toml +++ b/netlify.toml @@ -5,7 +5,7 @@ command = "pwd && cd themes/docsy && npm install && git submodule update -f --in [build.environment] NODE_VERSION = "20.19.2" -HUGO_VERSION = "v0.147.5" +HUGO_VERSION = "v0.147.7" [context.production.environment] HUGO_ENV = "production" From 2ca868606458c216084f0e9d130b7f446dcccdf9 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Tue, 3 Jun 2025 12:42:47 -0700 Subject: [PATCH 18/60] CNI: Update calico from v3.30.0 to v3.30.1 (#20871) --- pkg/minikube/bootstrapper/images/images.go | 2 +- pkg/minikube/cni/calico.yaml | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/pkg/minikube/bootstrapper/images/images.go b/pkg/minikube/bootstrapper/images/images.go index 27b5b7f1d6..a4c5f30408 100644 --- a/pkg/minikube/bootstrapper/images/images.go +++ b/pkg/minikube/bootstrapper/images/images.go @@ -185,7 +185,7 @@ func KindNet(repo string) string { } // all calico images are from https://github.com/projectcalico/calico/blob/master/manifests/calico.yaml -const calicoVersion = "v3.30.0" +const calicoVersion = "v3.30.1" const calicoRepo = "docker.io/calico" // CalicoDaemonSet returns the image used for calicoDaemonSet diff --git a/pkg/minikube/cni/calico.yaml b/pkg/minikube/cni/calico.yaml index 0b11978fc6..fa70e49a2c 100644 --- a/pkg/minikube/cni/calico.yaml +++ b/pkg/minikube/cni/calico.yaml @@ -1628,6 +1628,13 @@ spec: description: FlowLogGoldmaneServer is the flow server endpoint to which flow data should be published. type: string + flowLogsLocalReporter: + description: 'FlowLogsLocalReporter configures local unix socket for + reporting flow data from each node. [Default: Disabled]' + enum: + - Disabled + - Enabled + type: string flowLogsPolicyEvaluationMode: description: |- Continuous - Felix evaluates active flows on a regular basis to determine the rule @@ -1871,18 +1878,18 @@ spec: logSeverityFile: description: 'LogSeverityFile is the log severity above which logs are sent to the log file. [Default: Info]' - pattern: ^(?i)(Debug|Info|Warning|Error|Fatal)?$ + pattern: ^(?i)(Trace|Debug|Info|Warning|Error|Fatal)?$ type: string logSeverityScreen: description: 'LogSeverityScreen is the log severity above which logs are sent to the stdout. [Default: Info]' - pattern: ^(?i)(Debug|Info|Warning|Error|Fatal)?$ + pattern: ^(?i)(Trace|Debug|Info|Warning|Error|Fatal)?$ type: string logSeveritySys: description: |- LogSeveritySys is the log severity above which logs are sent to the syslog. Set to None for no logging to syslog. [Default: Info] - pattern: ^(?i)(Debug|Info|Warning|Error|Fatal)?$ + pattern: ^(?i)(Trace|Debug|Info|Warning|Error|Fatal)?$ type: string maxIpsetSize: description: |- From 4da3cedc84cc367a7a047ac2e4d4f3bbbcec4f81 Mon Sep 17 00:00:00 2001 From: Predrag Rogic Date: Tue, 3 Jun 2025 23:07:48 +0100 Subject: [PATCH 19/60] Fix KVM driver (tests) timeouts (#20852) * Fix KVM driver tests timeouts Rewrite KVM driver waiting logic for domain start, getting ip address and shutting domain down. Add more config/state outputs to aid future debugging. Bump go/libvirt to v1.11002.0 and set the minimum memory required for running all tests to 3GB to avoid some really weird system behaviour. * revert reduction of timelimit for TestCert tests run * set memory and debug output in TestNoKubernetes tests * extend kvm waitForStaticIP timeout * add console log to debug output * Updating ISO to v1.36.0-1748823857-20852 --------- Co-authored-by: minikube-bot --- Makefile | 14 +- cmd/minikube/cmd/start.go | 4 +- cmd/minikube/cmd/start_test.go | 20 +-- deploy/iso/minikube-iso/go.hash | 2 +- go.mod | 2 +- go.sum | 4 +- hack/metrics/metrics.go | 2 +- pkg/drivers/kvm/domain.go | 30 ++-- pkg/drivers/kvm/domain_definition_arm64.go | 16 +- pkg/drivers/kvm/domain_definition_x86.go | 21 ++- pkg/drivers/kvm/kvm.go | 177 +++++++++++++-------- pkg/drivers/kvm/network.go | 154 ++++++++++++------ pkg/minikube/download/iso.go | 2 +- test/integration/aab_offline_test.go | 2 +- test/integration/addons_test.go | 2 +- test/integration/cert_options_test.go | 6 +- test/integration/docker_test.go | 6 +- test/integration/error_spam_test.go | 2 +- test/integration/functional_test.go | 4 +- test/integration/guest_env_test.go | 3 +- test/integration/gvisor_addon_test.go | 2 +- test/integration/ha_test.go | 2 +- test/integration/json_output_test.go | 4 +- test/integration/mount_start_test.go | 2 +- test/integration/multinode_test.go | 2 +- test/integration/net_test.go | 2 +- test/integration/no_kubernetes_test.go | 6 +- test/integration/pause_test.go | 2 +- test/integration/preload_test.go | 4 +- test/integration/scheduled_stop_test.go | 2 +- test/integration/skaffold_test.go | 2 +- test/integration/start_stop_delete_test.go | 2 +- test/integration/status_test.go | 2 +- test/integration/version_upgrade_test.go | 20 +-- 34 files changed, 326 insertions(+), 201 deletions(-) diff --git a/Makefile b/Makefile index b44f1767e0..02a3d1b6f4 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ KIC_VERSION ?= $(shell grep -E "Version =" pkg/drivers/kic/types.go | cut -d \" HUGO_VERSION ?= $(shell grep -E "HUGO_VERSION = \"" netlify.toml | cut -d \" -f2) # Default to .0 for higher cache hit rates, as build increments typically don't require new ISO versions -ISO_VERSION ?= v1.36.0 +ISO_VERSION ?= v1.36.0-1748823857-20852 # Dashes are valid in semver, but not Linux packaging. Use ~ to delimit alpha/beta DEB_VERSION ?= $(subst -,~,$(RAW_VERSION)) @@ -103,7 +103,7 @@ $(shell mkdir -p $(BUILD_DIR)) CURRENT_GIT_BRANCH ?= $(shell git branch | grep \* | cut -d ' ' -f2) # Use system python if it exists, otherwise use Docker. -PYTHON := $(shell command -v python || echo "docker run --rm -it -v $(shell pwd):/minikube:Z -w /minikube python python") +PYTHON := $(shell command -v python || echo "docker run --rm -it -v $(shell pwd):/minikube -w /minikube python python") BUILD_OS := $(shell uname -s) SHA512SUM=$(shell command -v sha512sum || echo "shasum -a 512") @@ -189,7 +189,7 @@ endef # $(call DOCKER, image, command) define DOCKER - docker run --rm -e GOCACHE=/app/.cache -e IN_DOCKER=1 --user $(shell id -u):$(shell id -g) -w /app -v $(PWD):/app:Z -v $(GOPATH):/go --init $(1) /bin/bash -c '$(2)' + docker run --rm -e GOCACHE=/app/.cache -e IN_DOCKER=1 --user $(shell id -u):$(shell id -g) -w /app -v $(PWD):/app -v $(GOPATH):/go --init $(1) /bin/bash -c '$(2)' endef ifeq ($(BUILD_IN_DOCKER),y) @@ -341,13 +341,13 @@ out/minikube-%.iso: $(shell find "deploy/iso/minikube-iso" -type f) ifeq ($(IN_DOCKER),1) $(MAKE) minikube-iso-$* else - docker run --rm --workdir /mnt --volume $(CURDIR):/mnt:Z $(ISO_DOCKER_EXTRA_ARGS) \ + docker run --rm --workdir /mnt --volume $(CURDIR):/mnt $(ISO_DOCKER_EXTRA_ARGS) \ --user $(shell id -u):$(shell id -g) --env HOME=/tmp --env IN_DOCKER=1 \ $(ISO_BUILD_IMAGE) /bin/bash -lc '/usr/bin/make minikube-iso-$*' endif iso_in_docker: - docker run -it --rm --workdir /mnt --volume $(CURDIR):/mnt:Z $(ISO_DOCKER_EXTRA_ARGS) \ + docker run -it --rm --workdir /mnt --volume $(CURDIR):/mnt $(ISO_DOCKER_EXTRA_ARGS) \ --user $(shell id -u):$(shell id -g) --env HOME=/tmp --env IN_DOCKER=1 \ $(ISO_BUILD_IMAGE) /bin/bash @@ -523,7 +523,7 @@ out/linters/golangci-lint-$(GOLINT_VERSION): .PHONY: lint ifeq ($(MINIKUBE_BUILD_IN_DOCKER),y) lint: - docker run --rm -v `pwd`:/app:Z -w /app golangci/golangci-lint:$(GOLINT_VERSION) \ + docker run --rm -v `pwd`:/app -w /app golangci/golangci-lint:$(GOLINT_VERSION) \ golangci-lint run ${GOLINT_OPTIONS} ./..." # --skip-dirs "cmd/drivers/kvm|cmd/drivers/hyperkit|pkg/drivers/kvm|pkg/drivers/hyperkit" # The "--skip-dirs" parameter is no longer supported in the V2 version. If you need to skip the directory, @@ -657,7 +657,7 @@ out/docker-machine-driver-hyperkit: ifeq ($(MINIKUBE_BUILD_IN_DOCKER),y) docker run --rm -e GOCACHE=/app/.cache -e IN_DOCKER=1 \ --user $(shell id -u):$(shell id -g) -w /app \ - -v $(PWD):/app:Z -v $(GOPATH):/go:Z --init --entrypoint "" \ + -v $(PWD):/app -v $(GOPATH):/go --init --entrypoint "" \ $(HYPERKIT_BUILD_IMAGE) /bin/bash -c 'CC=o64-clang CXX=o64-clang++ /usr/bin/make $@' else $(if $(quiet),@echo " GO $@") diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index ed1d87f6e6..82fb1386ab 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -1098,8 +1098,8 @@ func suggestMemoryAllocation(sysLimit, containerLimit, nodes int) int { return mem } - const fallback = 2200 - maximum := 6000 + const fallback = 3072 + maximum := 6144 if sysLimit > 0 && fallback > sysLimit { return sysLimit diff --git a/cmd/minikube/cmd/start_test.go b/cmd/minikube/cmd/start_test.go index 6f468b6326..a4786ee171 100644 --- a/cmd/minikube/cmd/start_test.go +++ b/cmd/minikube/cmd/start_test.go @@ -277,26 +277,26 @@ func TestSuggestMemoryAllocation(t *testing.T) { nodes int want int }{ - {"128GB sys", 128000, 0, 1, 6000}, - {"64GB sys", 64000, 0, 1, 6000}, - {"32GB sys", 32768, 0, 1, 6000}, + {"128GB sys", 128000, 0, 1, 6144}, + {"64GB sys", 64000, 0, 1, 6144}, + {"32GB sys", 32768, 0, 1, 6144}, {"16GB sys", 16384, 0, 1, 4000}, {"odd sys", 14567, 0, 1, 3600}, - {"4GB sys", 4096, 0, 1, 2200}, + {"4GB sys", 4096, 0, 1, 3072}, {"2GB sys", 2048, 0, 1, 2048}, - {"Unable to poll sys", 0, 0, 1, 2200}, + {"Unable to poll sys", 0, 0, 1, 3072}, {"128GB sys, 16GB container", 128000, 16384, 1, 16336}, {"64GB sys, 16GB container", 64000, 16384, 1, 16000}, {"16GB sys, 4GB container", 16384, 4096, 1, 4000}, {"4GB sys, 3.5GB container", 16384, 3500, 1, 3452}, {"16GB sys, 2GB container", 16384, 2048, 1, 2048}, {"16GB sys, unable to poll container", 16384, 0, 1, 4000}, - {"128GB sys 2 nodes", 128000, 0, 2, 6000}, - {"8GB sys 3 nodes", 8192, 0, 3, 2200}, - {"16GB sys 2 nodes", 16384, 0, 2, 2200}, + {"128GB sys 2 nodes", 128000, 0, 2, 6144}, + {"8GB sys 3 nodes", 8192, 0, 3, 3072}, + {"16GB sys 2 nodes", 16384, 0, 2, 3072}, {"32GB sys 2 nodes", 32768, 0, 2, 4050}, - {"odd sys 2 nodes", 14567, 0, 2, 2200}, - {"4GB sys 2 nodes", 4096, 0, 2, 2200}, + {"odd sys 2 nodes", 14567, 0, 2, 3072}, + {"4GB sys 2 nodes", 4096, 0, 2, 3072}, {"2GB sys 3 nodes", 2048, 0, 3, 2048}, } for _, test := range tests { diff --git a/deploy/iso/minikube-iso/go.hash b/deploy/iso/minikube-iso/go.hash index 10d429ba08..2cb1e75ff3 100644 --- a/deploy/iso/minikube-iso/go.hash +++ b/deploy/iso/minikube-iso/go.hash @@ -35,4 +35,4 @@ sha256 36930162a93df417d90bd22c6e14daff4705baac2b02418edda671cdfa9cd07f go1.23 sha256 8d6a77332487557c6afa2421131b50f83db4ae3c579c3bc72e670ee1f6968599 go1.23.3.src.tar.gz sha256 ad345ac421e90814293a9699cca19dd5238251c3f687980bbcae28495b263531 go1.23.4.src.tar.gz sha256 d14120614acb29d12bcab72bd689f257eb4be9e0b6f88a8fb7e41ac65f8556e5 go1.24.0.src.tar.gz -sha256 6924efde5de86fe277676e929dc9917d466efa02fb934197bc2eba35d5680971 go1.23.4.linux-amd64.tar.gz \ No newline at end of file +sha256 6924efde5de86fe277676e929dc9917d466efa02fb934197bc2eba35d5680971 go1.23.4.linux-amd64.tar.gz diff --git a/go.mod b/go.mod index d4d4bd6ac0..46402f475c 100644 --- a/go.mod +++ b/go.mod @@ -87,7 +87,7 @@ require ( k8s.io/klog/v2 v2.130.1 k8s.io/kubectl v0.32.2 k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 - libvirt.org/go/libvirt v1.11001.0 + libvirt.org/go/libvirt v1.11002.0 sigs.k8s.io/sig-storage-lib-external-provisioner/v6 v6.3.0 ) diff --git a/go.sum b/go.sum index dfd537622c..13afeafe6b 100644 --- a/go.sum +++ b/go.sum @@ -3219,8 +3219,8 @@ k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -libvirt.org/go/libvirt v1.11001.0 h1:QJgpslxY7qkpXZIDxdMHpkDl7FfhgQJwqRTGBbg/S8E= -libvirt.org/go/libvirt v1.11001.0/go.mod h1:1WiFE8EjZfq+FCVog+rvr1yatKbKZ9FaFMZgEqxEJqQ= +libvirt.org/go/libvirt v1.11002.0 h1:cb8KJG3D97pc/hxQ2n6P82hRX3rlgdzO7bih6W1AAQ8= +libvirt.org/go/libvirt v1.11002.0/go.mod h1:1WiFE8EjZfq+FCVog+rvr1yatKbKZ9FaFMZgEqxEJqQ= lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= diff --git a/hack/metrics/metrics.go b/hack/metrics/metrics.go index 83f61d4e8f..868d6c6324 100644 --- a/hack/metrics/metrics.go +++ b/hack/metrics/metrics.go @@ -145,7 +145,7 @@ func getLabels(containerRuntime string) *stackdriver.Labels { func minikubeStartTime(ctx context.Context, projectID, minikubePath, containerRuntime string) (float64, error) { defer deleteMinikube(ctx, minikubePath) - cmd := exec.CommandContext(ctx, minikubePath, "start", "--driver=docker", "-p", profile, "--memory=2048", "--trace=gcp", fmt.Sprintf("--container-runtime=%s", containerRuntime)) + cmd := exec.CommandContext(ctx, minikubePath, "start", "--driver=docker", "-p", profile, "--memory=3072", "--trace=gcp", fmt.Sprintf("--container-runtime=%s", containerRuntime)) cmd.Env = append(os.Environ(), fmt.Sprintf("%s=%s", pkgtrace.ProjectEnvVar, projectID)) cmd.Stdout = os.Stderr cmd.Stderr = os.Stderr diff --git a/pkg/drivers/kvm/domain.go b/pkg/drivers/kvm/domain.go index 15af5a2ec1..6918db5fc4 100644 --- a/pkg/drivers/kvm/domain.go +++ b/pkg/drivers/kvm/domain.go @@ -31,12 +31,12 @@ import ( func (d *Driver) getDomain() (*libvirt.Domain, *libvirt.Connect, error) { conn, err := getConnection(d.ConnectionURI) if err != nil { - return nil, nil, errors.Wrap(err, "getting libvirt connection") + return nil, nil, fmt.Errorf("failed opening libvirt connection: %w", err) } dom, err := conn.LookupDomainByName(d.MachineName) if err != nil { - return nil, nil, errors.Wrap(err, "looking up domain") + return nil, nil, fmt.Errorf("failed looking up domain: %w", lvErr(err)) } return dom, conn, nil @@ -45,13 +45,17 @@ func (d *Driver) getDomain() (*libvirt.Domain, *libvirt.Connect, error) { func getConnection(connectionURI string) (*libvirt.Connect, error) { conn, err := libvirt.NewConnect(connectionURI) if err != nil { - return nil, errors.Wrap(err, "connecting to libvirt socket") + return nil, fmt.Errorf("failed connecting to libvirt socket: %w", lvErr(err)) } return conn, nil } func closeDomain(dom *libvirt.Domain, conn *libvirt.Connect) error { + if dom == nil { + return fmt.Errorf("nil domain, cannot close") + } + if err := dom.Free(); err != nil { return err } @@ -62,25 +66,31 @@ func closeDomain(dom *libvirt.Domain, conn *libvirt.Connect) error { return err } -func (d *Driver) createDomain() (*libvirt.Domain, error) { - // create the XML for the domain using our domainTmpl template +// defineDomain defines the XML for the domain using our domainTmpl template +func (d *Driver) defineDomain() (*libvirt.Domain, error) { tmpl := template.Must(template.New("domain").Parse(domainTmpl)) var domainXML bytes.Buffer - if err := tmpl.Execute(&domainXML, d); err != nil { + dlog := struct { + Driver + ConsoleLogPath string + }{ + Driver: *d, + ConsoleLogPath: consoleLogPath(*d), + } + if err := tmpl.Execute(&domainXML, dlog); err != nil { return nil, errors.Wrap(err, "executing domain xml") } conn, err := getConnection(d.ConnectionURI) if err != nil { - return nil, errors.Wrap(err, "getting libvirt connection") + return nil, fmt.Errorf("failed opening libvirt connection: %w", err) } defer func() { if _, err := conn.Close(); err != nil { - log.Errorf("unable to close libvirt connection: %v", err) + log.Errorf("failed closing libvirt connection: %v", lvErr(err)) } }() - log.Infof("define libvirt domain using xml: %v", domainXML.String()) - // define the domain in libvirt using the generated XML + log.Infof("defining domain using XML: %v", domainXML.String()) dom, err := conn.DomainDefineXML(domainXML.String()) if err != nil { return nil, errors.Wrapf(err, "error defining domain xml: %s", domainXML.String()) diff --git a/pkg/drivers/kvm/domain_definition_arm64.go b/pkg/drivers/kvm/domain_definition_arm64.go index 4d02acb9d9..b9ba0a27c4 100644 --- a/pkg/drivers/kvm/domain_definition_arm64.go +++ b/pkg/drivers/kvm/domain_definition_arm64.go @@ -27,16 +27,16 @@ const domainTmpl = ` - {{if .Hidden}} + {{- if .Hidden}} - {{end}} + {{- end}} - {{if gt .NUMANodeCount 1}} + {{- if gt .NUMANodeCount 1}} {{.NUMANodeXML}} - {{end}} + {{- end}} hvm @@ -75,12 +75,12 @@ const domainTmpl = ` /dev/random - {{if .GPU}} + {{- if .GPU}} {{.DevicesXML}} - {{end}} - {{if gt .ExtraDisks 0}} + {{- end}} + {{- if gt .ExtraDisks 0}} {{.ExtraDisksXML}} - {{end}} + {{- end}} ` diff --git a/pkg/drivers/kvm/domain_definition_x86.go b/pkg/drivers/kvm/domain_definition_x86.go index 4557cf9055..388ef1c403 100644 --- a/pkg/drivers/kvm/domain_definition_x86.go +++ b/pkg/drivers/kvm/domain_definition_x86.go @@ -27,16 +27,16 @@ const domainTmpl = ` - {{if .Hidden}} + {{- if .Hidden}} - {{end}} + {{- end}} - {{if gt .NUMANodeCount 1}} + {{- if gt .NUMANodeCount 1}} {{.NUMANodeXML}} - {{end}} + {{- end}} hvm @@ -55,6 +55,7 @@ const domainTmpl = ` + @@ -65,19 +66,23 @@ const domainTmpl = ` + + + + /dev/random - {{if .GPU}} + {{- if .GPU}} {{.DevicesXML}} - {{end}} - {{if gt .ExtraDisks 0}} + {{- end}} + {{- if gt .ExtraDisks 0}} {{.ExtraDisksXML}} - {{end}} + {{- end}} ` diff --git a/pkg/drivers/kvm/kvm.go b/pkg/drivers/kvm/kvm.go index 63c6286499..4b3785a553 100644 --- a/pkg/drivers/kvm/kvm.go +++ b/pkg/drivers/kvm/kvm.go @@ -141,11 +141,11 @@ func (d *Driver) GetURL() (string, error) { func (d *Driver) PreCommandCheck() error { conn, err := getConnection(d.ConnectionURI) if err != nil { - return errors.Wrap(err, "getting libvirt connection") + return fmt.Errorf("failed opening libvirt connection: %w", err) } defer func() { if _, err := conn.Close(); err != nil { - log.Errorf("unable to close libvirt connection: %v", err) + log.Errorf("failed closing libvirt connection: %v", lvErr(err)) } }() @@ -167,7 +167,7 @@ func (d *Driver) GetState() (state.State, error) { } defer func() { if err := closeDomain(dom, conn); err != nil { - log.Errorf("unable to close domain: %v", err) + log.Errorf("failed closing domain: %v", err) } }() @@ -225,11 +225,11 @@ func (d *Driver) GetIP() (string, error) { conn, err := getConnection(d.ConnectionURI) if err != nil { - return "", errors.Wrap(err, "getting libvirt connection") + return "", fmt.Errorf("failed opening libvirt connection: %w", err) } defer func() { if _, err := conn.Close(); err != nil { - log.Errorf("unable to close libvirt connection: %v", err) + log.Errorf("failed closing libvirt connection: %v", lvErr(err)) } }() @@ -265,7 +265,7 @@ func (d *Driver) Kill() error { } defer func() { if err := closeDomain(dom, conn); err != nil { - log.Errorf("unable to close domain: %v", err) + log.Errorf("failed closing domain: %v", err) } }() @@ -303,17 +303,47 @@ func (d *Driver) Start() error { } defer func() { if err := closeDomain(dom, conn); err != nil { - log.Errorf("unable to close domain: %v", err) + log.Errorf("failed closing domain: %v", err) + } + }() + + domXML, err := dom.GetXMLDesc(libvirt.DOMAIN_XML_SECURE) + if err != nil { + log.Debugf("failed to get domain XML: %v", lvErr(err)) + } else { + log.Debugf("starting domain XML:\n%s", domXML) + } + + // libvirt/qemu creates a console log file owned by root:root and permissions 0600, + // so we pre-create it (and close it immediately), just to be able to read it later + logPath := consoleLogPath(*d) + f, err := os.Create(logPath) + if err != nil { + log.Debugf("failed to create console log file %q: %v", logPath, err) + } else { + f.Close() + } + // ensure console log file is cleaned up + defer func() { + if _, err := os.Stat(logPath); err == nil { + if err := os.Remove(logPath); err != nil { + log.Debugf("failed removing console log file %q: %v", logPath, err) + } } }() - log.Info("creating domain...") if err := dom.Create(); err != nil { return errors.Wrap(err, "creating domain") } + log.Info("waiting for domain to start...") + if err := d.waitForDomainState(state.Running, 30*time.Second); err != nil { + return errors.Wrap(err, "waiting for domain to start") + } + log.Info("domain is now running") + log.Info("waiting for IP...") - if err := d.waitForStaticIP(conn); err != nil { + if err := d.waitForStaticIP(conn, 90*time.Second); err != nil { return errors.Wrap(err, "waiting for IP") } @@ -325,8 +355,51 @@ func (d *Driver) Start() error { return nil } +// consoleLogPath returns the path to the console log file for the given machine name. +func consoleLogPath(d Driver) string { + // return fmt.Sprintf("%s-console.log", machineName) + return d.ResolveStorePath("console.log") +} + +// waitForDomainState waits maxTime for the domain to reach a target state. +func (d *Driver) waitForDomainState(targetState state.State, maxTime time.Duration) error { + query := func() error { + currentState, err := d.GetState() + if err != nil { + return fmt.Errorf("failed getting domain state: %w", err) + } + + if currentState == targetState { + return nil + } + + log.Debugf("current domain state is %q, will retry", currentState.String()) + return fmt.Errorf("last domain state: %q", currentState.String()) + } + if err := retry.Local(query, maxTime); err != nil { + dumpConsoleLogs(consoleLogPath(*d)) + return fmt.Errorf("timed out waiting %v for domain to reach %q state: %w", maxTime, targetState.String(), err) + } + return nil +} + +// dumpConsoleLogs prints out the console log. +func dumpConsoleLogs(logPath string) { + if _, err := os.Stat(logPath); err != nil { + log.Debugf("failed checking console log file %q: %v", logPath, err) + return + } + + data, err := os.ReadFile(logPath) + if err != nil { + log.Debugf("failed dumping console log file %q: %v", logPath, err) + return + } + log.Debugf("console log:\n%s", data) +} + // waitForStaticIP waits for IP address of domain that has been created & starting and then makes that IP static. -func (d *Driver) waitForStaticIP(conn *libvirt.Connect) error { +func (d *Driver) waitForStaticIP(conn *libvirt.Connect, maxTime time.Duration) error { query := func() error { sip, err := ipFromAPI(conn, d.MachineName, d.PrivateNetwork) if err != nil { @@ -342,8 +415,9 @@ func (d *Driver) waitForStaticIP(conn *libvirt.Connect) error { return nil } - if err := retry.Local(query, 1*time.Minute); err != nil { - return fmt.Errorf("domain %s didn't return IP after 1 minute", d.MachineName) + if err := retry.Local(query, maxTime); err != nil { + dumpConsoleLogs(consoleLogPath(*d)) + return fmt.Errorf("domain %s didn't return IP after %v", d.MachineName, maxTime) } log.Info("reserving static IP address...") @@ -358,7 +432,7 @@ func (d *Driver) waitForStaticIP(conn *libvirt.Connect) error { // Create a host using the driver's config func (d *Driver) Create() error { - log.Info("creating KVM machine...") + log.Info("creating domain...") log.Info("creating network...") if err := d.createNetwork(); err != nil { @@ -418,15 +492,16 @@ func (d *Driver) Create() error { log.Errorf("unable to ensure permissions on %s: %v", store, err) } - log.Info("creating domain...") - - dom, err := d.createDomain() + log.Info("defining domain...") + dom, err := d.defineDomain() if err != nil { - return errors.Wrap(err, "creating domain") + return errors.Wrap(err, "defining domain") } defer func() { - if err := dom.Free(); err != nil { - log.Errorf("unable to free domain: %v", err) + if dom == nil { + log.Warnf("nil domain, cannot free") + } else if err := dom.Free(); err != nil { + log.Errorf("failed freeing %s domain: %v", d.MachineName, lvErr(err)) } }() @@ -434,7 +509,7 @@ func (d *Driver) Create() error { return errors.Wrap(err, "starting domain") } - log.Infof("KVM machine creation complete") + log.Infof("domain creation complete") return nil } @@ -470,28 +545,29 @@ func ensureDirPermissions(store string) error { // Stop a host gracefully or forcefully otherwise. func (d *Driver) Stop() error { + log.Info("stopping domain...") + s, err := d.GetState() if err != nil { - return errors.Wrap(err, "getting domain state") + return fmt.Errorf("getting domain state: %w", err) } if s == state.Stopped { + log.Info("domain already stopped, nothing to do") return nil } - log.Info("stopping domain...") - dom, conn, err := d.getDomain() if err != nil { - return errors.Wrap(err, "getting domain") + return fmt.Errorf("getting domain: %w", err) } defer func() { if err := closeDomain(dom, conn); err != nil { - log.Errorf("unable to close domain: %v", err) + log.Errorf("failed closing domain: %v", err) } }() - log.Info("gracefully shutting down domain...") + log.Info("gracefully shutting domain down...") // ref: https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainShutdownFlags // note: "The order in which the hypervisor tries each shutdown method is undefined, and a hypervisor is not required to support all methods." @@ -508,52 +584,25 @@ func (d *Driver) Stop() error { } if err := dom.Shutdown(); err != nil { - return errors.Wrap(err, "gracefully shutting down domain") + return fmt.Errorf("gracefully shutting domain down: %w", err) } - if s, err = d.waitForStopState(90, "graceful shutdown"); err == nil { - log.Info("domain gracefully shutdown") + if err = d.waitForDomainState(state.Stopped, 90*time.Second); err == nil { + log.Info("domain gracefully shut down") return nil } - // could not get domain state - if s == state.None { - return err - } + log.Warn("failed graceful domain shut down, will try to force-stop") - // at this point shutdown failed, so we try with a little bit of force - log.Warn("waiting for domain graceful shutdown failed, will try to force-stop") if err := d.Kill(); err != nil { - log.Warnf("force-stopping domain request failed: %v", err) - } - - if s, err := d.waitForStopState(30, "force-stop"); err != nil { - return fmt.Errorf("unable to stop domain %s, current state is %q", d.MachineName, s.String()) + return fmt.Errorf("force-stopping domain request failed: %w", err) } - log.Info("domain force-stopped") - - return nil -} - -// waitForStopState waits maxsec for the domain to reach a stopped state. -func (d *Driver) waitForStopState(maxsec int, method string) (state.State, error) { - var s state.State - var err error - for i := 0; i < maxsec; i++ { - if s, err = d.GetState(); err != nil { - return s, errors.Wrap(err, "getting domain state") - } - - if s == state.Stopped { - return state.Stopped, nil - } - - log.Infof("waiting for domain %s %d/%d", method, i, maxsec) - time.Sleep(1 * time.Second) + if err = d.waitForDomainState(state.Stopped, 30*time.Second); err == nil { + log.Info("domain force-stopped") + return nil } - - return s, fmt.Errorf("timed out waiting for domain %s, current state is %q", method, s) + return fmt.Errorf("unable to stop domain: %w", err) } // Remove a host @@ -562,11 +611,11 @@ func (d *Driver) Remove() error { conn, err := getConnection(d.ConnectionURI) if err != nil { - return errors.Wrap(err, "getting libvirt connection") + return fmt.Errorf("failed opening libvirt connection: %w", err) } defer func() { if _, err := conn.Close(); err != nil { - log.Errorf("unable to close libvirt connection: %v", err) + log.Errorf("failed closing libvirt connection: %v", lvErr(err)) } }() diff --git a/pkg/drivers/kvm/network.go b/pkg/drivers/kvm/network.go index 633a672bc8..6e407c2dee 100644 --- a/pkg/drivers/kvm/network.go +++ b/pkg/drivers/kvm/network.go @@ -39,13 +39,13 @@ const networkTmpl = ` {{.Name}} - {{with .Parameters}} + {{- with .Parameters}} - {{end}} + {{- end}} ` @@ -84,9 +84,15 @@ const firstSubnetAddr = "192.168.39.0" func setupNetwork(conn *libvirt.Connect, name string) error { n, err := conn.LookupNetworkByName(name) if err != nil { - return errors.Wrapf(err, "checking network %s", name) + return fmt.Errorf("failed looking up network %s: %w", name, lvErr(err)) } - defer func() { _ = n.Free() }() + defer func() { + if n == nil { + log.Warnf("nil network, cannot free") + } else if err := n.Free(); err != nil { + log.Errorf("failed freeing %s network: %v", name, lvErr(err)) + } + }() // always ensure autostart is set on the network autostart, err := n.GetAutostart() @@ -104,7 +110,9 @@ func setupNetwork(conn *libvirt.Connect, name string) error { if err != nil { return errors.Wrapf(err, "checking network status for %s", name) } + if !active { + log.Debugf("network %s is not active, trying to start it...", name) if err := n.Create(); err != nil { return errors.Wrapf(err, "starting network %s", name) } @@ -116,11 +124,11 @@ func setupNetwork(conn *libvirt.Connect, name string) error { func (d *Driver) ensureNetwork() error { conn, err := getConnection(d.ConnectionURI) if err != nil { - return errors.Wrap(err, "getting libvirt connection") + return fmt.Errorf("failed opening libvirt connection: %w", err) } defer func() { if _, err := conn.Close(); err != nil { - log.Errorf("unable to close libvirt connection: %v", err) + log.Errorf("failed closing libvirt connection: %v", lvErr(err)) } }() @@ -164,11 +172,11 @@ func (d *Driver) createNetwork() error { conn, err := getConnection(d.ConnectionURI) if err != nil { - return errors.Wrap(err, "getting libvirt connection") + return fmt.Errorf("failed opening libvirt connection: %w", err) } defer func() { if _, err := conn.Close(); err != nil { - log.Errorf("unable to close libvirt connection: %v", err) + log.Errorf("failed closing libvirt connection: %v", lvErr(err)) } }() @@ -176,23 +184,34 @@ func (d *Driver) createNetwork() error { // It is assumed that the libvirt/kvm installation has already created this network netd, err := conn.LookupNetworkByName(d.Network) if err != nil { - return errors.Wrapf(err, "%s KVM network doesn't exist", d.Network) + return fmt.Errorf("failed looking up network %s, cannot continue: %w", d.Network, lvErr(err)) } - log.Debugf("found existing %s KVM network", d.Network) - if netd != nil { - _ = netd.Free() + log.Debugf("found existing %s network", d.Network) + + if netdXML, err := netd.GetXMLDesc(0); err != nil { + log.Debugf("failed getting %s network XML: %v", d.Network, lvErr(err)) + } else { + log.Debug(netdXML) + } + + if err := netd.Free(); err != nil { + log.Errorf("failed freeing %s network: %v", d.Network, lvErr(err)) } // network: private // Only create the private network if it does not already exist - netp, err := conn.LookupNetworkByName(d.PrivateNetwork) - defer func() { - if netp != nil { - _ = netp.Free() + if netp, err := conn.LookupNetworkByName(d.PrivateNetwork); err == nil { + log.Warnf("found existing %s private network, skipping creation", d.PrivateNetwork) + + if netpXML, err := netp.GetXMLDesc(0); err != nil { + log.Debugf("failed getting %s private network XML: %v", d.PrivateNetwork, lvErr(err)) + } else { + log.Debug(netpXML) + } + + if err := netp.Free(); err != nil { + log.Errorf("failed freeing %s private network: %v", d.PrivateNetwork, lvErr(err)) } - }() - if err == nil { - log.Debugf("found existing private KVM network %s", d.PrivateNetwork) return nil } @@ -203,7 +222,7 @@ func (d *Driver) createNetwork() error { var subnet *network.Parameters subnet, err = network.FreeSubnet(subnetAddr, 11, 20) if err != nil { - log.Debugf("failed to find free subnet for private KVM network %s after %d attempts: %v", d.PrivateNetwork, 20, err) + log.Debugf("failed finding free subnet for private network %s after %d attempts: %v", d.PrivateNetwork, 20, err) return fmt.Errorf("un-retryable: %w", err) } @@ -220,37 +239,42 @@ func (d *Driver) createNetwork() error { tmpl := template.Must(template.New("network").Parse(networkTmpl)) var networkXML bytes.Buffer if err = tmpl.Execute(&networkXML, tryNet); err != nil { - return fmt.Errorf("executing private KVM network template: %w", err) + return fmt.Errorf("executing private network template: %w", err) } - log.Debugf("created network xml: %s", networkXML.String()) // define the network using our template - var libvirtNet *libvirt.Network - libvirtNet, err = conn.NetworkDefineXML(networkXML.String()) + log.Debugf("defining private network:\n%s", networkXML.String()) + libvirtNet, err := conn.NetworkDefineXML(networkXML.String()) if err != nil { - return fmt.Errorf("defining private KVM network %s %s from xml %s: %w", d.PrivateNetwork, subnet.CIDR, networkXML.String(), err) + return fmt.Errorf("defining private network %s %s from xml %s: %w", d.PrivateNetwork, subnet.CIDR, networkXML.String(), err) } // and finally create & start it - log.Debugf("trying to create private KVM network %s %s...", d.PrivateNetwork, subnet.CIDR) + log.Debugf("creating private network %s %s...", d.PrivateNetwork, subnet.CIDR) if err = libvirtNet.Create(); err == nil { - log.Debugf("private KVM network %s %s created", d.PrivateNetwork, subnet.CIDR) + log.Debugf("private network %s %s created", d.PrivateNetwork, subnet.CIDR) + if netpXML, err := libvirtNet.GetXMLDesc(0); err != nil { + log.Debugf("failed getting %s private network XML: %v", d.PrivateNetwork, lvErr(err)) + } else { + log.Debug(netpXML) + } + return nil } - log.Debugf("failed to create private KVM network %s %s, will retry: %v", d.PrivateNetwork, subnet.CIDR, err) + log.Debugf("failed creating private network %s %s, will retry: %v", d.PrivateNetwork, subnet.CIDR, err) subnetAddr = subnet.IP } - return fmt.Errorf("failed to create private KVM network %s: %w", d.PrivateNetwork, err) + return fmt.Errorf("failed creating private network %s: %w", d.PrivateNetwork, err) } func (d *Driver) deleteNetwork() error { conn, err := getConnection(d.ConnectionURI) if err != nil { - return errors.Wrap(err, "getting libvirt connection") + return fmt.Errorf("failed opening libvirt connection: %w", err) } defer func() { if _, err := conn.Close(); err != nil { - log.Errorf("unable to close libvirt connection: %v", err) + log.Errorf("failed closing libvirt connection: %v", lvErr(err)) } }() @@ -271,7 +295,14 @@ func (d *Driver) deleteNetwork() error { } return errors.Wrapf(err, "failed looking up network %s", d.PrivateNetwork) } - defer func() { _ = libvirtNet.Free() }() + defer func() { + if libvirtNet == nil { + log.Warnf("nil network, cannot free") + } else if err := libvirtNet.Free(); err != nil { + log.Errorf("failed freeing %s network: %v", d.PrivateNetwork, lvErr(err)) + } + }() + log.Debugf("Network %s exists", d.PrivateNetwork) err = d.checkDomains(conn) @@ -405,7 +436,13 @@ func addStaticIP(conn *libvirt.Connect, networkName, hostname, mac, ip string) e if err != nil { return fmt.Errorf("failed looking up network %s: %w", networkName, err) } - defer func() { _ = libvirtNet.Free() }() + defer func() { + if libvirtNet == nil { + log.Warnf("nil network, cannot free") + } else if err := libvirtNet.Free(); err != nil { + log.Errorf("failed freeing %s network: %v", networkName, lvErr(err)) + } + }() return libvirtNet.Update( libvirt.NETWORK_UPDATE_COMMAND_ADD_LAST, @@ -431,7 +468,13 @@ func delStaticIP(conn *libvirt.Connect, networkName, hostname, mac, ip string) e if err != nil { return fmt.Errorf("failed looking up network %s: %w", networkName, err) } - defer func() { _ = libvirtNet.Free() }() + defer func() { + if libvirtNet == nil { + log.Warnf("nil network, cannot free") + } else if err := libvirtNet.Free(); err != nil { + log.Errorf("failed freeing %s network: %v", networkName, lvErr(err)) + } + }() return libvirtNet.Update( libvirt.NETWORK_UPDATE_COMMAND_DELETE, @@ -451,7 +494,13 @@ func dhcpLease(conn *libvirt.Connect, networkName, hostname, mac, ip string) (le if err != nil { return nil, fmt.Errorf("failed looking up network %s: %w", networkName, err) } - defer func() { _ = libvirtNet.Free() }() + defer func() { + if libvirtNet == nil { + log.Warnf("nil network, cannot free") + } else if err := libvirtNet.Free(); err != nil { + log.Errorf("failed freeing %s network: %v", networkName, lvErr(err)) + } + }() leases, err := libvirtNet.GetDHCPLeases() if err != nil { @@ -491,7 +540,7 @@ func ipFromAPI(conn *libvirt.Connect, domain, networkName string) (string, error } } - log.Debugf("unable to find current IP address of domain %s in network %s", domain, networkName) + log.Debugf("unable to find current IP address of domain %s in network %s (interfaces detected: %+v)", domain, networkName, ifaces) return "", nil } @@ -499,22 +548,27 @@ func ipFromAPI(conn *libvirt.Connect, domain, networkName string) (string, error func ifListFromAPI(conn *libvirt.Connect, domain string) ([]libvirt.DomainInterface, error) { dom, err := conn.LookupDomainByName(domain) if err != nil { - return nil, fmt.Errorf("failed looking up domain %s: %w", domain, err) + return nil, fmt.Errorf("failed looking up domain %s: %w", domain, lvErr(err)) } - defer func() { _ = dom.Free() }() + defer func() { + if dom == nil { + log.Warnf("nil domain, cannot free") + } else if err := dom.Free(); err != nil { + log.Errorf("failed freeing %s domain: %v", domain, lvErr(err)) + } + }() - ifs, err := dom.ListAllInterfaceAddresses(libvirt.DOMAIN_INTERFACE_ADDRESSES_SRC_ARP) - if ifs == nil { + ifs, err := dom.ListAllInterfaceAddresses(libvirt.DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE) + if len(ifs) == 0 { if err != nil { - log.Debugf("failed listing network interface addresses of domain %s(source=arp): %w", domain, err) + log.Debugf("failed listing network interface addresses of domain %s (source=lease): %v", domain, lvErr(err)) } else { - log.Debugf("No network interface addresses found for domain %s(source=arp)", domain) + log.Debugf("no network interface addresses found for domain %s (source=lease)", domain) } - log.Debugf("trying to list again with source=lease") + log.Debugf("trying to list again with source=arp") - ifs, err = dom.ListAllInterfaceAddresses(libvirt.DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE) - if err != nil { - return nil, fmt.Errorf("failed listing network interface addresses of domain %s(source=lease): %w", domain, err) + if ifs, err = dom.ListAllInterfaceAddresses(libvirt.DOMAIN_INTERFACE_ADDRESSES_SRC_ARP); err != nil { + return nil, fmt.Errorf("failed listing network interface addresses of domain %s (source=arp): %w", domain, lvErr(err)) } } @@ -564,7 +618,13 @@ func ifListFromXML(conn *libvirt.Connect, domain string) ([]kvmIface, error) { if err != nil { return nil, fmt.Errorf("failed looking up domain %s: %w", domain, err) } - defer func() { _ = dom.Free() }() + defer func() { + if dom == nil { + log.Warnf("nil domain, cannot free") + } else if err := dom.Free(); err != nil { + log.Errorf("failed freeing %s domain: %v", domain, lvErr(err)) + } + }() domXML, err := dom.GetXMLDesc(0) if err != nil { diff --git a/pkg/minikube/download/iso.go b/pkg/minikube/download/iso.go index 19f4fe1152..5cef53355c 100644 --- a/pkg/minikube/download/iso.go +++ b/pkg/minikube/download/iso.go @@ -41,7 +41,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/20852" return []string{ fmt.Sprintf("https://storage.googleapis.com/%s/minikube-%s-%s.iso", isoBucket, v, runtime.GOARCH), diff --git a/test/integration/aab_offline_test.go b/test/integration/aab_offline_test.go index 25ea2716c9..19f6824a70 100644 --- a/test/integration/aab_offline_test.go +++ b/test/integration/aab_offline_test.go @@ -43,7 +43,7 @@ func TestOffline(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), Minutes(15)) defer CleanupWithLogs(t, profile, cancel) - startArgs := []string{"start", "-p", profile, "--alsologtostderr", "-v=1", "--memory=2048", "--wait=true"} + startArgs := []string{"start", "-p", profile, "--alsologtostderr", "-v=1", "--memory=3072", "--wait=true"} startArgs = append(startArgs, StartArgs()...) c := exec.CommandContext(ctx, Target(), startArgs...) env := os.Environ() diff --git a/test/integration/addons_test.go b/test/integration/addons_test.go index 7e719a16a7..837a19ecbb 100644 --- a/test/integration/addons_test.go +++ b/test/integration/addons_test.go @@ -101,7 +101,7 @@ func TestAddons(t *testing.T) { // so we override that here to let minikube auto-detect appropriate cgroup driver os.Setenv(constants.MinikubeForceSystemdEnv, "") - args := append([]string{"start", "-p", profile, "--wait=true", "--memory=4000", "--alsologtostderr", "--addons=registry", "--addons=registry-creds", "--addons=metrics-server", "--addons=volumesnapshots", "--addons=csi-hostpath-driver", "--addons=gcp-auth", "--addons=cloud-spanner", "--addons=inspektor-gadget", "--addons=nvidia-device-plugin", "--addons=yakd", "--addons=volcano", "--addons=amd-gpu-device-plugin"}, StartArgs()...) + args := append([]string{"start", "-p", profile, "--wait=true", "--memory=4096", "--alsologtostderr", "--addons=registry", "--addons=registry-creds", "--addons=metrics-server", "--addons=volumesnapshots", "--addons=csi-hostpath-driver", "--addons=gcp-auth", "--addons=cloud-spanner", "--addons=inspektor-gadget", "--addons=nvidia-device-plugin", "--addons=yakd", "--addons=volcano", "--addons=amd-gpu-device-plugin"}, StartArgs()...) if !NoneDriver() { args = append(args, "--addons=ingress", "--addons=ingress-dns", "--addons=storage-provisioner-rancher") } diff --git a/test/integration/cert_options_test.go b/test/integration/cert_options_test.go index 101b5c01d3..caedfb13c0 100644 --- a/test/integration/cert_options_test.go +++ b/test/integration/cert_options_test.go @@ -39,7 +39,7 @@ func TestCertOptions(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), Minutes(30)) defer CleanupWithLogs(t, profile, cancel) - args := append([]string{"start", "-p", profile, "--memory=2048", "--apiserver-ips=127.0.0.1", "--apiserver-ips=192.168.15.15", "--apiserver-names=localhost", "--apiserver-names=www.google.com", "--apiserver-port=8555"}, StartArgs()...) + args := append([]string{"start", "-p", profile, "--memory=3072", "--apiserver-ips=127.0.0.1", "--apiserver-ips=192.168.15.15", "--apiserver-names=localhost", "--apiserver-names=www.google.com", "--apiserver-port=8555"}, StartArgs()...) // We can safely override --apiserver-name with if NeedsPortForward() { @@ -118,7 +118,7 @@ func TestCertExpiration(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), Minutes(30)) defer CleanupWithLogs(t, profile, cancel) - args := append([]string{"start", "-p", profile, "--memory=2048", "--cert-expiration=3m"}, StartArgs()...) + args := append([]string{"start", "-p", profile, "--memory=3072", "--cert-expiration=3m"}, StartArgs()...) rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { @@ -127,7 +127,7 @@ func TestCertExpiration(t *testing.T) { // Now wait 3 minutes for the certs to expire and make sure minikube starts properly time.Sleep(time.Minute * 3) - args = append([]string{"start", "-p", profile, "--memory=2048", "--cert-expiration=8760h"}, StartArgs()...) + args = append([]string{"start", "-p", profile, "--memory=3072", "--cert-expiration=8760h"}, StartArgs()...) rr, err = Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Errorf("failed to start minikube after cert expiration: %q : %v", rr.Command(), err) diff --git a/test/integration/docker_test.go b/test/integration/docker_test.go index 71a44c587d..e7afa7c4e8 100644 --- a/test/integration/docker_test.go +++ b/test/integration/docker_test.go @@ -47,7 +47,7 @@ func TestDockerFlags(t *testing.T) { defer CleanupWithLogs(t, profile, cancel) // Use the most verbose logging for the simplest test. If it fails, something is very wrong. - args := append([]string{"start", "-p", profile, "--cache-images=false", "--memory=2048", "--install-addons=false", "--wait=false", "--docker-env=FOO=BAR", "--docker-env=BAZ=BAT", "--docker-opt=debug", "--docker-opt=icc=true", "--alsologtostderr", "-v=5"}, StartArgs()...) + args := append([]string{"start", "-p", profile, "--cache-images=false", "--memory=3072", "--install-addons=false", "--wait=false", "--docker-env=FOO=BAR", "--docker-env=BAZ=BAT", "--docker-opt=debug", "--docker-opt=icc=true", "--alsologtostderr", "-v=5"}, StartArgs()...) rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Errorf("failed to start minikube with args: %q : %v", rr.Command(), err) @@ -87,7 +87,7 @@ func TestForceSystemdFlag(t *testing.T) { defer CleanupWithLogs(t, profile, cancel) // Use the most verbose logging for the simplest test. If it fails, something is very wrong. - args := append([]string{"start", "-p", profile, "--memory=2048", "--force-systemd", "--alsologtostderr", "-v=5"}, StartArgs()...) + args := append([]string{"start", "-p", profile, "--memory=3072", "--force-systemd", "--alsologtostderr", "-v=5"}, StartArgs()...) rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Errorf("failed to start minikube with args: %q : %v", rr.Command(), err) @@ -149,7 +149,7 @@ func TestForceSystemdEnv(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), Minutes(30)) defer CleanupWithLogs(t, profile, cancel) - args := append([]string{"start", "-p", profile, "--memory=2048", "--alsologtostderr", "-v=5"}, StartArgs()...) + args := append([]string{"start", "-p", profile, "--memory=3072", "--alsologtostderr", "-v=5"}, StartArgs()...) cmd := exec.CommandContext(ctx, Target(), args...) cmd.Env = append(os.Environ(), "MINIKUBE_FORCE_SYSTEMD=true") rr, err := Run(t, cmd) diff --git a/test/integration/error_spam_test.go b/test/integration/error_spam_test.go index 8934e7dbd2..bbd7df4d78 100644 --- a/test/integration/error_spam_test.go +++ b/test/integration/error_spam_test.go @@ -76,7 +76,7 @@ func TestErrorSpam(t *testing.T) { t.Run("setup", func(t *testing.T) { // This should likely use multi-node once it's ready // use `--log_dir` flag to run isolated and avoid race condition - ie, failing to clean up (locked) log files created by other concurently-run tests, or counting them in results - args := append([]string{"start", "-p", profile, "-n=1", "--memory=2250", "--wait=false", fmt.Sprintf("--log_dir=%s", logDir)}, StartArgs()...) + args := append([]string{"start", "-p", profile, "-n=1", "--memory=3072", "--wait=false", fmt.Sprintf("--log_dir=%s", logDir)}, StartArgs()...) rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { diff --git a/test/integration/functional_test.go b/test/integration/functional_test.go index 9a36e35c6c..212e1a1026 100644 --- a/test/integration/functional_test.go +++ b/test/integration/functional_test.go @@ -2236,10 +2236,10 @@ func startHTTPProxy(t *testing.T) (*http.Server, error) { func startMinikubeWithProxy(ctx context.Context, t *testing.T, profile string, proxyEnv string, addr string) { // Use more memory so that we may reliably fit MySQL and nginx - memoryFlag := "--memory=4000" + memoryFlag := "--memory=4096" // to avoid failure for mysq/pv on virtualbox on darwin on free github actions, if detect.GithubActionRunner() && VirtualboxDriver() { - memoryFlag = "--memory=6000" + memoryFlag = "--memory=6144" } // passing --api-server-port so later verify it didn't change in soft start. startArgs := append([]string{"start", "-p", profile, memoryFlag, fmt.Sprintf("--apiserver-port=%d", apiPortTest), "--wait=all"}, StartArgsWithContext(ctx)...) diff --git a/test/integration/guest_env_test.go b/test/integration/guest_env_test.go index 34f4c13d6b..90e7dbba3d 100644 --- a/test/integration/guest_env_test.go +++ b/test/integration/guest_env_test.go @@ -22,6 +22,7 @@ import ( "context" "fmt" "os/exec" + "strings" "testing" "k8s.io/minikube/pkg/minikube/vmpath" @@ -36,7 +37,7 @@ func TestGuestEnvironment(t *testing.T) { defer CleanupWithLogs(t, profile, cancel) t.Run("Setup", func(t *testing.T) { - args := append([]string{"start", "-p", profile, "--install-addons=false", "--memory=2048", "--wait=false", "--disable-metrics=true"}, StartArgs()...) + args := append([]string{"start", "-p", profile, "--install-addons=false", "--memory=3072", "--wait=false", "--disable-metrics=true"}, StartArgs()...) rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Errorf("failed to start minikube: args %q: %v", rr.Command(), err) diff --git a/test/integration/gvisor_addon_test.go b/test/integration/gvisor_addon_test.go index 7b9a06b2a6..e594a6cc5c 100644 --- a/test/integration/gvisor_addon_test.go +++ b/test/integration/gvisor_addon_test.go @@ -48,7 +48,7 @@ func TestGvisorAddon(t *testing.T) { CleanupWithLogs(t, profile, cancel) }() - startArgs := append([]string{"start", "-p", profile, "--memory=2200", "--container-runtime=containerd", "--docker-opt", "containerd=/var/run/containerd/containerd.sock"}, StartArgs()...) + startArgs := append([]string{"start", "-p", profile, "--memory=3072", "--container-runtime=containerd", "--docker-opt", "containerd=/var/run/containerd/containerd.sock"}, StartArgs()...) rr, err := Run(t, exec.CommandContext(ctx, Target(), startArgs...)) if err != nil { t.Fatalf("failed to start minikube: args %q: %v", rr.Command(), err) diff --git a/test/integration/ha_test.go b/test/integration/ha_test.go index 02c5a55889..1d0a9ca2be 100644 --- a/test/integration/ha_test.go +++ b/test/integration/ha_test.go @@ -97,7 +97,7 @@ func TestMultiControlPlane(t *testing.T) { // validateHAStartCluster ensures ha (multi-control plane) cluster can start. func validateHAStartCluster(ctx context.Context, t *testing.T, profile string) { // start ha (multi-control plane) cluster - startArgs := append([]string{"-p", profile, "start", "--ha", "--memory", "2200", "--wait", "true", "--alsologtostderr", "-v", "5"}, StartArgs()...) + startArgs := append([]string{"-p", profile, "start", "--ha", "--memory", "3072", "--wait", "true", "--alsologtostderr", "-v", "5"}, StartArgs()...) rr, err := Run(t, exec.CommandContext(ctx, Target(), startArgs...)) if err != nil { t.Fatalf("failed to fresh-start ha (multi-control plane) cluster. args %q : %v", rr.Command(), err) diff --git a/test/integration/json_output_test.go b/test/integration/json_output_test.go index 12e2a18dff..5e0924eb46 100644 --- a/test/integration/json_output_test.go +++ b/test/integration/json_output_test.go @@ -43,7 +43,7 @@ func TestJSONOutput(t *testing.T) { }{ { command: "start", - args: append([]string{"--memory=2200", "--wait=true"}, StartArgs()...), + args: append([]string{"--memory=3072", "--wait=true"}, StartArgs()...), }, { command: "pause", }, { @@ -155,7 +155,7 @@ func TestErrorJSONOutput(t *testing.T) { // force a failure via --driver=fail so that we can make sure errors // are printed as expected - startArgs := []string{"start", "-p", profile, "--memory=2200", "--output=json", "--wait=true", "--driver=fail"} + startArgs := []string{"start", "-p", profile, "--memory=3072", "--output=json", "--wait=true", "--driver=fail"} rr, err := Run(t, exec.CommandContext(ctx, Target(), startArgs...)) if err == nil { diff --git a/test/integration/mount_start_test.go b/test/integration/mount_start_test.go index 4425d0519d..1d6e56910d 100644 --- a/test/integration/mount_start_test.go +++ b/test/integration/mount_start_test.go @@ -93,7 +93,7 @@ func validateStartWithMount(ctx context.Context, t *testing.T, profile string) { // We have to increment this because if you have two mounts with the same port, when you kill one cluster the mount will break for the other mountStartPort++ - args := []string{"start", "-p", profile, "--memory=2048", "--mount", "--mount-gid", mountGID, "--mount-msize", mountMSize, "--mount-port", mountPort(), "--mount-uid", mountUID, "--no-kubernetes"} + args := []string{"start", "-p", profile, "--memory=3072", "--mount", "--mount-gid", mountGID, "--mount-msize", mountMSize, "--mount-port", mountPort(), "--mount-uid", mountUID, "--no-kubernetes"} args = append(args, StartArgs()...) rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { diff --git a/test/integration/multinode_test.go b/test/integration/multinode_test.go index 89696e7995..a3f190ca03 100644 --- a/test/integration/multinode_test.go +++ b/test/integration/multinode_test.go @@ -92,7 +92,7 @@ func TestMultiNode(t *testing.T) { // validateMultiNodeStart makes sure a 2 node cluster can start func validateMultiNodeStart(ctx context.Context, t *testing.T, profile string) { // Start a 2 node cluster with the --nodes param - startArgs := append([]string{"start", "-p", profile, "--wait=true", "--memory=2200", "--nodes=2", "-v=5", "--alsologtostderr"}, StartArgs()...) + startArgs := append([]string{"start", "-p", profile, "--wait=true", "--memory=3072", "--nodes=2", "-v=5", "--alsologtostderr"}, StartArgs()...) rr, err := Run(t, exec.CommandContext(ctx, Target(), startArgs...)) if err != nil { t.Fatalf("failed to start cluster. args %q : %v", rr.Command(), err) diff --git a/test/integration/net_test.go b/test/integration/net_test.go index 41b0284423..0084404321 100644 --- a/test/integration/net_test.go +++ b/test/integration/net_test.go @@ -239,7 +239,7 @@ func validateFalseCNI(ctx context.Context, t *testing.T, profile string) { cr = "crio" } - startArgs := []string{"start", "-p", profile, "--memory=2048", "--alsologtostderr", "--cni=false"} + startArgs := []string{"start", "-p", profile, "--memory=3072", "--alsologtostderr", "--cni=false"} startArgs = append(startArgs, StartArgs()...) mkCmd := exec.CommandContext(ctx, Target(), startArgs...) diff --git a/test/integration/no_kubernetes_test.go b/test/integration/no_kubernetes_test.go index e4458b1feb..7b5b86c32a 100644 --- a/test/integration/no_kubernetes_test.go +++ b/test/integration/no_kubernetes_test.go @@ -91,7 +91,7 @@ func validateStartWithK8S(ctx context.Context, t *testing.T, profile string) { defer PostMortemLogs(t, profile) // docs: start minikube with Kubernetes. - args := append([]string{"start", "-p", profile}, StartArgs()...) + args := append([]string{"start", "-p", profile, "--memory=3072", "--alsologtostderr", "-v=5"}, StartArgs()...) rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Fatalf("failed to start minikube with args: %q : %v", rr.Command(), err) @@ -108,7 +108,7 @@ func validateStartWithStopK8s(ctx context.Context, t *testing.T, profile string) defer PostMortemLogs(t, profile) // docs: start minikube with no Kubernetes. - args := append([]string{"start", "-p", profile, "--no-kubernetes"}, StartArgs()...) + args := append([]string{"start", "-p", profile, "--no-kubernetes", "--memory=3072", "--alsologtostderr", "-v=5"}, StartArgs()...) rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Fatalf("failed to start minikube with args: %q : %v", rr.Command(), err) @@ -132,7 +132,7 @@ func validateStartNoK8S(ctx context.Context, t *testing.T, profile string) { defer PostMortemLogs(t, profile) // docs: start minikube with no Kubernetes. - args := append([]string{"start", "-p", profile, "--no-kubernetes"}, StartArgs()...) + args := append([]string{"start", "-p", profile, "--no-kubernetes", "--memory=3072", "--alsologtostderr", "-v=5"}, StartArgs()...) rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Fatalf("failed to start minikube with args: %q : %v", rr.Command(), err) diff --git a/test/integration/pause_test.go b/test/integration/pause_test.go index f6626ce6cf..2d3d54e85f 100644 --- a/test/integration/pause_test.go +++ b/test/integration/pause_test.go @@ -76,7 +76,7 @@ func TestPause(t *testing.T) { func validateFreshStart(ctx context.Context, t *testing.T, profile string) { defer PostMortemLogs(t, profile) - args := append([]string{"start", "-p", profile, "--memory=2048", "--install-addons=false", "--wait=all"}, StartArgs()...) + args := append([]string{"start", "-p", profile, "--memory=3072", "--install-addons=false", "--wait=all"}, StartArgs()...) rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Fatalf("failed to start minikube with args: %q : %v", rr.Command(), err) diff --git a/test/integration/preload_test.go b/test/integration/preload_test.go index 298c76cfed..59c9b73b2d 100644 --- a/test/integration/preload_test.go +++ b/test/integration/preload_test.go @@ -36,7 +36,7 @@ func TestPreload(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), Minutes(40)) defer CleanupWithLogs(t, profile, cancel) - startArgs := []string{"start", "-p", profile, "--memory=2200", "--alsologtostderr", "--wait=true", "--preload=false"} + startArgs := []string{"start", "-p", profile, "--memory=3072", "--alsologtostderr", "--wait=true", "--preload=false"} startArgs = append(startArgs, StartArgs()...) k8sVersion := "v1.24.4" startArgs = append(startArgs, fmt.Sprintf("--kubernetes-version=%s", k8sVersion)) @@ -61,7 +61,7 @@ func TestPreload(t *testing.T) { } // re-start the cluster and check if image is preserved - startArgs = []string{"start", "-p", profile, "--memory=2200", "--alsologtostderr", "-v=1", "--wait=true"} + startArgs = []string{"start", "-p", profile, "--memory=3072", "--alsologtostderr", "-v=1", "--wait=true"} startArgs = append(startArgs, StartArgs()...) rr, err = Run(t, exec.CommandContext(ctx, Target(), startArgs...)) if err != nil { diff --git a/test/integration/scheduled_stop_test.go b/test/integration/scheduled_stop_test.go index 49067c2e99..2b0181be2e 100644 --- a/test/integration/scheduled_stop_test.go +++ b/test/integration/scheduled_stop_test.go @@ -124,7 +124,7 @@ func TestScheduledStopUnix(t *testing.T) { } func startMinikube(ctx context.Context, t *testing.T, profile string) { - args := append([]string{"start", "-p", profile, "--memory=2048"}, StartArgs()...) + args := append([]string{"start", "-p", profile, "--memory=3072"}, StartArgs()...) rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Fatalf("starting minikube: %v\n%s", err, rr.Output()) diff --git a/test/integration/skaffold_test.go b/test/integration/skaffold_test.go index a407426d5e..159a412999 100644 --- a/test/integration/skaffold_test.go +++ b/test/integration/skaffold_test.go @@ -62,7 +62,7 @@ func TestSkaffold(t *testing.T) { } t.Logf("skaffold version: %s", rr.Stdout.Bytes()) - args := append([]string{"start", "-p", profile, "--memory=2600"}, StartArgs()...) + args := append([]string{"start", "-p", profile, "--memory=3072"}, StartArgs()...) rr, err = Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Fatalf("starting minikube: %v\n%s", err, rr.Output()) diff --git a/test/integration/start_stop_delete_test.go b/test/integration/start_stop_delete_test.go index 84e20cce3b..716bb1e42b 100644 --- a/test/integration/start_stop_delete_test.go +++ b/test/integration/start_stop_delete_test.go @@ -106,7 +106,7 @@ func TestStartStop(t *testing.T) { waitFlag = "--wait=apiserver,system_pods,default_sa" } - startArgs := append([]string{"start", "-p", profile, "--memory=2200", "--alsologtostderr", waitFlag}, tc.args...) + startArgs := append([]string{"start", "-p", profile, "--memory=3072", "--alsologtostderr", waitFlag}, tc.args...) startArgs = append(startArgs, StartArgs()...) startArgs = append(startArgs, fmt.Sprintf("--kubernetes-version=%s", tc.version)) diff --git a/test/integration/status_test.go b/test/integration/status_test.go index 5dd168b3a2..95108edb3a 100644 --- a/test/integration/status_test.go +++ b/test/integration/status_test.go @@ -41,7 +41,7 @@ func TestInsufficientStorage(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), Minutes(5)) defer Cleanup(t, profile, cancel) - startArgs := []string{"start", "-p", profile, "--memory=2048", "--output=json", "--wait=true"} + startArgs := []string{"start", "-p", profile, "--memory=3072", "--output=json", "--wait=true"} startArgs = append(startArgs, StartArgs()...) c := exec.CommandContext(ctx, Target(), startArgs...) // artificially set /var to 100% capacity diff --git a/test/integration/version_upgrade_test.go b/test/integration/version_upgrade_test.go index 3b9bc3633d..6c91bc6040 100644 --- a/test/integration/version_upgrade_test.go +++ b/test/integration/version_upgrade_test.go @@ -95,7 +95,7 @@ func TestRunningBinaryUpgrade(t *testing.T) { } defer os.Remove(tf.Name()) - args := append([]string{"start", "-p", profile, "--memory=2200"}, legacyStartArgs()...) + args := append([]string{"start", "-p", profile, "--memory=3072"}, legacyStartArgs()...) rr := &RunResult{} r := func() error { c := exec.CommandContext(ctx, tf.Name(), args...) @@ -126,7 +126,7 @@ func TestRunningBinaryUpgrade(t *testing.T) { t.Fatalf("legacy %s start failed: %v", desiredLegacyVersion, err) } - args = append([]string{"start", "-p", profile, "--memory=2200", "--alsologtostderr", "-v=1"}, StartArgs()...) + args = append([]string{"start", "-p", profile, "--memory=3072", "--alsologtostderr", "-v=1"}, StartArgs()...) rr, err = Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Fatalf("upgrade from %s to HEAD failed: %s: %v", desiredLegacyVersion, rr.Command(), err) @@ -158,7 +158,7 @@ func TestStoppedBinaryUpgrade(t *testing.T) { defer os.Remove(tf.Name()) t.Run("Upgrade", func(t *testing.T) { - args := append([]string{"start", "-p", profile, "--memory=2200"}, legacyStartArgs()...) + args := append([]string{"start", "-p", profile, "--memory=3072"}, legacyStartArgs()...) rr := &RunResult{} r := func() error { c := exec.CommandContext(ctx, tf.Name(), args...) @@ -194,7 +194,7 @@ func TestStoppedBinaryUpgrade(t *testing.T) { t.Errorf("failed to stop cluster: %s: %v", rr.Command(), err) } - args = append([]string{"start", "-p", profile, "--memory=2200", "--alsologtostderr", "-v=1"}, StartArgs()...) + args = append([]string{"start", "-p", profile, "--memory=3072", "--alsologtostderr", "-v=1"}, StartArgs()...) rr, err = Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Fatalf("upgrade from %s to HEAD failed: %s: %v", desiredLegacyVersion, rr.Command(), err) @@ -218,7 +218,7 @@ func TestKubernetesUpgrade(t *testing.T) { defer CleanupWithLogs(t, profile, cancel) - args := append([]string{"start", "-p", profile, "--memory=2200", fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion), "--alsologtostderr", "-v=1"}, StartArgs()...) + args := append([]string{"start", "-p", profile, "--memory=3072", fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion), "--alsologtostderr", "-v=1"}, StartArgs()...) rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Errorf("failed to start minikube HEAD with oldest k8s version: %s: %v", rr.Command(), err) @@ -239,7 +239,7 @@ func TestKubernetesUpgrade(t *testing.T) { t.Errorf("FAILED: status = %q; want = %q", got, state.Stopped.String()) } - args = append([]string{"start", "-p", profile, "--memory=2200", fmt.Sprintf("--kubernetes-version=%s", constants.NewestKubernetesVersion), "--alsologtostderr", "-v=1"}, StartArgs()...) + args = append([]string{"start", "-p", profile, "--memory=3072", fmt.Sprintf("--kubernetes-version=%s", constants.NewestKubernetesVersion), "--alsologtostderr", "-v=1"}, StartArgs()...) rr, err = Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Errorf("failed to upgrade with newest k8s version. args: %s : %v", rr.Command(), err) @@ -265,13 +265,13 @@ func TestKubernetesUpgrade(t *testing.T) { } t.Logf("Attempting to downgrade Kubernetes (should fail)") - args = append([]string{"start", "-p", profile, "--memory=2200", fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion)}, StartArgs()...) + args = append([]string{"start", "-p", profile, "--memory=3072", fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion)}, StartArgs()...) if rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)); err == nil { t.Fatalf("downgrading Kubernetes should not be allowed. expected to see error but got %v for %q", err, rr.Command()) } t.Logf("Attempting restart after unsuccessful downgrade") - args = append([]string{"start", "-p", profile, "--memory=2200", fmt.Sprintf("--kubernetes-version=%s", constants.NewestKubernetesVersion), "--alsologtostderr", "-v=1"}, StartArgs()...) + args = append([]string{"start", "-p", profile, "--memory=3072", fmt.Sprintf("--kubernetes-version=%s", constants.NewestKubernetesVersion), "--alsologtostderr", "-v=1"}, StartArgs()...) rr, err = Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Errorf("start after failed upgrade: %s: %v", rr.Command(), err) @@ -303,7 +303,7 @@ func TestMissingContainerUpgrade(t *testing.T) { } defer os.Remove(tf.Name()) - args := append([]string{"start", "-p", profile, "--memory=2200"}, StartArgs()...) + args := append([]string{"start", "-p", profile, "--memory=3072"}, StartArgs()...) rr := &RunResult{} r := func() error { rr, err = Run(t, exec.CommandContext(ctx, tf.Name(), args...)) @@ -325,7 +325,7 @@ func TestMissingContainerUpgrade(t *testing.T) { t.Fatalf("%s failed: %v", rr.Command(), err) } - args = append([]string{"start", "-p", profile, "--memory=2200", "--alsologtostderr", "-v=1"}, StartArgs()...) + args = append([]string{"start", "-p", profile, "--memory=3072", "--alsologtostderr", "-v=1"}, StartArgs()...) rr, err = Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Errorf("failed missing container upgrade from %s. args: %s : %v", legacyVersion, rr.Command(), err) From 4bca65a646529fc8c43e9b80fb8922fe0ebfc8cf Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Tue, 3 Jun 2025 15:27:30 -0700 Subject: [PATCH 20/60] CI: Update gh from 2.73.0 to 2.74.0 (#20867) --- hack/jenkins/installers/check_install_gh.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/jenkins/installers/check_install_gh.sh b/hack/jenkins/installers/check_install_gh.sh index 11281eec05..01a509f8d1 100755 --- a/hack/jenkins/installers/check_install_gh.sh +++ b/hack/jenkins/installers/check_install_gh.sh @@ -16,7 +16,7 @@ set -eux -o pipefail -GH_VERSION="2.73.0" +GH_VERSION="2.74.0" echo "Installing latest version of gh" curl -qLO "https://github.com/cli/cli/releases/download/v${GH_VERSION}/gh_${GH_VERSION}_linux_amd64.tar.gz" From 945b43609c4a42547c3e713989d8c22834b75e47 Mon Sep 17 00:00:00 2001 From: Predrag Rogic Date: Wed, 4 Jun 2025 19:31:39 +0100 Subject: [PATCH 21/60] don't call startKicServiceTunnel for non-kic drivers (#20863) * don't call startKicServiceTunnel for non-kic drivers * warn about exposing ClusterIP services for all drivers --- cmd/minikube/cmd/service.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/cmd/minikube/cmd/service.go b/cmd/minikube/cmd/service.go index b0dfa558ec..32fe90c0ef 100644 --- a/cmd/minikube/cmd/service.go +++ b/cmd/minikube/cmd/service.go @@ -163,18 +163,20 @@ You may select another namespace by using 'minikube service {{.service}} -n 0 { out.WarningT("Services {{.svc_names}} have type \"ClusterIP\" not meant to be exposed, however for local development minikube allows you to access this !", out.V{"svc_names": noNodePortSvcNames}) } - if driver.NeedsPortForward(co.Config.Driver) && services != nil { - startKicServiceTunnel(services, cname, co.Config.Driver) + if driver.NeedsPortForward(co.Config.Driver) { + svcs := services + if len(svcs) == 0 && len(noNodePortServices) > 0 { + svcs = noNodePortServices + } + if len(svcs) > 0 { + startKicServiceTunnel(svcs, cname, co.Config.Driver) + } } else if !serviceURLMode { openURLs(data) - if len(noNodePortServices) != 0 { - startKicServiceTunnel(noNodePortServices, cname, co.Config.Driver) - } - } }, } From 60212f165f933e3979e3c9ab498faca3669f3915 Mon Sep 17 00:00:00 2001 From: Andres Morey Date: Thu, 5 Jun 2025 20:39:36 +0300 Subject: [PATCH 22/60] new: add kubetail addon (#20345) Signed-off-by: Andres Morey --- deploy/addons/assets.go | 4 + deploy/addons/kubetail/kubetail-cli.yaml | 54 ++++ .../kubetail/kubetail-cluster-agent.yaml.tmpl | 175 ++++++++++++ .../kubetail/kubetail-cluster-api.yaml.tmpl | 238 ++++++++++++++++ .../kubetail/kubetail-dashboard.yaml.tmpl | 254 ++++++++++++++++++ .../addons/kubetail/kubetail-namespace.yaml | 7 + pkg/addons/config.go | 5 + pkg/minikube/assets/addons.go | 15 ++ 8 files changed, 752 insertions(+) create mode 100644 deploy/addons/kubetail/kubetail-cli.yaml create mode 100644 deploy/addons/kubetail/kubetail-cluster-agent.yaml.tmpl create mode 100644 deploy/addons/kubetail/kubetail-cluster-api.yaml.tmpl create mode 100644 deploy/addons/kubetail/kubetail-dashboard.yaml.tmpl create mode 100644 deploy/addons/kubetail/kubetail-namespace.yaml diff --git a/deploy/addons/assets.go b/deploy/addons/assets.go index f1db9821c5..b2e6fbdee0 100644 --- a/deploy/addons/assets.go +++ b/deploy/addons/assets.go @@ -178,4 +178,8 @@ var ( // YakdAssets assets for yakd addon //go:embed yakd/*.yaml yakd/*.tmpl YakdAssets embed.FS + + // Kubetail assets for kubetail addon + //go:embed kubetail/*.yaml kubetail/*.tmpl + KubetailAssets embed.FS ) diff --git a/deploy/addons/kubetail/kubetail-cli.yaml b/deploy/addons/kubetail/kubetail-cli.yaml new file mode 100644 index 0000000000..7b1f917455 --- /dev/null +++ b/deploy/addons/kubetail/kubetail-cli.yaml @@ -0,0 +1,54 @@ +kind: ServiceAccount +apiVersion: v1 +metadata: + name: kubetail-cli + namespace: kubetail-system + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cli +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: kubetail-cli + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cli +rules: +- apiGroups: [""] + resources: [nodes] + verbs: [get, list, watch] +- apiGroups: ["", apps, batch] + resources: [cronjobs, daemonsets, deployments, jobs, pods, replicasets, statefulsets] + verbs: [get, list, watch] +- apiGroups: [""] + resources: [pods/log] + verbs: [list, watch] +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: kubetail-cli + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cli +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: kubetail-cli +subjects: +- kind: ServiceAccount + name: kubetail-cli + namespace: kubetail-system diff --git a/deploy/addons/kubetail/kubetail-cluster-agent.yaml.tmpl b/deploy/addons/kubetail/kubetail-cluster-agent.yaml.tmpl new file mode 100644 index 0000000000..d493079e81 --- /dev/null +++ b/deploy/addons/kubetail/kubetail-cluster-agent.yaml.tmpl @@ -0,0 +1,175 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: kubetail-cluster-agent + namespace: kubetail-system + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-agent +data: + config.yaml: | + cluster-agent: + addr: :50051 + logging: + enabled: true + format: json + level: info + tls: + cert-file: null + enabled: false + key-file: null +--- +kind: ServiceAccount +apiVersion: v1 +automountServiceAccountToken: true +metadata: + name: kubetail-cluster-agent + namespace: kubetail-system + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-agent +--- +kind: DaemonSet +apiVersion: apps/v1 +metadata: + name: kubetail-cluster-agent + namespace: kubetail-system + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-agent +spec: + selector: + matchLabels: + app.kubernetes.io/name: kubetail + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-agent + template: + metadata: + labels: + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-agent + spec: + automountServiceAccountToken: true + serviceAccountName: kubetail-cluster-agent + securityContext: + fsGroup: 0 + containers: + - name: kubetail-cluster-agent + image: {{.CustomRegistries.Kubetail | default .ImageRepository | default .Registries.Kubetail }}{{.Images.KubetailClusterAgent}} + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - DAC_READ_SEARCH + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 1000 + runAsUser: 1000 + imagePullPolicy: IfNotPresent + args: + - --config=/etc/kubetail/config.yaml + ports: + - name: grpc + protocol: TCP + containerPort: 50051 + livenessProbe: + grpc: + port: 50051 + initialDelaySeconds: 5 + timeoutSeconds: 30 + periodSeconds: 3 + failureThreshold: 3 + readinessProbe: + grpc: + port: 50051 + initialDelaySeconds: 5 + timeoutSeconds: 30 + periodSeconds: 3 + failureThreshold: 3 + volumeMounts: + - name: config + mountPath: /etc/kubetail + readOnly: true + - name: varlog + mountPath: /var/log + readOnly: true + - name: varlibdockercontainers + mountPath: /var/lib/docker/containers + readOnly: true + volumes: + - name: config + configMap: + name: kubetail-cluster-agent + - name: varlog + hostPath: + path: /var/log + - name: varlibdockercontainers + hostPath: + path: /var/lib/docker/containers + tolerations: + - effect: NoSchedule + key: node-role.kubernetes.io/master + operator: Exists + - effect: NoSchedule + key: node-role.kubernetes.io/control-plane + operator: Exists +--- +kind: Service +apiVersion: v1 +metadata: + name: kubetail-cluster-agent + namespace: kubetail-system + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-agent +spec: + clusterIP: None + selector: + app.kubernetes.io/name: kubetail + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-agent +--- +kind: NetworkPolicy +apiVersion: networking.k8s.io/v1 +metadata: + name: kubetail-cluster-agent + namespace: kubetail-system + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-agent +spec: + podSelector: + matchLabels: + app.kubernetes.io/name: kubetail + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-agent + ingress: + - from: + - podSelector: + matchLabels: + app.kubernetes.io/name: kubetail + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-api diff --git a/deploy/addons/kubetail/kubetail-cluster-api.yaml.tmpl b/deploy/addons/kubetail/kubetail-cluster-api.yaml.tmpl new file mode 100644 index 0000000000..ae7609bdd6 --- /dev/null +++ b/deploy/addons/kubetail/kubetail-cluster-api.yaml.tmpl @@ -0,0 +1,238 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: kubetail-cluster-api + namespace: kubetail-system + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-api +data: + config.yaml: | + cluster-api: + addr: :8080 + cluster-agent-dispatch-url: "kubernetes://kubetail-cluster-agent:50051" + base-path: / + csrf: + cookie: + domain: null + http-only: true + max-age: 43200 + name: kubetail_cluster_api_csrf + path: / + same-site: strict + secure: false + enabled: true + field-name: csrf_token + secret: ${KUBETAIL_CLUSTER_API_CSRF_SECRET} + gin-mode: release + logging: + access-log: + enabled: true + hide-health-checks: true + enabled: true + format: json + level: info + tls: + cert-file: null + enabled: false + key-file: null +--- +kind: ServiceAccount +apiVersion: v1 +automountServiceAccountToken: true +metadata: + name: kubetail-cluster-api + namespace: kubetail-system + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: "kubetail" + app.kubernetes.io/component: "cluster-api" +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: kubetail-cluster-api + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-api +rules: +- apiGroups: [""] + resources: [nodes] + verbs: [get, list, watch] +- apiGroups: ["", apps, batch] + resources: [cronjobs, daemonsets, deployments, jobs, pods, replicasets, statefulsets] + verbs: [get, list, watch] +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: kubetail-cluster-api + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-api +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: kubetail-cluster-api +subjects: +- kind: ServiceAccount + name: kubetail-cluster-api + namespace: kubetail-system +--- +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + namespace: kubetail-system + name: kubetail-cluster-api + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-api +rules: +- apiGroups: [discovery.k8s.io] + resources: [endpointslices] + verbs: [list, watch] +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + namespace: kubetail-system + name: kubetail-cluster-api + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-api +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: kubetail-cluster-api +subjects: +- kind: ServiceAccount + name: kubetail-cluster-api + namespace: kubetail-system +--- +kind: Deployment +apiVersion: apps/v1 +metadata: + name: kubetail-cluster-api + namespace: kubetail-system + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-api +spec: + replicas: 1 + revisionHistoryLimit: 5 + selector: + matchLabels: + app.kubernetes.io/name: kubetail + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-api + strategy: + type: RollingUpdate + template: + metadata: + labels: + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-api + spec: + automountServiceAccountToken: true + serviceAccountName: kubetail-cluster-api + containers: + - name: kubetail-cluster-api + image: {{.CustomRegistries.Kubetail | default .ImageRepository | default .Registries.Kubetail }}{{.Images.KubetailClusterAPI}} + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 1000 + runAsUser: 1000 + imagePullPolicy: IfNotPresent + env: + - name: KUBETAIL_CLUSTER_API_CSRF_SECRET + value: "DUMMY" + args: + - --config=/etc/kubetail/config.yaml + ports: + - name: http + protocol: TCP + containerPort: 8080 + livenessProbe: + httpGet: + scheme: HTTP + path: /healthz + port: http + initialDelaySeconds: 30 + timeoutSeconds: 30 + periodSeconds: 10 + failureThreshold: 3 + readinessProbe: + httpGet: + scheme: HTTP + path: /healthz + port: http + initialDelaySeconds: 30 + timeoutSeconds: 30 + periodSeconds: 10 + failureThreshold: 3 + volumeMounts: + - name: config + mountPath: /etc/kubetail + readOnly: true + volumes: + - name: config + configMap: + name: kubetail-cluster-api +--- +kind: Service +apiVersion: v1 +metadata: + name: kubetail-cluster-api + namespace: kubetail-system + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-api +spec: + type: ClusterIP + selector: + app.kubernetes.io/name: kubetail + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: cluster-api + ports: + - name: http + protocol: TCP + port: 8080 + targetPort: http + appProtocol: http diff --git a/deploy/addons/kubetail/kubetail-dashboard.yaml.tmpl b/deploy/addons/kubetail/kubetail-dashboard.yaml.tmpl new file mode 100644 index 0000000000..73220dba91 --- /dev/null +++ b/deploy/addons/kubetail/kubetail-dashboard.yaml.tmpl @@ -0,0 +1,254 @@ +kind: ConfigMap +apiVersion: v1 +metadata: + name: kubetail-dashboard + namespace: kubetail-system + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: dashboard +data: + config.yaml: | + dashboard: + addr: :8080 + auth-mode: auto + cluster-api-endpoint: "http://kubetail-cluster-api:8080" + environment: cluster + ui: + cluster-api-enabled: true + base-path: / + csrf: + cookie: + domain: null + http-only: true + max-age: 43200 + name: kubetail_dashhboard_csrf + path: / + same-site: strict + secure: false + enabled: true + field-name: csrf_token + secret: ${KUBETAIL_DASHBOARD_CSRF_SECRET} + gin-mode: release + logging: + access-log: + enabled: true + hide-health-checks: true + enabled: true + format: json + level: info + session: + cookie: + domain: null + http-only: true + max-age: 1092000 + name: kubetail_dashboard_session + path: / + same-site: lax + secure: false + secret: ${KUBETAIL_DASHBOARD_SESSION_SECRET} + tls: + cert-file: null + enabled: false + key-file: null +--- +kind: ServiceAccount +apiVersion: v1 +automountServiceAccountToken: true +metadata: + name: kubetail-dashboard + namespace: kubetail-system + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: dashboard +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: kubetail-dashboard + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: dashboard +rules: +- apiGroups: [""] + resources: [namespaces, nodes] + verbs: [get, list, watch] +- apiGroups: ["", apps, batch] + resources: [cronjobs, daemonsets, deployments, jobs, pods, pods/log, replicasets, statefulsets] + verbs: [get, list, watch] +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: kubetail-dashboard + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: dashboard +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: kubetail-dashboard +subjects: +- kind: ServiceAccount + name: kubetail-dashboard + namespace: kubetail-system +--- +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + namespace: kubetail-system + name: kubetail-dashboard + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: dashboard +rules: +- apiGroups: [discovery.k8s.io] + resources: [endpointslices] + verbs: [list, watch] +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + namespace: kubetail-system + name: kubetail-dashboard + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: dashboard +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: kubetail-dashboard +subjects: +- kind: ServiceAccount + name: kubetail-dashboard + namespace: kubetail-system +--- +kind: Deployment +apiVersion: apps/v1 +metadata: + name: kubetail-dashboard + namespace: kubetail-system + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: dashboard +spec: + replicas: 1 + revisionHistoryLimit: 5 + selector: + matchLabels: + app.kubernetes.io/name: kubetail + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: dashboard + strategy: + type: RollingUpdate + template: + metadata: + labels: + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: dashboard + spec: + automountServiceAccountToken: true + serviceAccountName: kubetail-dashboard + containers: + - name: kubetail-dashboard + image: {{.CustomRegistries.Kubetail | default .ImageRepository | default .Registries.Kubetail }}{{.Images.KubetailDashboard}} + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 1000 + runAsUser: 1000 + imagePullPolicy: IfNotPresent + env: + - name: KUBETAIL_DASHBOARD_CSRF_SECRET + value: "DUMMY" + - name: KUBETAIL_DASHBOARD_SESSION_SECRET + value: "DUMMY" + args: + - --config=/etc/kubetail/config.yaml + ports: + - name: http + protocol: TCP + containerPort: 8080 + livenessProbe: + httpGet: + scheme: HTTP + path: /healthz + port: http + initialDelaySeconds: 30 + timeoutSeconds: 30 + periodSeconds: 10 + failureThreshold: 3 + readinessProbe: + httpGet: + scheme: HTTP + path: /healthz + port: http + initialDelaySeconds: 30 + timeoutSeconds: 30 + periodSeconds: 10 + failureThreshold: 3 + volumeMounts: + - name: config + mountPath: /etc/kubetail + readOnly: true + volumes: + - name: config + configMap: + name: kubetail-dashboard +--- +kind: Service +apiVersion: v1 +metadata: + name: kubetail-dashboard + namespace: kubetail-system + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile + app.kubernetes.io/name: kubetail + app.kubernetes.io/version: "0.11.5" + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: dashboard +spec: + type: ClusterIP + selector: + app.kubernetes.io/name: kubetail + app.kubernetes.io/instance: kubetail + app.kubernetes.io/component: dashboard + ports: + - name: http + protocol: TCP + port: 8080 + targetPort: http + appProtocol: http diff --git a/deploy/addons/kubetail/kubetail-namespace.yaml b/deploy/addons/kubetail/kubetail-namespace.yaml new file mode 100644 index 0000000000..296ce9846a --- /dev/null +++ b/deploy/addons/kubetail/kubetail-namespace.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: kubetail-system + labels: + kubernetes.io/minikube-addons: kubetail + addonmanager.kubernetes.io/mode: Reconcile diff --git a/pkg/addons/config.go b/pkg/addons/config.go index 5ca855a6bd..dafb8ad723 100644 --- a/pkg/addons/config.go +++ b/pkg/addons/config.go @@ -104,6 +104,11 @@ var Addons = []*Addon{ set: SetBool, callbacks: []setFn{EnableOrDisableAddon}, }, + { + name: "kubetail", + set: SetBool, + callbacks: []setFn{EnableOrDisableAddon}, + }, { name: "kubevirt", set: SetBool, diff --git a/pkg/minikube/assets/addons.go b/pkg/minikube/assets/addons.go index e1815c3c07..3a6b0762e1 100644 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -798,6 +798,21 @@ var Addons = map[string]*Addon{ map[string]string{ "Yakd": "docker.io", }), + "kubetail": NewAddon([]*BinAsset{ + MustBinAsset(addons.KubetailAssets, "kubetail/kubetail-namespace.yaml", vmpath.GuestAddonsDir, "kubetail-namespace.yaml", "0640"), + MustBinAsset(addons.KubetailAssets, "kubetail/kubetail-dashboard.yaml.tmpl", vmpath.GuestAddonsDir, "kubetail-dashboard.yaml", "0640"), + MustBinAsset(addons.KubetailAssets, "kubetail/kubetail-cluster-api.yaml.tmpl", vmpath.GuestAddonsDir, "kubetail-cluster-api.yaml", "0640"), + MustBinAsset(addons.KubetailAssets, "kubetail/kubetail-cluster-agent.yaml.tmpl", vmpath.GuestAddonsDir, "kubetail-cluster-agent.yaml", "0640"), + MustBinAsset(addons.KubetailAssets, "kubetail/kubetail-cli.yaml", vmpath.GuestAddonsDir, "kubetail-cli.yaml", "0640"), + }, false, "kubetail", "3rd party (kubetail.com)", "amorey", "https://minikube.sigs.k8s.io/docs/handbook/addons/kubetail/", + map[string]string{ + "KubetailDashboard": "kubetail/kubetail-dashboard:0.6.0@sha256:fc8d01805c09f2ad3f5a2c94016e399ece4c03ff7275dc007a213281087490ac", + "KubetailClusterAPI": "kubetail/kubetail-cluster-api:0.4.0@sha256:fec3154c589a31493f14ca5ecbbc48d3ad7bab6b5e30dcddabc2457bd297dae7", + "KubetailClusterAgent": "kubetail/kubetail-cluster-agent:0.4.0@sha256:5363ca1a5394943aa6bf4c160860a8dc616c3e939d2006cfa902f8863e182bae", + }, + map[string]string{ + "Kubetail": "docker.io", + }), } // parseMapString creates a map based on `str` which is encoded as =,=,... From da0839e79d4d1767f70b4fe9b8fd5141de99001b Mon Sep 17 00:00:00 2001 From: Nir Soffer Date: Thu, 5 Jun 2025 20:54:58 +0300 Subject: [PATCH 23/60] iso: Fix console for vfkit/krunkit (#20832) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * iso: Fix console for vfkit/krunkit The serial console name depends on the driver. We had setting for qemu that does not work for vfkit and krunkit, breaking boot from minikube iso. Fixed by using 2 console= options, one is known to work for qemu, and one for vfkit and krunkit. With this we can use the same iso image with qemu, vfkit, and krunkit. This will allow simplifying vfkit driver. Previously we had to extract the kernel and initrd and start it using the legacy --kernel, --kernel-cmdline and --initrd options. I tested this by building the iso with this fix and running with --iso-url. Example run with qemu: % minikube start -p qemu --driver qemu --container-runtime containerd \ --iso-url file://$PWD/minikube-arm64.iso 😄 [qemu] minikube v1.36.0 on Darwin 15.5 (arm64) ✨ Using the qemu2 driver based on user configuration 🌐 Automatically selected the socket_vmnet network 👍 Starting "qemu" primary control-plane node in "qemu" cluster 🔥 Creating qemu2 VM (CPUs=2, Memory=6000MB, Disk=20000MB) ... 📦 Preparing Kubernetes v1.33.1 on containerd 1.7.23 ... ▪ Generating certificates and keys ... ▪ Booting up control plane ... ▪ Configuring RBAC rules ... 🔗 Configuring bridge CNI (Container Networking Interface) ... 🔎 Verifying Kubernetes components... ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5 🌟 Enabled addons: default-storageclass, storage-provisioner 🏄 Done! kubectl is now configured to use "qemu" cluster and "default" namespace by default Example run with krunkit: % minikube start -p krunkit --driver krunkit --container-runtime containerd \ --iso-url file://$PWD/minikube-arm64.iso 😄 [krunkit] minikube v1.36.0 on Darwin 15.5 (arm64) ✨ Using the krunkit (experimental) driver based on user configuration 👍 Starting "krunkit" primary control-plane node in "krunkit" cluster 🔥 Creating krunkit VM (CPUs=2, Memory=6000MB, Disk=20000MB) ... 📦 Preparing Kubernetes v1.33.1 on containerd 1.7.23 ... ▪ Generating certificates and keys ... ▪ Booting up control plane ... ▪ Configuring RBAC rules ... 🔗 Configuring bridge CNI (Container Networking Interface) ... 🔎 Verifying Kubernetes components... ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5 🌟 Enabled addons: default-storageclass, storage-provisioner 🏄 Done! kubectl is now configured to use "krunkit" cluster and "default" namespace by default * Updating ISO to v1.36.0-1749066232-20832 --------- Co-authored-by: minikube-bot --- Makefile | 2 +- deploy/iso/minikube-iso/board/minikube/aarch64/grub.cfg | 5 ++++- pkg/minikube/download/iso.go | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 02a3d1b6f4..770cc6c9d0 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ KIC_VERSION ?= $(shell grep -E "Version =" pkg/drivers/kic/types.go | cut -d \" HUGO_VERSION ?= $(shell grep -E "HUGO_VERSION = \"" netlify.toml | cut -d \" -f2) # Default to .0 for higher cache hit rates, as build increments typically don't require new ISO versions -ISO_VERSION ?= v1.36.0-1748823857-20852 +ISO_VERSION ?= v1.36.0-1749066232-20832 # Dashes are valid in semver, but not Linux packaging. Use ~ to delimit alpha/beta DEB_VERSION ?= $(subst -,~,$(RAW_VERSION)) diff --git a/deploy/iso/minikube-iso/board/minikube/aarch64/grub.cfg b/deploy/iso/minikube-iso/board/minikube/aarch64/grub.cfg index e06366b9ab..0e78c7d16a 100644 --- a/deploy/iso/minikube-iso/board/minikube/aarch64/grub.cfg +++ b/deploy/iso/minikube-iso/board/minikube/aarch64/grub.cfg @@ -2,6 +2,9 @@ set default="0" set timeout="5" menuentry "Buildroot" { - linux /boot/bzimage console=ttyAMA0 # kernel + # The console depends on the driver: + # qemu: console=ttyAMA0 + # vfkit,krunkit: console=hvc0 + linux /boot/bzimage console=ttyAMA0 console=hvc0 initrd /boot/initrd # rootfs } diff --git a/pkg/minikube/download/iso.go b/pkg/minikube/download/iso.go index 5cef53355c..9e7f38940a 100644 --- a/pkg/minikube/download/iso.go +++ b/pkg/minikube/download/iso.go @@ -41,7 +41,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/20852" + isoBucket := "minikube-builds/iso/20832" return []string{ fmt.Sprintf("https://storage.googleapis.com/%s/minikube-%s-%s.iso", isoBucket, v, runtime.GOARCH), From c292f1df984941c2cfecccc0820029ba474516ef Mon Sep 17 00:00:00 2001 From: Tian Date: Fri, 6 Jun 2025 11:43:24 +0800 Subject: [PATCH 24/60] Update libvirt-dev version to 8.0.0-1ubuntu7.11 (#20889) * update libvirt-dev * install ca-certificates --- go.mod | 2 +- go.sum | 4 ++-- installers/linux/kvm/Dockerfile.amd64 | 5 +++-- installers/linux/kvm/Dockerfile.arm64 | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 46402f475c..22af43b62f 100644 --- a/go.mod +++ b/go.mod @@ -87,7 +87,7 @@ require ( k8s.io/klog/v2 v2.130.1 k8s.io/kubectl v0.32.2 k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 - libvirt.org/go/libvirt v1.11002.0 + libvirt.org/go/libvirt v1.11004.0 sigs.k8s.io/sig-storage-lib-external-provisioner/v6 v6.3.0 ) diff --git a/go.sum b/go.sum index 13afeafe6b..9c7b38236b 100644 --- a/go.sum +++ b/go.sum @@ -3219,8 +3219,8 @@ k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -libvirt.org/go/libvirt v1.11002.0 h1:cb8KJG3D97pc/hxQ2n6P82hRX3rlgdzO7bih6W1AAQ8= -libvirt.org/go/libvirt v1.11002.0/go.mod h1:1WiFE8EjZfq+FCVog+rvr1yatKbKZ9FaFMZgEqxEJqQ= +libvirt.org/go/libvirt v1.11004.0 h1:8iWbiTJzrqQoS+opyowkDeJAWImDx8jb/jGQjo++upM= +libvirt.org/go/libvirt v1.11004.0/go.mod h1:1WiFE8EjZfq+FCVog+rvr1yatKbKZ9FaFMZgEqxEJqQ= lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= diff --git a/installers/linux/kvm/Dockerfile.amd64 b/installers/linux/kvm/Dockerfile.amd64 index c55868f317..0d78193790 100644 --- a/installers/linux/kvm/Dockerfile.amd64 +++ b/installers/linux/kvm/Dockerfile.amd64 @@ -12,9 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM gcr.io/gcp-runtimes/ubuntu_20_0_4 +FROM ubuntu:22.04 -RUN apt-get update && apt-get install -y --no-install-recommends \ +RUN export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ gcc \ libc6-dev \ make \ diff --git a/installers/linux/kvm/Dockerfile.arm64 b/installers/linux/kvm/Dockerfile.arm64 index 323188a97f..5594e2c066 100644 --- a/installers/linux/kvm/Dockerfile.arm64 +++ b/installers/linux/kvm/Dockerfile.arm64 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM ubuntu:20.04 +FROM ubuntu:22.04 RUN export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ From 10fb3bb8f43f4cc421d37b01bd0cd95bd619f4f3 Mon Sep 17 00:00:00 2001 From: Nir Soffer Date: Fri, 6 Jun 2025 20:29:10 +0300 Subject: [PATCH 25/60] qemu: Add serial log (#20894) Log serial console to ~/.minikube/machines/NAME/serial.log to make it easy to debug boot issues. --- pkg/drivers/qemu/qemu.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkg/drivers/qemu/qemu.go b/pkg/drivers/qemu/qemu.go index 08b6ff1ad2..141f1f9356 100644 --- a/pkg/drivers/qemu/qemu.go +++ b/pkg/drivers/qemu/qemu.go @@ -54,6 +54,7 @@ import ( const ( isoFilename = "boot2docker.iso" + serialFileName = "serial.log" privateNetworkName = "docker-machines" defaultSSHUser = "docker" @@ -464,6 +465,10 @@ func (d *Driver) Start() error { "virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=config-2") } + serialPath := d.ResolveStorePath(serialFileName) + startCmd = append(startCmd, + "-serial", fmt.Sprintf("file:%s", serialPath)) + for i := 0; i < d.ExtraDisks; i++ { // use a higher index for extra disks to reduce ID collision with current or future // low-indexed devices (e.g., firmware, ISO CDROM, cloud config, and network device) From 25f76c4ea7fc87e92e1016a679a6d2a688de9a49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Jun 2025 10:30:39 -0700 Subject: [PATCH 26/60] Build(deps): Bump k8s.io/kubectl from 0.32.2 to 0.33.1 (#20847) Bumps [k8s.io/kubectl](https://github.com/kubernetes/kubectl) from 0.32.2 to 0.33.1. - [Commits](https://github.com/kubernetes/kubectl/compare/v0.32.2...v0.33.1) --- updated-dependencies: - dependency-name: k8s.io/kubectl dependency-version: 0.33.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 22af43b62f..446394b9bf 100644 --- a/go.mod +++ b/go.mod @@ -85,7 +85,7 @@ require ( k8s.io/cluster-bootstrap v0.0.0 k8s.io/component-base v0.33.1 k8s.io/klog/v2 v2.130.1 - k8s.io/kubectl v0.32.2 + k8s.io/kubectl v0.33.1 k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 libvirt.org/go/libvirt v1.11004.0 sigs.k8s.io/sig-storage-lib-external-provisioner/v6 v6.3.0 @@ -245,7 +245,7 @@ require ( gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/cli-runtime v0.32.2 // indirect + k8s.io/cli-runtime v0.33.1 // indirect k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect sigs.k8s.io/randfill v1.0.0 // indirect diff --git a/go.sum b/go.sum index 9c7b38236b..d8eb1c3154 100644 --- a/go.sum +++ b/go.sum @@ -3163,8 +3163,8 @@ k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= -k8s.io/cli-runtime v0.32.2 h1:aKQR4foh9qeyckKRkNXUccP9moxzffyndZAvr+IXMks= -k8s.io/cli-runtime v0.32.2/go.mod h1:a/JpeMztz3xDa7GCyyShcwe55p8pbcCVQxvqZnIwXN8= +k8s.io/cli-runtime v0.33.1 h1:TvpjEtF71ViFmPeYMj1baZMJR4iWUEplklsUQ7D3quA= +k8s.io/cli-runtime v0.33.1/go.mod h1:9dz5Q4Uh8io4OWCLiEf/217DXwqNgiTS/IOuza99VZE= k8s.io/client-go v0.19.1/go.mod h1:AZOIVSI9UUtQPeJD3zJFp15CEhSjRgAuQP5PWRJrCIQ= k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= @@ -3208,8 +3208,8 @@ k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2R k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= -k8s.io/kubectl v0.32.2 h1:TAkag6+XfSBgkqK9I7ZvwtF0WVtUAvK8ZqTt+5zi1Us= -k8s.io/kubectl v0.32.2/go.mod h1:+h/NQFSPxiDZYX/WZaWw9fwYezGLISP0ud8nQKg+3g8= +k8s.io/kubectl v0.33.1 h1:OJUXa6FV5bap6iRy345ezEjU9dTLxqv1zFTVqmeHb6A= +k8s.io/kubectl v0.33.1/go.mod h1:Z07pGqXoP4NgITlPRrnmiM3qnoo1QrK1zjw85Aiz8J0= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= From 017ef750b3a91a54643f86dfbde1a3c12dd36661 Mon Sep 17 00:00:00 2001 From: Tian Date: Sat, 7 Jun 2025 01:32:34 +0800 Subject: [PATCH 27/60] redo "minikube profile list" to move the verbose details into a --detailed flag (#20544) --- cmd/minikube/cmd/config/profile_list.go | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/cmd/minikube/cmd/config/profile_list.go b/cmd/minikube/cmd/config/profile_list.go index 081b026995..30bf874460 100644 --- a/cmd/minikube/cmd/config/profile_list.go +++ b/cmd/minikube/cmd/config/profile_list.go @@ -40,8 +40,11 @@ import ( "k8s.io/klog/v2" ) -var profileOutput string -var isLight bool +var ( + profileOutput string + isLight bool + isDetailed bool +) var profileListCmd = &cobra.Command{ Use: "list", @@ -130,7 +133,13 @@ func profileStatus(p *config.Profile, api libmachine.API) cluster.State { func renderProfilesTable(ps [][]string) { table := tablewriter.NewWriter(os.Stdout) - table.SetHeader([]string{"Profile", "VM Driver", "Runtime", "IP", "Port", "Version", "Status", "Nodes", "Active Profile", "Active Kubecontext"}) + if isDetailed { + table.SetHeader([]string{"Profile", "Driver", "Runtime", "IP", "Port", "Version", + "Status", "Nodes", "Active Profile", "Active Kubecontext"}) + } else { + table.SetHeader([]string{"Profile", "Driver", "Runtime", "IP", "Version", "Status", + "Nodes", "Active Profile", "Active Kubecontext"}) + } table.SetAutoFormatHeaders(false) table.SetBorders(tablewriter.Border{Left: true, Top: true, Right: true, Bottom: true}) table.SetCenterSeparator("|") @@ -164,7 +173,13 @@ func profilesToTableData(profiles []*config.Profile) [][]string { if p.ActiveKubeContext { k = "*" } - data = append(data, []string{p.Name, p.Config.Driver, p.Config.KubernetesConfig.ContainerRuntime, cpIP, strconv.Itoa(cpPort), k8sVersion, p.Status, strconv.Itoa(len(p.Config.Nodes)), c, k}) + if isDetailed { + data = append(data, []string{p.Name, p.Config.Driver, p.Config.KubernetesConfig.ContainerRuntime, + cpIP, strconv.Itoa(cpPort), k8sVersion, p.Status, strconv.Itoa(len(p.Config.Nodes)), c, k}) + } else { + data = append(data, []string{p.Name, p.Config.Driver, p.Config.KubernetesConfig.ContainerRuntime, + cpIP, k8sVersion, p.Status, strconv.Itoa(len(p.Config.Nodes)), c, k}) + } } return data } @@ -213,5 +228,6 @@ func profilesOrDefault(profiles []*config.Profile) []*config.Profile { func init() { profileListCmd.Flags().StringVarP(&profileOutput, "output", "o", "table", "The output format. One of 'json', 'table'") profileListCmd.Flags().BoolVarP(&isLight, "light", "l", false, "If true, returns list of profiles faster by skipping validating the status of the cluster.") + profileListCmd.Flags().BoolVarP(&isDetailed, "detailed", "d", false, "If true, returns a detailed list of profiles.") ProfileCmd.AddCommand(profileListCmd) } From 57dd4b3d17aa0bf9568f37f36a5d9a1363b2de2b Mon Sep 17 00:00:00 2001 From: Nir Soffer Date: Sat, 7 Jun 2025 02:07:50 +0300 Subject: [PATCH 28/60] iso: Disable grub timeout speeding up vm start by 5 seconds (#20895) * iso: Disable grub timeout This speeds up machine boot by 5 seconds. The timeout may be helpful for debugging boot issues but we don't have a way to access the serial console for debugging currently. Testing shows about ~5 seconds speedup. | driver | timeout | start time | |------------|---------|------------| | vfkit[1] | 5.0 | 24.01 | | vfkit[1] | 0.0 | 19.90 | | qemu | 5.0 | 29.46 | | qemu | 0.0 | 24.28 | | krunkit[2] | 5.0 | 25.14 | | krunkit[2] | 0.0 | 20.51 | [1] Tested with #20833, booting using iso instead of direct kernel boot. Direct kernel boot is little bit faster (e.g. 18.x). [2] Tested with #20826 * Updating ISO to v1.36.0-1749153077-20895 --------- Co-authored-by: minikube-bot --- Makefile | 2 +- deploy/iso/minikube-iso/board/minikube/aarch64/grub.cfg | 2 +- deploy/iso/minikube-iso/board/minikube/x86_64/grub.cfg | 2 +- pkg/minikube/download/iso.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 770cc6c9d0..8455fb517e 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ KIC_VERSION ?= $(shell grep -E "Version =" pkg/drivers/kic/types.go | cut -d \" HUGO_VERSION ?= $(shell grep -E "HUGO_VERSION = \"" netlify.toml | cut -d \" -f2) # Default to .0 for higher cache hit rates, as build increments typically don't require new ISO versions -ISO_VERSION ?= v1.36.0-1749066232-20832 +ISO_VERSION ?= v1.36.0-1749153077-20895 # Dashes are valid in semver, but not Linux packaging. Use ~ to delimit alpha/beta DEB_VERSION ?= $(subst -,~,$(RAW_VERSION)) diff --git a/deploy/iso/minikube-iso/board/minikube/aarch64/grub.cfg b/deploy/iso/minikube-iso/board/minikube/aarch64/grub.cfg index 0e78c7d16a..90b7df2595 100644 --- a/deploy/iso/minikube-iso/board/minikube/aarch64/grub.cfg +++ b/deploy/iso/minikube-iso/board/minikube/aarch64/grub.cfg @@ -1,5 +1,5 @@ set default="0" -set timeout="5" +set timeout="0" menuentry "Buildroot" { # The console depends on the driver: diff --git a/deploy/iso/minikube-iso/board/minikube/x86_64/grub.cfg b/deploy/iso/minikube-iso/board/minikube/x86_64/grub.cfg index 009b345539..9f630e596e 100644 --- a/deploy/iso/minikube-iso/board/minikube/x86_64/grub.cfg +++ b/deploy/iso/minikube-iso/board/minikube/x86_64/grub.cfg @@ -1,5 +1,5 @@ set default="0" -set timeout="5" +set timeout="0" menuentry "Buildroot" { linux /boot/bzimage console=tty0 rw # kernel diff --git a/pkg/minikube/download/iso.go b/pkg/minikube/download/iso.go index 9e7f38940a..2a258bccab 100644 --- a/pkg/minikube/download/iso.go +++ b/pkg/minikube/download/iso.go @@ -41,7 +41,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/20832" + isoBucket := "minikube-builds/iso/20895" return []string{ fmt.Sprintf("https://storage.googleapis.com/%s/minikube-%s-%s.iso", isoBucket, v, runtime.GOARCH), From a61c304fed269a6a12637101ece367c308a80215 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Fri, 6 Jun 2025 16:08:09 -0700 Subject: [PATCH 29/60] Update auto-generated docs and translations (#20897) --- site/content/en/docs/commands/profile.md | 1 + translations/de.json | 1 + translations/es.json | 1 + translations/fr.json | 1 + translations/id.json | 1 + translations/ja.json | 1 + translations/ko.json | 1 + translations/pl.json | 1 + translations/ru.json | 1 + translations/strings.txt | 1 + translations/zh-CN.json | 1 + 11 files changed, 11 insertions(+) diff --git a/site/content/en/docs/commands/profile.md b/site/content/en/docs/commands/profile.md index f4bea12057..73fc091a8d 100644 --- a/site/content/en/docs/commands/profile.md +++ b/site/content/en/docs/commands/profile.md @@ -93,6 +93,7 @@ minikube profile list [flags] ### Options ``` + -d, --detailed If true, returns a detailed list of profiles. -l, --light If true, returns list of profiles faster by skipping validating the status of the cluster. -o, --output string The output format. One of 'json', 'table' (default "table") ``` diff --git a/translations/de.json b/translations/de.json index 54fae209a7..ca86701fb8 100644 --- a/translations/de.json +++ b/translations/de.json @@ -392,6 +392,7 @@ "If true, only download and cache files for later use - don't install or start anything.": "Wenn true, laden Sie nur Dateien für die spätere Verwendung herunter und speichern Sie sie – installieren oder starten Sie nichts.", "If true, pods might get deleted and restarted on addon enable": "Falls gesetzt, könnten Pods gelöscht und neugestartet werden, wenn ein Addon aktiviert wird", "If true, print web links to addons' documentation if using --output=list (default).": "Falls gesetzt, gibt Links zu den Dokumentationen der Addons aus. Funktioniert nur, wenn --output=list (default).", + "If true, returns a detailed list of profiles.": "", "If true, returns list of profiles faster by skipping validating the status of the cluster.": "Falls gesetzt, gibt die Liste der Profile schneller aus, indem das Validieren des Status des Clusters ausgelassen wird.", "If true, the added node will be marked for work. Defaults to true.": "Falls gesetzt, wird der hinzugefügte Node als Arbeitsnode markiert. Default: true", "If true, the node added will also be a control plane in addition to a worker.": "Falls gesetzt, wird der Knoten auch als Control Plane hinzugefügt, zusätzlich zu als Worker.", diff --git a/translations/es.json b/translations/es.json index 42f6e26347..86b1554295 100644 --- a/translations/es.json +++ b/translations/es.json @@ -388,6 +388,7 @@ "If true, only download and cache files for later use - don't install or start anything.": "Si el valor es \"true\", los archivos solo se descargan y almacenan en caché (no se instala ni inicia nada).", "If true, pods might get deleted and restarted on addon enable": "", "If true, print web links to addons' documentation if using --output=list (default).": "", + "If true, returns a detailed list of profiles.": "", "If true, returns list of profiles faster by skipping validating the status of the cluster.": "", "If true, will perform potentially dangerous operations. Use with discretion.": "", "If you are running minikube within a VM, consider using --driver=none:": "", diff --git a/translations/fr.json b/translations/fr.json index 760e0cec55..5675c92f03 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -386,6 +386,7 @@ "If true, only download and cache files for later use - don't install or start anything.": "Si la valeur est \"true\", téléchargez les fichiers et mettez-les en cache uniquement pour une utilisation future. Ne lancez pas d'installation et ne commencez aucun processus.", "If true, pods might get deleted and restarted on addon enable": "Si vrai, les pods peuvent être supprimés et redémarrés lors addon enable", "If true, print web links to addons' documentation if using --output=list (default).": "Si vrai, affiche les liens Web vers la documentation des addons si vous utilisez --output=list (défaut).", + "If true, returns a detailed list of profiles.": "", "If true, returns list of profiles faster by skipping validating the status of the cluster.": "Si vrai, renvoie la liste des profils plus rapidement en ignorant la validation de l'état du cluster.", "If true, the added node will be marked for work. Defaults to true.": "Si vrai, le nœud ajouté sera marqué pour le travail. La valeur par défaut est true.", "If true, the node added will also be a control plane in addition to a worker.": "Si vrai, le nœud ajouté sera également un plan de contrôle en plus d'un travailleur.", diff --git a/translations/id.json b/translations/id.json index aba1a7975e..e28f8a6e3f 100644 --- a/translations/id.json +++ b/translations/id.json @@ -353,6 +353,7 @@ "If true, only download and cache files for later use - don't install or start anything.": "Jika true, hanya mengunduh dan menyimpan file untuk digunakan nanti - tidak menginstal atau memulai apa pun.", "If true, pods might get deleted and restarted on addon enable": "Jika true, pod mungkin akan dihapus dan dimulai ulang saat addon diaktifkan.", "If true, print web links to addons' documentation if using --output=list (default).": "Jika true, tampilkan tautan dokumentasi addons jika menggunakan --output=list (default).", + "If true, returns a detailed list of profiles.": "", "If true, returns list of profiles faster by skipping validating the status of the cluster.": "Jika true, mengembalikan daftar profil lebih cepat dengan melewati validasi status klaster.", "If true, will perform potentially dangerous operations. Use with discretion.": "Jika true, akan melakukan operasi yang berpotensi berbahaya. Gunakan dengan bijak.", "If you are running minikube within a VM, consider using --driver=none:": "Jika anda menjalankan minikube di dalam VM, pertimbangkan untuk menggunakan --driver=none:", diff --git a/translations/ja.json b/translations/ja.json index bd90b1fd56..6f0e36cd28 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -370,6 +370,7 @@ "If true, only download and cache files for later use - don't install or start anything.": "true の場合、後の使用のためのファイルのダウンロードとキャッシュ保存のみ行われます。インストールも起動も行いません", "If true, pods might get deleted and restarted on addon enable": "true の場合、有効なアドオンの Pod は削除され、再起動されます", "If true, print web links to addons' documentation if using --output=list (default).": "true の場合、--output=list (default) を利用することでアドオンのドキュメントへの web リンクを表示します", + "If true, returns a detailed list of profiles.": "", "If true, returns list of profiles faster by skipping validating the status of the cluster.": "true の場合、クラスター状態の検証を省略することにより高速にプロファイル一覧を返します。", "If true, the added node will be marked for work. Defaults to true.": "true の場合、追加されたノードはワーカー用としてマークされます。デフォルトは true です。", "If true, will perform potentially dangerous operations. Use with discretion.": "true の場合、潜在的に危険な操作を行うことになります。慎重に使用してください。", diff --git a/translations/ko.json b/translations/ko.json index 5c74709813..16c4acba9c 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -406,6 +406,7 @@ "If true, only download and cache files for later use - don't install or start anything.": "", "If true, pods might get deleted and restarted on addon enable": "", "If true, print web links to addons' documentation if using --output=list (default).": "", + "If true, returns a detailed list of profiles.": "", "If true, returns list of profiles faster by skipping validating the status of the cluster.": "", "If true, will perform potentially dangerous operations. Use with discretion.": "", "If you are running minikube within a VM, consider using --driver=none:": "", diff --git a/translations/pl.json b/translations/pl.json index 7aff3dc8f4..ebbc365cf1 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -386,6 +386,7 @@ "If true, only download and cache files for later use - don't install or start anything.": "", "If true, pods might get deleted and restarted on addon enable": "", "If true, print web links to addons' documentation if using --output=list (default).": "", + "If true, returns a detailed list of profiles.": "", "If true, returns list of profiles faster by skipping validating the status of the cluster.": "", "If true, will perform potentially dangerous operations. Use with discretion.": "", "If using the none driver, ensure that systemctl is installed": "Jeśli użyto sterownika 'none', upewnij się że systemctl jest zainstalowany", diff --git a/translations/ru.json b/translations/ru.json index 4b73492ce6..60bf1e7ca5 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -352,6 +352,7 @@ "If true, only download and cache files for later use - don't install or start anything.": "", "If true, pods might get deleted and restarted on addon enable": "", "If true, print web links to addons' documentation if using --output=list (default).": "", + "If true, returns a detailed list of profiles.": "", "If true, returns list of profiles faster by skipping validating the status of the cluster.": "", "If true, will perform potentially dangerous operations. Use with discretion.": "", "If you are running minikube within a VM, consider using --driver=none:": "", diff --git a/translations/strings.txt b/translations/strings.txt index eb9bc9aecc..225d43fd69 100644 --- a/translations/strings.txt +++ b/translations/strings.txt @@ -351,6 +351,7 @@ "If true, only download and cache files for later use - don't install or start anything.": "", "If true, pods might get deleted and restarted on addon enable": "", "If true, print web links to addons' documentation if using --output=list (default).": "", + "If true, returns a detailed list of profiles.": "", "If true, returns list of profiles faster by skipping validating the status of the cluster.": "", "If true, will perform potentially dangerous operations. Use with discretion.": "", "If you are running minikube within a VM, consider using --driver=none:": "", diff --git a/translations/zh-CN.json b/translations/zh-CN.json index f760be4a40..c24a19d367 100644 --- a/translations/zh-CN.json +++ b/translations/zh-CN.json @@ -475,6 +475,7 @@ "If true, only download and cache files for later use - don't install or start anything.": "如果为 true,仅会下载和缓存文件以备后用 - 不会安装或启动任何项。", "If true, pods might get deleted and restarted on addon enable": "如果为 true,pods可能会被删除并在启用插件时重新启动", "If true, print web links to addons' documentation if using --output=list (default).": "如果为 true,则使用 --output=list(默认值)输出 web 链接到插件文档。", + "If true, returns a detailed list of profiles.": "", "If true, returns list of profiles faster by skipping validating the status of the cluster.": "如果为 true,则通过跳过验证群集的状态从而更快地返回配置文件列表。", "If true, the added node will be marked for work. Defaults to true.": "如果为true,则添加的节点将标记为 work,默认为 true。", "If true, will perform potentially dangerous operations. Use with discretion.": "如果为 true,将执行潜在的危险操作。谨慎使用。", From f903a5c329bdd194899f58ff7dbb2ec88f5e2ee8 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 9 Jun 2025 11:18:04 -0700 Subject: [PATCH 30/60] Site: Update hugo from v0.147.7 to v0.147.8 (#20912) --- netlify.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netlify.toml b/netlify.toml index edb8de25a2..680a4eb959 100644 --- a/netlify.toml +++ b/netlify.toml @@ -5,7 +5,7 @@ command = "pwd && cd themes/docsy && npm install && git submodule update -f --in [build.environment] NODE_VERSION = "20.19.2" -HUGO_VERSION = "v0.147.7" +HUGO_VERSION = "v0.147.8" [context.production.environment] HUGO_ENV = "production" From 93289780e7ef53d5d989618c14c91d1e92194694 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Tue, 10 Jun 2025 09:38:34 -0700 Subject: [PATCH 31/60] Addon ingress: Update ingress-nginx/controller image from v1.12.2 to v1.12.3 (#20909) --- pkg/minikube/assets/addons.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/minikube/assets/addons.go b/pkg/minikube/assets/addons.go index 3a6b0762e1..67687f6e43 100644 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -277,11 +277,11 @@ var Addons = map[string]*Addon{ "0640"), }, false, "ingress", "Kubernetes", "", "https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/", map[string]string{ // https://github.com/kubernetes/ingress-nginx/blob/3476232f5c38383dd157ddaff3b4c7cebd57284e/deploy/static/provider/kind/deploy.yaml#L445 - "IngressController": "ingress-nginx/controller:v1.12.2@sha256:03497ee984628e95eca9b2279e3f3a3c1685dd48635479e627d219f00c8eefa9", + "IngressController": "ingress-nginx/controller:v1.12.3@sha256:ac444cd9515af325ba577b596fe4f27a34be1aa330538e8b317ad9d6c8fb94ee", // https://github.com/kubernetes/ingress-nginx/blob/3476232f5c38383dd157ddaff3b4c7cebd57284e/deploy/static/provider/kind/deploy.yaml#L552 - "KubeWebhookCertgenCreate": "ingress-nginx/kube-webhook-certgen:v1.5.3@sha256:2cf4ebfa82a37c357455458f6dfc334aea1392d508270b2517795a9933a02524", + "KubeWebhookCertgenCreate": "ingress-nginx/kube-webhook-certgen:v1.5.4@sha256:7a38cf0f8480775baaee71ab519c7465fd1dfeac66c421f28f087786e631456e", // https://github.com/kubernetes/ingress-nginx/blob/3476232f5c38383dd157ddaff3b4c7cebd57284e/deploy/static/provider/kind/deploy.yaml#L601 - "KubeWebhookCertgenPatch": "ingress-nginx/kube-webhook-certgen:v1.5.3@sha256:2cf4ebfa82a37c357455458f6dfc334aea1392d508270b2517795a9933a02524", + "KubeWebhookCertgenPatch": "ingress-nginx/kube-webhook-certgen:v1.5.4@sha256:7a38cf0f8480775baaee71ab519c7465fd1dfeac66c421f28f087786e631456e", }, map[string]string{ "IngressController": "registry.k8s.io", "KubeWebhookCertgenCreate": "registry.k8s.io", @@ -597,7 +597,7 @@ var Addons = map[string]*Addon{ "gcp-auth-webhook.yaml", "0640"), }, false, "gcp-auth", "Google", "", "https://minikube.sigs.k8s.io/docs/handbook/addons/gcp-auth/", map[string]string{ - "KubeWebhookCertgen": "ingress-nginx/kube-webhook-certgen:v1.5.3@sha256:2cf4ebfa82a37c357455458f6dfc334aea1392d508270b2517795a9933a02524", + "KubeWebhookCertgen": "ingress-nginx/kube-webhook-certgen:v1.5.4@sha256:7a38cf0f8480775baaee71ab519c7465fd1dfeac66c421f28f087786e631456e", "GCPAuthWebhook": "k8s-minikube/gcp-auth-webhook:v0.1.3@sha256:94f0c448171b974aab7b4a96d00feb5799b1d69827a738a4f8b4b30c17fb74e7", }, map[string]string{ "GCPAuthWebhook": "gcr.io", From 0cf4a80c74ef89c283b5a45d641ef220fd27c98e Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Tue, 10 Jun 2025 09:44:39 -0700 Subject: [PATCH 32/60] Addon kubevirt: Update bitnami/kubectl image from 1.33.1 to 1.33.1 (#20911) --- 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 67687f6e43..ad7d57a40c 100644 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -334,7 +334,7 @@ var Addons = map[string]*Addon{ "pod.yaml", "0640"), }, false, "kubevirt", "3rd party (KubeVirt)", "", "https://minikube.sigs.k8s.io/docs/handbook/addons/kubevirt/", map[string]string{ - "Kubectl": "bitnami/kubectl:1.33.1@sha256:35f792b0f0b8b3072bb01cd50a23d2dc1ba2488eed70a1a951a1789a8e3bc994", + "Kubectl": "bitnami/kubectl:1.33.1@sha256:c963598a2143300db1c74b9a2cc0091511daabaf3eaa0fd8643bc241a15024f3", }, map[string]string{ "Kubectl": "docker.io", }), From 1cdd1e233495dc91264abbad6081c39c5424b11d Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Tue, 10 Jun 2025 09:46:34 -0700 Subject: [PATCH 33/60] CNI: Update flannel from v0.26.7 to v0.27.0 (#20907) --- pkg/minikube/cni/flannel.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/minikube/cni/flannel.yaml b/pkg/minikube/cni/flannel.yaml index 5b8bd52666..1fd7be0ed1 100644 --- a/pkg/minikube/cni/flannel.yaml +++ b/pkg/minikube/cni/flannel.yaml @@ -133,7 +133,7 @@ spec: serviceAccountName: flannel initContainers: - name: install-cni-plugin - image: ghcr.io/flannel-io/flannel-cni-plugin:v1.6.2-flannel1 + image: ghcr.io/flannel-io/flannel-cni-plugin:v1.7.1-flannel1 command: - cp args: @@ -144,7 +144,7 @@ spec: - name: cni-plugin mountPath: /opt/cni/bin - name: install-cni - image: ghcr.io/flannel-io/flannel:v0.26.7 + image: ghcr.io/flannel-io/flannel:v0.27.0 command: - cp args: @@ -158,7 +158,7 @@ spec: mountPath: /etc/kube-flannel/ containers: - name: kube-flannel - image: ghcr.io/flannel-io/flannel:v0.26.7 + image: ghcr.io/flannel-io/flannel:v0.27.0 command: - /opt/bin/flanneld args: From b66888d9724edd15f6c9a8ddbe505a320fa1f6e2 Mon Sep 17 00:00:00 2001 From: Nir Soffer Date: Tue, 10 Jun 2025 20:21:10 +0300 Subject: [PATCH 34/60] vfkit: Use EFI booloader (#20833) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * vfkit: Log serial console to file To make debugging easier, add virtio-serial device logging serial console to file: ~/.minikube/machines/NAME/serial.log To enable logging, we need to enable the console in the kernel command line, since we still use direct kernel boot. Example log: % cat /Users/nir/.minikube/machines/vfkit/vfkig.log [ 0.896094] cacheinfo: Unable to detect cache hierarchy for CPU 0 [ 0.897186] loop: module loaded [ 0.897670] virtio_blk virtio2: [vda] 840488 512-byte logical blocks (430 MB/410 MiB) [ 0.897733] vda: detected capacity change from 0 to 430329856 [ 0.898460] virtio_blk virtio3: [vdb] 40960000 512-byte logical blocks (21.0 GB/19.5 GiB) [ 0.898533] vdb: detected capacity change from 0 to 20971520000 ... [ 1.794714] systemd[1]: Detected virtualization vm-other. [ 1.794752] systemd[1]: Detected architecture arm64. Welcome to Buildroot 2025.02! [ 1.794944] systemd[1]: Hostname set to . [ 1.795011] systemd[1]: Initializing machine ID from random generator. ... [ OK ] Started Container Runtime Interface for OCI (CRI-O). [ OK ] Reached target Multi-User System. Welcome to minikube vfkit login: [ 6.681578] systemd-ssh-generator[630]: Binding SSH to AF_UNIX socket /run/ssh-unix-local/socket. * vfkit: Use EFI bootloader With the fixed iso, we can simplify the driver using the EFI bootloader option[1] instead of the legacy and deprecated --kernel, --kernel-cmdline, and --initrd options[2]. Example run: % minikube start -p vfkit --driver vfkit --container-runtime containerd --network vmnet-shared 😄 [vfkit] minikube v1.36.0 on Darwin 15.5 (arm64) ✨ Using the vfkit driver based on user configuration 👍 Starting "vfkit" primary control-plane node in "vfkit" cluster 🔥 Creating vfkit VM (CPUs=2, Memory=6000MB, Disk=20000MB) ... 📦 Preparing Kubernetes v1.33.1 on containerd 1.7.23 ... ▪ Generating certificates and keys ... ▪ Booting up control plane ... ▪ Configuring RBAC rules ... 🔗 Configuring bridge CNI (Container Networking Interface) ... 🔎 Verifying Kubernetes components... ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5 🌟 Enabled addons: default-storageclass, storage-provisioner 🏄 Done! kubectl is now configured to use "vfkit" cluster and "default" namespace by default Comparing direct kernel boot and --bootloader efi shows that it is little bit faster and boot time is more consistent. % hyperfine -r 10 -C "minikube delete" \ "vfkit-efi/out/minikube start --driver vfkit --network vmnet-shared --container-runtime containerd --no-kubernetes" \ "vfkit-direct/out/minikube start --driver vfkit --network vmnet-shared --container-runtime containerd --no-kubernetes" Benchmark 1: vfkit-efi/out/minikube start --driver vfkit --network vmnet-shared --container-runtime containerd --no-kubernetes Time (mean ± σ): 10.205 s ± 0.656 s [User: 0.381 s, System: 0.266 s] Range (min … max): 9.106 s … 11.254 s 10 runs Benchmark 2: vfkit-direct/out/minikube start --driver vfkit --network vmnet-shared --container-runtime containerd --no-kubernetes Time (mean ± σ): 10.933 s ± 1.616 s [User: 0.402 s, System: 0.406 s] Range (min … max): 9.155 s … 14.168 s 10 runs Summary vfkit-efi/out/minikube start --driver vfkit --network vmnet-shared --container-runtime containerd --no-kubernetes ran 1.07 ± 0.17 times faster than vfkit-direct/out/minikube start --driver vfkit --network vmnet-shared --container-runtime containerd --no-kubernetes [1] https://github.com/crc-org/vfkit/blob/main/doc/usage.md#efi-bootloader [2] https://github.com/crc-org/vfkit/blob/main/doc/usage.md#deprecated-options * docs: Update vfkit driver documentation - Separate vfkit requirements and vmnet-shared requirements - Update minimal macOS version required for --bootloader efi - Simplify vfkit upgrade, it is available in brew now --- pkg/drivers/vfkit/vfkit.go | 49 +++++++---------------- pkg/minikube/registry/drvs/vfkit/vfkit.go | 1 - site/content/en/docs/drivers/vfkit.md | 18 ++++----- 3 files changed, 24 insertions(+), 44 deletions(-) diff --git a/pkg/drivers/vfkit/vfkit.go b/pkg/drivers/vfkit/vfkit.go index e37408ba06..9c7e4fb551 100644 --- a/pkg/drivers/vfkit/vfkit.go +++ b/pkg/drivers/vfkit/vfkit.go @@ -53,10 +53,12 @@ import ( ) const ( - isoFilename = "boot2docker.iso" - pidFileName = "vfkit.pid" - sockFilename = "vfkit.sock" - defaultSSHUser = "docker" + isoFilename = "boot2docker.iso" + pidFileName = "vfkit.pid" + sockFilename = "vfkit.sock" + serialFileName = "serial.log" + efiVarsFileName = "vfkit.efivars" + defaultSSHUser = "docker" ) // Driver is the machine driver for vfkit (Virtualization.framework) @@ -67,7 +69,6 @@ type Driver struct { DiskSize int CPU int Memory int - Cmdline string ExtraDisks int Network string // "", "nat", "vmnet-shared" MACAddress string // For network=nat, network="" @@ -189,12 +190,6 @@ func (d *Driver) Create() error { if err := b2dutils.CopyIsoToMachineDir(d.Boot2DockerURL, d.MachineName); err != nil { return err } - isoPath := d.ResolveStorePath(isoFilename) - - log.Info("Extracting Kernel...") - if err := d.extractKernel(isoPath); err != nil { - return err - } log.Info("Creating SSH key...") if err := ssh.GenerateSSHKey(d.sshKeyPath()); err != nil { @@ -256,9 +251,10 @@ func (d *Driver) startVfkit(socketPath string) error { "--memory", fmt.Sprintf("%d", d.Memory), "--cpus", fmt.Sprintf("%d", d.CPU), "--restful-uri", fmt.Sprintf("unix://%s", d.sockfilePath())) - var isoPath = filepath.Join(machineDir, isoFilename) + + efiVarsPath := d.ResolveStorePath(efiVarsFileName) startCmd = append(startCmd, - "--device", fmt.Sprintf("virtio-blk,path=%s", isoPath)) + "--bootloader", fmt.Sprintf("efi,variable-store=%s,create", efiVarsPath)) if socketPath != "" { // The guest will be able to access other guests in the vmnet network. @@ -273,20 +269,21 @@ func (d *Driver) startVfkit(socketPath string) error { startCmd = append(startCmd, "--device", "virtio-rng") + var isoPath = filepath.Join(machineDir, isoFilename) startCmd = append(startCmd, - "--kernel", d.ResolveStorePath("bzimage")) - startCmd = append(startCmd, - "--kernel-cmdline", d.Cmdline) + "--device", fmt.Sprintf("virtio-blk,path=%s", isoPath)) + startCmd = append(startCmd, - "--initrd", d.ResolveStorePath("initrd")) + "--device", fmt.Sprintf("virtio-blk,path=%s", d.diskPath())) for i := 0; i < d.ExtraDisks; i++ { startCmd = append(startCmd, "--device", fmt.Sprintf("virtio-blk,path=%s", pkgdrivers.ExtraDiskPath(d.BaseDriver, i))) } + serialPath := d.ResolveStorePath(serialFileName) startCmd = append(startCmd, - "--device", fmt.Sprintf("virtio-blk,path=%s", d.diskPath())) + "--device", fmt.Sprintf("virtio-serial,logFilePath=%s", serialPath)) log.Debugf("executing: vfkit %s", strings.Join(startCmd, " ")) os.Remove(d.sockfilePath()) @@ -410,22 +407,6 @@ func (d *Driver) Restart() error { return d.Start() } -func (d *Driver) extractKernel(isoPath string) error { - for _, f := range []struct { - pathInIso string - destPath string - }{ - {"/boot/bzimage", "bzimage"}, - {"/boot/initrd", "initrd"}, - } { - fullDestPath := d.ResolveStorePath(f.destPath) - if err := pkgdrivers.ExtractFile(isoPath, f.pathInIso, fullDestPath); err != nil { - return err - } - } - return nil -} - func (d *Driver) killVfkit() error { if err := d.SetVFKitState("HardStop"); err != nil { // Typically fails with EOF due to https://github.com/crc-org/vfkit/issues/277. diff --git a/pkg/minikube/registry/drvs/vfkit/vfkit.go b/pkg/minikube/registry/drvs/vfkit/vfkit.go index b6fe05fd70..06e7693547 100644 --- a/pkg/minikube/registry/drvs/vfkit/vfkit.go +++ b/pkg/minikube/registry/drvs/vfkit/vfkit.go @@ -98,7 +98,6 @@ func configure(cfg config.ClusterConfig, n config.Node) (interface{}, error) { DiskSize: cfg.DiskSize, Memory: cfg.Memory, CPU: cfg.CPUs, - Cmdline: "", ExtraDisks: cfg.ExtraDisks, Network: cfg.Network, MACAddress: mac, diff --git a/site/content/en/docs/drivers/vfkit.md b/site/content/en/docs/drivers/vfkit.md index 14a6b00114..a99aee8246 100644 --- a/site/content/en/docs/drivers/vfkit.md +++ b/site/content/en/docs/drivers/vfkit.md @@ -11,6 +11,11 @@ aliases: macOS virtualization, optimized for lightweight virtual machines and container deployment. +## Requirements + +- Requires macOS 13 or later. +- Requires minikube version 1.36.0 or later. + ## Networking The vfkit driver has two networking options: `nat` and `vmnet-shared`. @@ -25,8 +30,6 @@ installation instructions bellow. ### Requirements -- Requires macOS 10.15 or later -- Requires minikube version 1.36.0 or later. - Requires [vmnet-helper](https://github.com/nirs/vmnet-helper). ### Install vment-helper @@ -94,13 +97,10 @@ Run `minikube start --driver vfkit --alsologtostderr -v=7` to debug crashes ### Upgrade VFKit -New updates to macOS often require an updated vfkit driver. To upgrade: - -* If Podman Desktop is installed, it also bundles `vfkit` -* If you have Brew Package Manager, run: `brew upgrade vfkit` -* As a final alternative, you install the latest VFKit from [GitHub](https://github.com/crc-org/vfkit/releases) -* To check your current version, run: `vfkit -v` -* If the version didn't change after upgrading verify the correct VFKit is in the path. run: `which vfkit` +```shell +brew update +brew upgrade vfkit +``` ### Troubleshooting the vmnet-shared network From 1c9097f218652250212b3f0b4267c360283a51cf Mon Sep 17 00:00:00 2001 From: Tian Date: Thu, 12 Jun 2025 02:42:18 +0800 Subject: [PATCH 35/60] fix: YAML file escape error problem (#20904) --- pkg/minikube/assets/vm_assets.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/minikube/assets/vm_assets.go b/pkg/minikube/assets/vm_assets.go index faa573aa4c..f539a94882 100644 --- a/pkg/minikube/assets/vm_assets.go +++ b/pkg/minikube/assets/vm_assets.go @@ -20,7 +20,7 @@ import ( "bytes" "embed" "fmt" - "html/template" + "text/template" "io" "os" "path" From eaa7f46e7297fc20ba11f2aebc1fc37f2d8332d0 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Thu, 12 Jun 2025 11:14:50 -0700 Subject: [PATCH 36/60] Addon kong: Update kong/kubernetes-ingress-controller image from 3.4.5 to 3.4.6 (#20908) --- 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 ad7d57a40c..f04aab6013 100644 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -322,7 +322,7 @@ var Addons = map[string]*Addon{ "0640"), }, false, "kong", "3rd party (Kong HQ)", "@gAmUssA", "https://minikube.sigs.k8s.io/docs/handbook/addons/kong-ingress/", map[string]string{ "Kong": "kong:3.9.0@sha256:0f5de480cfa95c612dcedf707272c13900e8d10e435b5e5bf57d950c87620268", - "KongIngress": "kong/kubernetes-ingress-controller:3.4.5@sha256:770676763f40edf8f9d0ccad74ddc114877dc4aaf018a964cdd164afa10effb3", + "KongIngress": "kong/kubernetes-ingress-controller:3.4.6@sha256:4b8918dd3562a40a6a9afebe751e6aa598bc0e57ed12ee1b8ca74ed7eee97cb1", }, map[string]string{ "Kong": "docker.io", "KongIngress": "docker.io", From c967cf7adc94a139b8859dea1894e7d543f700f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Jun 2025 11:16:22 -0700 Subject: [PATCH 37/60] Build(deps): Bump github.com/docker/cli (#20918) Bumps [github.com/docker/cli](https://github.com/docker/cli) from 28.1.1+incompatible to 28.2.2+incompatible. - [Commits](https://github.com/docker/cli/compare/v28.1.1...v28.2.2) --- updated-dependencies: - dependency-name: github.com/docker/cli dependency-version: 28.2.2+incompatible dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 3 ++- go.sum | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 446394b9bf..18a558b9b1 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/cheggaaa/pb/v3 v3.1.7 github.com/cloudevents/sdk-go/v2 v2.16.0 github.com/distribution/reference v0.6.0 - github.com/docker/cli v28.1.1+incompatible + github.com/docker/cli v28.2.2+incompatible github.com/docker/docker v27.5.0+incompatible github.com/docker/go-connections v0.5.0 github.com/docker/go-units v0.5.0 @@ -121,6 +121,7 @@ require ( github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 // indirect + github.com/containerd/errdefs v1.0.0 // indirect github.com/containerd/log v0.1.0 // indirect github.com/containerd/stargz-snapshotter/estargz v0.16.3 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect diff --git a/go.sum b/go.sum index d8eb1c3154..3e49a434de 100644 --- a/go.sum +++ b/go.sum @@ -909,6 +909,8 @@ github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= +github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= +github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= @@ -1016,8 +1018,8 @@ github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5 github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v28.1.1+incompatible h1:eyUemzeI45DY7eDPuwUcmDyDj1pM98oD5MdSpiItp8k= -github.com/docker/cli v28.1.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v28.2.2+incompatible h1:qzx5BNUDFqlvyq4AHzdNB7gSyVTmU4cgsyN9SdInc1A= +github.com/docker/cli v28.2.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= From bcb2c8cacec90b4ed8b4e74020270306ad1d20b8 Mon Sep 17 00:00:00 2001 From: Jeff MAURY Date: Tue, 17 Jun 2025 19:54:43 +0200 Subject: [PATCH 38/60] Fix french translation (#20945) Signed-off-by: Jeff MAURY --- translations/fr.json | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/translations/fr.json b/translations/fr.json index 5675c92f03..22c125d7d8 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -25,15 +25,15 @@ "--kvm-numa-count range is 1-8": "la tranche de --kvm-numa-count est 1 à 8", "--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "l'indicateur --network est valide uniquement avec les pilotes docker/podman et KVM, il va être ignoré", "--network flag is only valid with the docker/podman, KVM and Qemu drivers, it will be ignored": "L'indicateur --network n'est valide qu'avec les pilotes docker/podman, KVM et Qemu, il sera ignoré", - "--network flag is only valid with the docker/podman, qemu, kvm, and vfkit drivers, it will be ignored": "", + "--network flag is only valid with the docker/podman, qemu, kvm, and vfkit drivers, it will be ignored": "L'indicateur --network n'est valide qu'avec les pilotes docker/podman, qemu, kvm et vfkit, il sera ignoré", "--network with QEMU must be 'builtin' or 'socket_vmnet'": "--network avec QEMU doit être 'builtin' ou 'socket_vmnet'", "--network with QEMU must be 'user' or 'socket_vmnet'": "--network avec QEMU doit être 'user' ou 'socket_vmnet'", - "--network with vfkit must be 'nat' or 'vmnet-shared'": "", + "--network with vfkit must be 'nat' or 'vmnet-shared'": "--network avec vfkit doit être 'nat' ou 'vmnet-shared'", "--static-ip is only implemented on Docker and Podman drivers, flag will be ignored": "--static-ip n'est implémenté que sur les pilotes Docker et Podman, l'indicateur sera ignoré", "--static-ip overrides --subnet, --subnet will be ignored": "--static-ip remplace --subnet, --subnet sera ignoré", - "1) Recreate the cluster with Kubernetes {{.new}}, by running:\n\t \n\t\t minikube delete {{.profile}}\n\t\t minikube start {{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t2) Create a second cluster with Kubernetes {{.new}}, by running:\n\t \n\t\t minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t3) Use the existing cluster at version Kubernetes {{.old}}, by running:\n\t \n\t\t minikube start {{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t": "1) Recréez le cluster avec Kubernetes {{.new}}, en exécutant :\n\t \n\t\t minikube delete {{.profile}}\n\t\t minikube start {{.profile}} - -kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t2) Créez un deuxième cluster avec Kubernetes {{.new}}, en exécutant :\n\t \n \t\t minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t3) Utiliser le cluster existant à la version Kubernetes {{.old}}, en exécutant :\n\t \n\t\t minikube start {{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t \t", - "1) Recreate the cluster with Kubernetes {{.new}}, by running:\n\t \n\t\t minikube delete{{.profile}}\n\t\t minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t2) Create a second cluster with Kubernetes {{.new}}, by running:\n\t \n\t\t minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t3) Use the existing cluster at version Kubernetes {{.old}}, by running:\n\t \n\t\t minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t": "1) Recréez le cluster avec Kubernetes {{.new}}, en exécutant :\n\t \n\t\t minikube delete {{.profile}}\n\t\t minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t2) Créez un deuxième cluster avec Kubernetes {{.new}}, en exécutant :\n\t \n \t\t minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t3) Utiliser le cluster existant à la version Kubernetes {{.old}}, en exécutant :\n\t \n\t\t minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t \t", - "1) Recreate the cluster with Kubernetes {{.new}}, by running:\n\n\t\t minikube delete{{.profile}}\n\t\t minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\n\t\t2) Create a second cluster with Kubernetes {{.new}}, by running:\n\n\t\t minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\n\t\t3) Use the existing cluster at version Kubernetes {{.old}}, by running:\n\n\t\t minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t": "", + "1) Recreate the cluster with Kubernetes {{.new}}, by running:\n\t \n\t\t minikube delete {{.profile}}\n\t\t minikube start {{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t2) Create a second cluster with Kubernetes {{.new}}, by running:\n\t \n\t\t minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t3) Use the existing cluster at version Kubernetes {{.old}}, by running:\n\t \n\t\t minikube start {{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t": "1) Recréez le cluster avec Kubernetes {{.new}}, en exécutant :\n\t \n\t\t minikube delete {{.profile}}\n\t\t minikube start {{.profile}} - -kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t2) Créez un deuxième cluster avec Kubernetes {{.new}}, en exécutant :\n\t \n \t\t minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t3) Utilisez le cluster existant à la version Kubernetes {{.old}}, en exécutant :\n\t \n\t\t minikube start {{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t \t", + "1) Recreate the cluster with Kubernetes {{.new}}, by running:\n\t \n\t\t minikube delete{{.profile}}\n\t\t minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t2) Create a second cluster with Kubernetes {{.new}}, by running:\n\t \n\t\t minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t3) Use the existing cluster at version Kubernetes {{.old}}, by running:\n\t \n\t\t minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t": "1) Recréez le cluster avec Kubernetes {{.new}}, en exécutant :\n\t \n\t\t minikube delete {{.profile}}\n\t\t minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t2) Créez un deuxième cluster avec Kubernetes {{.new}}, en exécutant :\n\t \n \t\t minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\t \n\t\t3) Utilisez le cluster existant à la version Kubernetes {{.old}}, en exécutant :\n\t \n\t\t minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t \t", + "1) Recreate the cluster with Kubernetes {{.new}}, by running:\n\n\t\t minikube delete{{.profile}}\n\t\t minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\n\t\t2) Create a second cluster with Kubernetes {{.new}}, by running:\n\n\t\t minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\n\t\t3) Use the existing cluster at version Kubernetes {{.old}}, by running:\n\n\t\t minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t": "1) Recréez le cluster avec Kubernetes {{.new}}, en exécutant :\n\n\t\t minikube delete{{.profile}}\n\t\t minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.new}}\n\n\t\t2) Créez un deuxième cluster avec Kubernetes {{.new}}, en exécutant :\n\n\t\t minikube start -p {{.suggestedName}} --kubernetes-version={{.prefix}}{{.new}}\n\n\t\t3) Utilisez le cluster existant à la version Kubernetes {{.old}}, en exécutant :\n\n\t\t minikube start{{.profile}} --kubernetes-version={{.prefix}}{{.old}}\n\t\t", "1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"CPUs\" slider bar to 2 or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "1. Cliquez sur l'icône de menu \"Docker for Desktop\"\n\t\t\t2. Cliquez sur \"Preferences\"\n\t\t\t3. Cliquez sur \"Ressources\"\n\t\t\t4. Augmentez la barre de défilement \"CPU\" à 2 ou plus\n\t\t\t5. Cliquez sur \"Apply \u0026 Restart\"", "1. Click on \"Docker for Desktop\" menu icon\n\t\t\t2. Click \"Preferences\"\n\t\t\t3. Click \"Resources\"\n\t\t\t4. Increase \"Memory\" slider bar to {{.recommend}} or higher\n\t\t\t5. Click \"Apply \u0026 Restart\"": "1. Cliquez sur l'icône de menu \"Docker for Desktop\"\n\t\t\t2. Cliquez sur \"Preferences\"\n\t\t\t3. Cliquez sur \"Ressources\"\n\t\t\t4. Augmentez la barre de défilement \"Memory\" à {{.recommend}} ou plus\n\t\t\t5. Cliquez sur \"Apply \u0026 Restart\"", "1. Open the \"Docker Desktop\" menu by clicking the Docker icon in the system tray\n\t\t2. Click \"Settings\"\n\t\t3. Click \"Resources\"\n\t\t4. Increase \"CPUs\" slider bar to 2 or higher\n\t\t5. Click \"Apply \u0026 Restart\"": "1. Ouvrez le menu \"Docker Desktop\" en cliquant sur l'icône Docker dans la barre d'état système\n\t\t2. Cliquez sur \"Settings\"\n\t\t3. Cliquez sur \"Ressources\"\n\t\t4. Augmentez la barre de défilement \"CPU\" à 2 ou plus\n\t\t5. Cliquez sur \"Apply \u0026 Restart\"", @@ -77,7 +77,7 @@ "Alternatively you could install one of these drivers:": "Vous pouvez également installer l'un de ces pilotes :", "Amount of time to wait for a service in seconds": "Temps d'attente pour un service en secondes", "Amount of time to wait for service in seconds": "Temps d'attente pour un service en secondes", - "An optional configuration file to read addon specific configs from instead of being prompted each time.": "", + "An optional configuration file to read addon specific configs from instead of being prompted each time.": "Un fichier de configuration facultatif pour lire les configurations spécifiques aux modules complémentaires au lieu d'être invité à chaque fois.", "Another hypervisor, such as VirtualBox, is conflicting with KVM. Please stop the other hypervisor, or use --driver to switch to it.": "Un autre hyperviseur, tel que VirtualBox, est en conflit avec KVM. Veuillez arrêter l'autre hyperviseur ou utiliser --driver pour y basculer.", "Another minikube instance is downloading dependencies... ": "Une autre instance minikube télécharge des dépendances", "Another program is using a file required by minikube. If you are using Hyper-V, try stopping the minikube VM from within the Hyper-V manager": "Un autre programme utilise un fichier requis par minikube. Si vous utilisez Hyper-V, essayez d'arrêter la machine virtuelle minikube à partir du gestionnaire Hyper-V", @@ -125,7 +125,7 @@ "Configure an external network switch following the official documentation, then add `--hyperv-virtual-switch=\u003cswitch-name\u003e` to `minikube start`": "Configurez un commutateur réseau externe en suivant la documentation officielle, puis ajoutez `--hyperv-virtual-switch=\u003cswitch-name\u003e` à `minikube start`", "Configure environment to use minikube's Docker daemon": "Configurer l'environnement pour utiliser le démon Docker de minikube", "Configure environment to use minikube's Podman service": "Configurer l'environnement pour utiliser le service Podman de minikube", - "Configure vmnet-helper to run without a password.\n\n\t\tPlease install a vmnet-helper sudoers rule using these instructions:\n\n\t\thttps://github.com/nirs/vmnet-helper#granting-permission-to-run-vmnet-helper": "", + "Configure vmnet-helper to run without a password.\n\n\t\tPlease install a vmnet-helper sudoers rule using these instructions:\n\n\t\thttps://github.com/nirs/vmnet-helper#granting-permission-to-run-vmnet-helper": "Configurez vmnet-helper pour qu'il s'exécute sans mot de passe.\n\n\t\tVeuillez installer une règle sudoers vmnet-helper en suivant ces instructions :\n\n\t\thttps://github.com/nirs/vmnet-helper#granting-permission-to-run-vmnet-helper", "Configures the addon w/ADDON_NAME within minikube (example: minikube addons configure registry-creds). For a list of available addons use: minikube addons list": "Configure le module w/ADDON_NAME dans minikube (exemple : minikube addons configure registry-creds). Pour une liste des modules disponibles, utilisez : minikube addons list", "Configuring RBAC rules ...": "Configuration des règles RBAC ...", "Configuring local host environment ...": "Configuration de l'environnement de l'hôte local...", @@ -380,13 +380,13 @@ "If set, pause all namespaces": "Si défini, suspend tous les espaces de noms", "If set, unpause all namespaces": "Si défini, annule la pause de tous les espaces de noms", "If the above advice does not help, please let us know:": "Si les conseils ci-dessus ne vous aident pas, veuillez nous en informer :", - "If the host has a firewall:\n\t\t\n\t\t1. Allow a port through the firewall\n\t\t2. Specify \"--port=\u003cport_number\u003e\" for \"minikube mount\"": "Si l'hôte dispose d'un pare-feu :\n\t\t\n\t\t1. Autoriser un port à travers le pare-feu\n\t\t2. Spécifiez \"--port=\u003cport_number\u003e\" pour \"minikube mount\"", - "If the host has a firewall:\n\n\t\t1. Allow a port through the firewall\n\t\t2. Specify \"--port=\u003cport_number\u003e\" for \"minikube mount\"": "", + "If the host has a firewall:\n\t\t\n\t\t1. Allow a port through the firewall\n\t\t2. Specify \"--port=\u003cport_number\u003e\" for \"minikube mount\"": "Si l'hôte dispose d'un pare-feu :\n\t\t\n\t\t1. Autoriser un port à traverser le pare-feu\n\t\t2. Spécifiez \"--port=\u003cport_number\u003e\" pour \"minikube mount\"", + "If the host has a firewall:\n\n\t\t1. Allow a port through the firewall\n\t\t2. Specify \"--port=\u003cport_number\u003e\" for \"minikube mount\"": "Si l'hôte dispose d'un pare-feu :\n\n\t\t1. Autoriser un port à traverser le pare-feu\n\t\t2. Spécifier « --port=\u003cport_number\u003e » pour \"minikube mount\"", "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none.": "Si vrai, met en cache les images Docker pour le programme d'amorçage actuel et les charge dans la machine. Toujours faux avec --driver=none.", "If true, only download and cache files for later use - don't install or start anything.": "Si la valeur est \"true\", téléchargez les fichiers et mettez-les en cache uniquement pour une utilisation future. Ne lancez pas d'installation et ne commencez aucun processus.", "If true, pods might get deleted and restarted on addon enable": "Si vrai, les pods peuvent être supprimés et redémarrés lors addon enable", "If true, print web links to addons' documentation if using --output=list (default).": "Si vrai, affiche les liens Web vers la documentation des addons si vous utilisez --output=list (défaut).", - "If true, returns a detailed list of profiles.": "", + "If true, returns a detailed list of profiles.": "Si vrai, renvoie une liste détaillée des profils.", "If true, returns list of profiles faster by skipping validating the status of the cluster.": "Si vrai, renvoie la liste des profils plus rapidement en ignorant la validation de l'état du cluster.", "If true, the added node will be marked for work. Defaults to true.": "Si vrai, le nœud ajouté sera marqué pour le travail. La valeur par défaut est true.", "If true, the node added will also be a control plane in addition to a worker.": "Si vrai, le nœud ajouté sera également un plan de contrôle en plus d'un travailleur.", @@ -487,7 +487,7 @@ "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 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, kvm2, and qemu2 drivers)": "Nombre de disques supplémentaires créés et attachés à la machine virtuelle minikube (actuellement uniquement implémenté pour les pilotes hyperkit, kvm2 et qemu2)", - "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit, kvm2, qemu2, and vfkit drivers)": "", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit, kvm2, qemu2, and vfkit drivers)": "Nombre de disques supplémentaires créés et attachés à la VM minikube (actuellement implémenté uniquement pour les pilotes hyperkit, kvm2, qemu2 et vfkit)", "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}}", "One of 'text', 'yaml' or 'json'.": "Un parmi 'text', 'yaml' ou 'json'.", @@ -784,9 +784,9 @@ "The node {{.name}} network is not available. Please verify network settings.": "Le réseau du nœud {{.name}} n'est pas disponible. Veuillez vérifier les paramètres réseau.", "The none driver is not compatible with multi-node clusters.": "Le pilote none n'est pas compatible avec les clusters multi-nœuds.", "The none driver with Kubernetes v1.24+ and the docker container-runtime requires cri-dockerd.\n\t\t\n\t\tPlease install cri-dockerd using these instructions:\n\n\t\thttps://github.com/Mirantis/cri-dockerd": "Le pilote none avec Kubernetes v1.24+ et l'environnement d'exécution du conteneur docker nécessitent cri-dockerd.\n\t\t\n\t\tVeuillez installer cri-dockerd en suivant ces instructions :\n\n\t\thttps://github.com/Mirantis/cri-dockerd", - "The none driver with Kubernetes v1.24+ and the docker container-runtime requires cri-dockerd.\n\n\t\tPlease install cri-dockerd using these instructions:\n\n\t\thttps://github.com/Mirantis/cri-dockerd": "", + "The none driver with Kubernetes v1.24+ and the docker container-runtime requires cri-dockerd.\n\n\t\tPlease install cri-dockerd using these instructions:\n\n\t\thttps://github.com/Mirantis/cri-dockerd": "Le pilote none avec Kubernetes v1.24+ et le conteneur runtime Docker nécessitent cri-dockerd.\n\n\t\tVeuillez installer cri-dockerd en suivant ces instructions :\n\n\t\thttps://github.com/Mirantis/cri-dockerd", "The none driver with Kubernetes v1.24+ and the docker container-runtime requires dockerd.\n\t\t\n\t\tPlease install dockerd using these instructions:\n\n\t\thttps://docs.docker.com/engine/install/": "Le pilote none avec Kubernetes v1.24+ et l'environnement d'exécution du conteneur docker nécessitent dockerd.\n\t\t\n\t\tVeuillez installer dockerd en suivant ces instructions :\n\n\t\thttps://docs.docker.com/engine/install/", - "The none driver with Kubernetes v1.24+ and the docker container-runtime requires dockerd.\n\n\t\tPlease install dockerd using these instructions:\n\n\t\thttps://docs.docker.com/engine/install/": "", + "The none driver with Kubernetes v1.24+ and the docker container-runtime requires dockerd.\n\n\t\tPlease install dockerd using these instructions:\n\n\t\thttps://docs.docker.com/engine/install/": "Le pilote none avec Kubernetes v1.24+ et le conteneur runtime Docker nécessitent dockerd.\n\n\t\tVeuillez installer dockerd en suivant ces instructions :\n\n\t\thttps://docs.docker.com/engine/install/", "The none driver with Kubernetes v1.24+ requires containernetworking-plugins.\n\n\t\tPlease install containernetworking-plugins using these instructions:\n\n\t\thttps://minikube.sigs.k8s.io/docs/faq/#how-do-i-install-containernetworking-plugins-for-none-driver": "Le pilote none avec Kubernetes v1.24+ nécessite containernetworking-plugins.\n\n\t\tVeuillez installer containernetworking-plugins en suivant ces instructions :\n\n\t\thttps://minikube.sigs.k8s.io/docs /faq/#how-do-i-install-containernetworking-plugins-for-none-driver", "The number of bytes to use for 9p packet payload": "Le nombre d'octets à utiliser pour la charge utile du paquet 9p", "The number of nodes to spin up. Defaults to 1.": "Le nombre de nœuds à faire tourner. La valeur par défaut est 1.", @@ -807,7 +807,7 @@ "The total number of nodes to spin up. Defaults to 1.": "Le nombre total de nœuds à faire tourner. La valeur par défaut est 1.", "The value passed to --format is invalid": "La valeur passée à --format n'est pas valide", "The value passed to --format is invalid: {{.error}}": "La valeur passée à --format n'est pas valide : {{.error}}", - "The vfkit driver is only supported on macOS": "", + "The vfkit driver is only supported on macOS": "Le pilote vfkit n'est pris en charge que sur macOS", "The {{.addon}} addon is only supported with the KVM driver.\n\nFor GPU setup instructions see: https://minikube.sigs.k8s.io/docs/tutorials/nvidia/": "Le module complémentaire {{.addon}} n'est pris en charge qu'avec le pilote KVM.\n\nPour les instructions de configuration du GPU, consultez : https://minikube.sigs.k8s.io/docs/tutorials/nvidia/", "There are a couple ways to enable the required file sharing:\n1. Enable \"Use the WSL 2 based engine\" in Docker Desktop\nor\n2. Enable file sharing in Docker Desktop for the %s%s directory": "Il existe plusieurs manières d'activer le partage de fichiers requis :\n1. Activez \"Utiliser le moteur basé sur WSL 2\" dans Docker Desktop\nou\n2. Activer le partage de fichiers dans Docker Desktop pour le répertoire %s%s", "These --extra-config parameters are invalid: {{.invalid_extra_opts}}": "Ces paramètres --extra-config ne sont pas valides : {{.invalid_extra_opts}}", @@ -830,7 +830,7 @@ "To access YAKD - Kubernetes Dashboard, wait for Pod to be ready and run the following command:\n\n\tminikube{{.profileArg}} service yakd-dashboard -n yakd-dashboard\n": "Pour accéder à YAKD - Kubernetes Dashboard, attendez que le Pod soit prêt et exécutez la commande suivante :\n\n\tminikube{{.profileArg}} service yakd-dashboard -n yakd-dashboard\n", "To access YAKD - Kubernetes Dashboard, wait for Pod to be ready and run the following command:\n\n\tminikube{{.profileArg}} service yakd-dashboard -n yakd-dashboard\n\n": "Pour accéder à YAKD - Kubernetes Dashboard, attendez que le Pod soit prêt et exécutez la commande suivante :\n\n\tminikube{{.profileArg}} service yakd-dashboard -n yakd-dashboard\n\n", "To authenticate in Headlamp, fetch the Authentication Token using the following command:\n\nexport SECRET=$(kubectl get secrets --namespace headlamp -o custom-columns=\":metadata.name\" | grep \"headlamp-token\")\nkubectl get secret $SECRET --namespace headlamp --template=\\{\\{.data.token\\}\\} | base64 --decode\n\t\t\t\n": "Pour vous authentifier dans Headlamp, récupérez le jeton d'authentification à l'aide de la commande suivante :\n\nexport SECRET=$(kubectl get secrets --namespace headlamp -o custom-columns=\":metadata.name\" | grep \"headlamp-token \")\nkubectl get secret $SECRET --namespace headlamp --template=\\{\\{.data.token\\}\\} | base64 --decode\n\t\t\t\n", - "To configure vment-helper to run without a password, please check the documentation:": "", + "To configure vment-helper to run without a password, please check the documentation:": "Pour configurer vment-helper pour qu'il s'exécute sans mot de passe, veuillez consulter la documentation :", "To connect to this cluster, use: --context={{.name}}": "Pour vous connecter à ce cluster, utilisez : --context={{.name}}", "To connect to this cluster, use: kubectl --context={{.profile_name}}": "Pour vous connecter à ce cluster, utilisez : kubectl --context={{.profile_name}}", "To disable beta notices, run: 'minikube config set WantBetaUpdateNotification false'": "Pour désactiver les notifications bêta, exécutez : 'minikube config set WantBetaUpdateNotification false'", @@ -848,8 +848,8 @@ "Try one or more of the following to free up space on the device:\n\t\n\t\t\t1. Run \"docker system prune\" to remove unused Docker data (optionally with \"-a\")\n\t\t\t2. Increase the storage allocated to Docker for Desktop by clicking on:\n\t\t\t\tDocker icon \u003e Preferences \u003e Resources \u003e Disk Image Size\n\t\t\t3. Run \"minikube ssh -- docker system prune\" if using the Docker container runtime": "Essayez une ou plusieurs des solutions suivantes pour libérer de l'espace sur l'appareil :\n\t\n\t\t\t1. Exécutez \"docker system prune\" pour supprimer les données Docker inutilisées (éventuellement avec \"-a\")\n\t\t\t2. Augmentez le stockage alloué à Docker for Desktop en cliquant sur :\n\t\t\t\tIcône Docker \u003e Settings \u003e Ressources \u003e Disk Image Size\n\t\t\t3. Exécutez \"minikube ssh -- docker system prune\" si vous utilisez l'environnement d'exécution du conteneur Docker", "Try one or more of the following to free up space on the device:\n\t\n\t\t\t1. Run \"docker system prune\" to remove unused Docker data (optionally with \"-a\")\n\t\t\t2. Increase the storage allocated to Docker for Desktop by clicking on:\n\t\t\t\tDocker icon \u003e Settings \u003e Resources \u003e Disk Image Size\n\t\t\t3. Run \"minikube ssh -- docker system prune\" if using the Docker container runtime": "Essayez une ou plusieurs des solutions suivantes pour libérer de l'espace sur l'appareil :\n\t\n\t\t\t1. Exécutez \"docker system prune\" pour supprimer les données Docker inutilisées (éventuellement avec \"-a\")\n\t\t\t2. Augmentez le stockage alloué à Docker for Desktop en cliquant sur :\n\t\t\t\tIcône Docker \u003e Préférences \u003e Ressources \u003e Taille de l'image disque\n\t\t\t3. Exécutez \"minikube ssh -- docker system prune\" si vous utilisez l'environnement d'exécution du conteneur Docker", "Try one or more of the following to free up space on the device:\n\t\n\t\t\t1. Run \"sudo podman system prune\" to remove unused podman data\n\t\t\t2. Run \"minikube ssh -- docker system prune\" if using the Docker container runtime": "Essayez une ou plusieurs des solutions suivantes pour libérer de l'espace sur l'appareil :\n\t\n\t\t\t1. Exécutez \"sudo podman system prune\" pour supprimer les données podman inutilisées\n\t\t\t2. Exécutez \"minikube ssh -- docker system prune\" si vous utilisez l'environnement d'exécution du conteneur Docker", - "Try one or more of the following to free up space on the device:\n\n\t\t\t1. Run \"docker system prune\" to remove unused Docker data (optionally with \"-a\")\n\t\t\t2. Increase the storage allocated to Docker for Desktop by clicking on:\n\t\t\t\tDocker icon \u003e Preferences \u003e Resources \u003e Disk Image Size\n\t\t\t3. Run \"minikube ssh -- docker system prune\" if using the Docker container runtime": "", - "Try one or more of the following to free up space on the device:\n\n\t\t\t1. Run \"sudo podman system prune\" to remove unused podman data\n\t\t\t2. Run \"minikube ssh -- docker system prune\" if using the Docker container runtime": "", + "Try one or more of the following to free up space on the device:\n\n\t\t\t1. Run \"docker system prune\" to remove unused Docker data (optionally with \"-a\")\n\t\t\t2. Increase the storage allocated to Docker for Desktop by clicking on:\n\t\t\t\tDocker icon \u003e Preferences \u003e Resources \u003e Disk Image Size\n\t\t\t3. Run \"minikube ssh -- docker system prune\" if using the Docker container runtime": "Essayez une ou plusieurs des solutions suivantes pour libérer de l'espace sur l'appareil :\n\n\t\t\t1. Exécutez « docker system prune » pour supprimer les données Docker inutilisées (éventuellement avec « -a »).\n\t\t\t2. Augmentez l'espace de stockage alloué à Docker for Desktop en cliquant sur :\n\t\t\t\tIcône Docker \u003e Préférences \u003e Ressources \u003e Taille de l'image disque\n\t\t\t3. Exécutez « minikube ssh -- docker system prune » si vous utilisez l'environnement d'exécution de conteneur Docker.", + "Try one or more of the following to free up space on the device:\n\n\t\t\t1. Run \"sudo podman system prune\" to remove unused podman data\n\t\t\t2. Run \"minikube ssh -- docker system prune\" if using the Docker container runtime": "Essayez une ou plusieurs des solutions suivantes pour libérer de l'espace sur l'appareil :\n\n\t\t\t1. Exécutez « sudo podman system prune » pour supprimer les données podman inutilisées.\n\t\t\t2. Exécutez « minikube ssh -- docker system prune » si vous utilisez l'environnement d'exécution de conteneur Docker.", "Trying to delete invalid profile {{.profile}}": "Tentative de suppression du profil non valide {{.profile}}", "Tunnel successfully started": "Tunnel démarré avec succès", "Unable to bind flags": "Impossible de lier les indicateurs", @@ -895,7 +895,7 @@ "Unable to remove machine directory": "Impossible de supprimer le répertoire de la machine", "Unable to restart cluster, will reset it: {{.error}}": "Impossible de redémarrer le cluster, va être réinitialisé : {{.error}}", "Unable to restart control-plane node(s), will reset cluster: {{.error}}": "Impossible de redémarrer le(s) nœud(s) du plan de contrôle, le cluster sera réinitialisé : {{.error}}", - "Unable to run vmnet-helper without a password": "", + "Unable to run vmnet-helper without a password": "Impossible d'exécuter vmnet-helper sans mot de passe", "Unable to safely downgrade existing Kubernetes v{{.old}} cluster to v{{.new}}": "Impossible de rétrograder en toute sécurité le cluster Kubernetes v{{.old}} existant vers v{{.new}}", "Unable to stop VM": "Impossible d'arrêter la VM", "Unable to update {{.driver}} driver: {{.error}}": "Impossible de mettre à jour le pilote {{.driver}} : {{.error}}", @@ -1019,7 +1019,7 @@ "call with cleanup=true to remove old tunnels": "appelez avec cleanup=true pour supprimer les anciens tunnels", "cancel any existing scheduled stop requests": "annuler toutes les demandes d'arrêt programmées existantes", "cannot specify --kubernetes-version with --no-kubernetes,\nto unset a global config run:\n\n$ minikube config unset kubernetes-version": "impossible de spécifier --kubernetes-version avec --no-kubernetes,\npour désactiver une configuration globale, exécutez :\n\n$ minikube config unset kubernetes-version", - "config file does not exist": "", + "config file does not exist": "le fichier de configuration n'existe pas", "config modifies minikube config files using subcommands like \"minikube config set driver kvm2\"\nConfigurable fields: \n\n": "config modifie les fichiers de configuration de minikube à l'aide de sous-commandes telles que \"minikube config set driver kvm2\"\nChamps configurables : \n\n", "config view failed": "échec de la vue de configuration", "containers paused status: {{.paused}}": "état des conteneurs en pause : {{.paused}}", @@ -1047,7 +1047,7 @@ "error: --output must be 'text', 'yaml' or 'json'": "erreur : --output doit être 'text', 'yaml' ou 'json'", "error: --output must be 'yaml' or 'json'": "erreur : --output doit être 'yaml' ou 'json'", "experimental": "expérimental", - "extra waiting: {{.error}}": "", + "extra waiting: {{.error}}": "attente supplémentaire : {{.error}}", "failed to acquire lock due to unexpected error": "échec de l'acquisition du verrou en raison d'une erreur inattendue", "failed to add node": "échec de l'ajout du nœud", "failed to load profile: {{.error}}": "échec du chargement du profil : {{.error}}", @@ -1057,7 +1057,7 @@ "failed to set cloud shell kubelet config options": "échec de la définition des options de configuration cloud shell kubelet", "failed to set extra option": "impossible de définir une option supplémentaire", "failed to start node": "échec du démarrage du nœud", - "failed to validate {{.network}} network: {{.reason}}": "", + "failed to validate {{.network}} network: {{.reason}}": "échec de validation du réseau {{.network}} : {{.reason}}", "false": "faux", "fish completion failed": "la complétion fish a échoué", "fish completion.": "complétion fish.", @@ -1107,7 +1107,7 @@ "namespaces to pause": "espaces de noms à mettre en pause", "namespaces to unpause": "espaces de noms à réactiver", "network to run minikube with. Now it is used by docker/podman and KVM drivers. If left empty, minikube will create a new network.": "réseau avec lequel exécuter minikube. Maintenant, il est utilisé par les pilotes docker/podman et KVM. Si laissé vide, minikube créera un nouveau réseau.", - "network to run minikube with. Used by docker/podman, qemu, kvm, and vfkit drivers. If left empty, minikube will create a new network.": "", + "network to run minikube with. Used by docker/podman, qemu, kvm, and vfkit drivers. If left empty, minikube will create a new network.": "Réseau pour exécuter Minikube. Utilisé par les pilotes Docker/Podman, Qemu, KVM et VfKit. Si ce champ est vide, Minikube crée un nouveau réseau.", "none driver does not support multi-node clusters": "aucun pilote ne prend pas en charge les clusters multi-nœuds", "not enough arguments ({{.ArgCount}}).\nusage: minikube config set PROPERTY_NAME PROPERTY_VALUE": "pas assez d'arguments ({{.ArgCount}}).\nusage : minikube config set PROPERTY_NAME PROPERTY_VALUE", "numa node is only supported on k8s v1.18 and later": "le nœud numa n'est pris en charge que sur k8s v1.18 et versions ultérieures", From 16ff3bf929fd6c5441ec835613b42ffcd387d9cb Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Tue, 17 Jun 2025 10:56:36 -0700 Subject: [PATCH 39/60] CI: Update gh from 2.74.0 to 2.74.1 (#20937) --- hack/jenkins/installers/check_install_gh.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/jenkins/installers/check_install_gh.sh b/hack/jenkins/installers/check_install_gh.sh index 01a509f8d1..e5cbed2c7c 100755 --- a/hack/jenkins/installers/check_install_gh.sh +++ b/hack/jenkins/installers/check_install_gh.sh @@ -16,7 +16,7 @@ set -eux -o pipefail -GH_VERSION="2.74.0" +GH_VERSION="2.74.1" echo "Installing latest version of gh" curl -qLO "https://github.com/cli/cli/releases/download/v${GH_VERSION}/gh_${GH_VERSION}_linux_amd64.tar.gz" From bea459a7c4edffc86378f11365a491eaccab33f4 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Tue, 17 Jun 2025 10:58:35 -0700 Subject: [PATCH 40/60] Addon kubevirt: Update bitnami/kubectl image from 1.33.1 to 1.33.1 (#20939) --- 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 f04aab6013..c2c9edf86b 100644 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -334,7 +334,7 @@ var Addons = map[string]*Addon{ "pod.yaml", "0640"), }, false, "kubevirt", "3rd party (KubeVirt)", "", "https://minikube.sigs.k8s.io/docs/handbook/addons/kubevirt/", map[string]string{ - "Kubectl": "bitnami/kubectl:1.33.1@sha256:c963598a2143300db1c74b9a2cc0091511daabaf3eaa0fd8643bc241a15024f3", + "Kubectl": "bitnami/kubectl:1.33.1@sha256:9081a6f83f4febf47369fc46b6f0f7683c7db243df5b43fc9defe51b0471a950", }, map[string]string{ "Kubectl": "docker.io", }), From 2da22073d156ae594858eb7c6255bc62353bbcc7 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 23 Jun 2025 11:57:31 -0700 Subject: [PATCH 41/60] site: Update node from 20.19.2 to 20.19.3 (#20974) --- netlify.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netlify.toml b/netlify.toml index 680a4eb959..c49060fe8c 100644 --- a/netlify.toml +++ b/netlify.toml @@ -4,7 +4,7 @@ publish = "site/public/" command = "pwd && cd themes/docsy && npm install && git submodule update -f --init && cd ../.. && hugo" [build.environment] -NODE_VERSION = "20.19.2" +NODE_VERSION = "20.19.3" HUGO_VERSION = "v0.147.8" [context.production.environment] From 4bea142841ec50b6e242449aa5101de659e54e68 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 23 Jun 2025 11:57:49 -0700 Subject: [PATCH 42/60] CI: Update gotestsum from v1.12.2 to v1.12.3 (#20975) --- hack/jenkins/common.ps1 | 2 +- hack/jenkins/installers/check_install_gotestsum.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hack/jenkins/common.ps1 b/hack/jenkins/common.ps1 index fdda3f626f..c9e0563700 100644 --- a/hack/jenkins/common.ps1 +++ b/hack/jenkins/common.ps1 @@ -69,7 +69,7 @@ gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/installers/check # Download gopogh and gotestsum go install github.com/medyagh/gopogh/cmd/gopogh@v0.29.0 -go install gotest.tools/gotestsum@v1.12.2 +go install gotest.tools/gotestsum@v1.12.3 # temporary: remove the old install of gopogh & gotestsum as it's taking priority over our current install, preventing updating if (Test-Path "C:\Go") { Remove-Item "C:\Go" -Recurse -Force diff --git a/hack/jenkins/installers/check_install_gotestsum.sh b/hack/jenkins/installers/check_install_gotestsum.sh index e666d59422..52b1b35d6a 100755 --- a/hack/jenkins/installers/check_install_gotestsum.sh +++ b/hack/jenkins/installers/check_install_gotestsum.sh @@ -18,7 +18,7 @@ set -eux -o pipefail function install_gotestsum() { rm -f $(which gotestsum) - GOBIN="$GOROOT/bin" go install gotest.tools/gotestsum@v1.12.2 + GOBIN="$GOROOT/bin" go install gotest.tools/gotestsum@v1.12.3 } which gotestsum || install_gotestsum From dbebd8768e0d52c502a083a92eab81c535cd8e86 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 23 Jun 2025 11:58:24 -0700 Subject: [PATCH 43/60] CI: Update gh from 2.74.1 to 2.74.2 (#20967) --- hack/jenkins/installers/check_install_gh.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/jenkins/installers/check_install_gh.sh b/hack/jenkins/installers/check_install_gh.sh index e5cbed2c7c..68aadef82d 100755 --- a/hack/jenkins/installers/check_install_gh.sh +++ b/hack/jenkins/installers/check_install_gh.sh @@ -16,7 +16,7 @@ set -eux -o pipefail -GH_VERSION="2.74.1" +GH_VERSION="2.74.2" echo "Installing latest version of gh" curl -qLO "https://github.com/cli/cli/releases/download/v${GH_VERSION}/gh_${GH_VERSION}_linux_amd64.tar.gz" From 54b8312d20414e8752981fa8ea637f3a352d386c Mon Sep 17 00:00:00 2001 From: Jeff MAURY Date: Mon, 23 Jun 2025 20:58:51 +0200 Subject: [PATCH 44/60] Fix french translation (#20964) Signed-off-by: Jeff MAURY --- translations/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translations/fr.json b/translations/fr.json index 22c125d7d8..055fb3fc95 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -1155,7 +1155,7 @@ "using metrics-server addon, heapster is deprecated": "utilisation du module metrics-server, heapster est obsolète", "version json failure": "échec de la version du JSON", "version yaml failure": "échec de la version du YAML", - "vmnet-helper was not found on the system, resolve by:\n\n\t\tOption 1) Installing vmnet-helper:\n\n\t\t https://github.com/nirs/vmnet-helper#installation\n\n\t\tOption 2) Using the nat network:\n\n\t\t minikube start{{.profile}} --driver vfkit --network nat": "", + "vmnet-helper was not found on the system, resolve by:\n\n\t\tOption 1) Installing vmnet-helper:\n\n\t\t https://github.com/nirs/vmnet-helper#installation\n\n\t\tOption 2) Using the nat network:\n\n\t\t minikube start{{.profile}} --driver vfkit --network nat": "vmnet-helper n'a pas été trouvé sur le système, résolvez le problème par :\n\n\t\tOption 1) Installation de vmnet-helper :\n\n\t\t https://github.com/nirs/vmnet-helper#installation\n\n\t\tOption 2) Utilisation du réseau NAT :\n\n\t\t minikube start{{.profile}} --driver vfkit --network nat", "yaml encoding failure": "échec de l'encodage yaml", "zsh completion failed": "complétion de zsh en échec", "zsh completion.": "complétion zsh.", From 989a077ac41d3b24d04d13478a081516f7b5c696 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 23 Jun 2025 11:59:41 -0700 Subject: [PATCH 45/60] CNI: Update calico from v3.30.1 to v3.30.2 (#20971) --- pkg/minikube/bootstrapper/images/images.go | 2 +- pkg/minikube/cni/calico.yaml | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/pkg/minikube/bootstrapper/images/images.go b/pkg/minikube/bootstrapper/images/images.go index a4c5f30408..40d612e2ce 100644 --- a/pkg/minikube/bootstrapper/images/images.go +++ b/pkg/minikube/bootstrapper/images/images.go @@ -185,7 +185,7 @@ func KindNet(repo string) string { } // all calico images are from https://github.com/projectcalico/calico/blob/master/manifests/calico.yaml -const calicoVersion = "v3.30.1" +const calicoVersion = "v3.30.2" const calicoRepo = "docker.io/calico" // CalicoDaemonSet returns the image used for calicoDaemonSet diff --git a/pkg/minikube/cni/calico.yaml b/pkg/minikube/cni/calico.yaml index fa70e49a2c..dcec8f6d22 100644 --- a/pkg/minikube/cni/calico.yaml +++ b/pkg/minikube/cni/calico.yaml @@ -525,6 +525,8 @@ spec: Option to keep the original nexthop field when routes are sent to a BGP Peer. Setting "true" configures the selected BGP Peers node to use the "next hop keep;" instead of "next hop self;"(default) in the specific branch of the Node on "bird.cfg". + Note: that this field is deprecated. Users should use the NextHopMode field to control + the next hop attribute for a BGP peer. type: boolean localWorkloadSelector: description: |- @@ -536,6 +538,26 @@ spec: Time to allow for software restart. When specified, this is configured as the graceful restart timeout. When not specified, the BIRD default of 120s is used. type: string + nextHopMode: + allOf: + - enum: + - Auto + - Self + - Keep + - enum: + - Auto + - Self + - Keep + description: |- + NextHopMode defines the method of calculating the next hop attribute for received routes. + This replaces and expands the deprecated KeepOriginalNextHop field. + Users should use this setting to control the next hop attribute for a BGP peer. + When this is set, the value of the KeepOriginalNextHop field is ignored. + if neither keepOriginalNextHop or nextHopMode is specified, BGP's default behaviour is used. + Set it to “Auto” to apply BGP’s default behaviour. + Set it to "Self" to configure "next hop self;" in "bird.cfg". + Set it to "Keep" to configure "next hop keep;" in "bird.cfg". + type: string node: description: |- The node name identifying the Calico node instance that is targeted by this peer. From db95e211d14c54a540cd99840d8a5dd6209144ff Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 23 Jun 2025 11:59:59 -0700 Subject: [PATCH 46/60] update image constants for kubeadm images (#20960) --- .../constants/constants_kubeadm_images.go | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/pkg/minikube/constants/constants_kubeadm_images.go b/pkg/minikube/constants/constants_kubeadm_images.go index 1d7425e11c..7eb14f0c63 100644 --- a/pkg/minikube/constants/constants_kubeadm_images.go +++ b/pkg/minikube/constants/constants_kubeadm_images.go @@ -18,6 +18,31 @@ package constants var ( KubeadmImages = map[string]map[string]string{ + "v1.33.2": { + "coredns/coredns": "v1.12.0", + "etcd": "3.5.21-0", + "pause": "3.10", + }, + "v1.32.6": { + "coredns/coredns": "v1.11.3", + "etcd": "3.5.16-0", + "pause": "3.10", + }, + "v1.31.10": { + "coredns/coredns": "v1.11.3", + "etcd": "3.5.15-0", + "pause": "3.10", + }, + "v1.30.14": { + "coredns/coredns": "v1.11.3", + "etcd": "3.5.15-0", + "pause": "3.9", + }, + "v1.34.0-alpha.1": { + "coredns/coredns": "v1.12.1", + "etcd": "3.5.21-0", + "pause": "3.10", + }, "v1.33.1": { "coredns/coredns": "v1.12.0", "etcd": "3.5.21-0", From 64e40c6190c65dda679c908414e2de10035f25d7 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 23 Jun 2025 12:01:30 -0700 Subject: [PATCH 47/60] Addon cloud-spanner: Update cloud-spanner-emulator/emulator image from 1.5.34 to 1.5.35 (#20976) --- 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 c2c9edf86b..5fef61b625 100644 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -769,7 +769,7 @@ var Addons = map[string]*Addon{ "cloud-spanner": NewAddon([]*BinAsset{ MustBinAsset(addons.CloudSpanner, "cloud-spanner/deployment.yaml.tmpl", vmpath.GuestAddonsDir, "deployment.yaml", "0640"), }, false, "cloud-spanner", "Google", "", "https://minikube.sigs.k8s.io/docs/handbook/addons/cloud-spanner/", map[string]string{ - "CloudSpanner": "cloud-spanner-emulator/emulator:1.5.34@sha256:f98725ceb484500d858d17916ea4a04e2a83184b5a080a87113770e82c177744", + "CloudSpanner": "cloud-spanner-emulator/emulator:1.5.35@sha256:aee284a39a132636143b2646c38dfd71d366b9d791d1ed1e83c9dd241687f08a", }, map[string]string{ "CloudSpanner": "gcr.io", }), From 157a99d7a80609de5327f93d5df720e2badb400d Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Wed, 25 Jun 2025 11:00:41 -0700 Subject: [PATCH 48/60] update Kubernetes versions list (#20961) --- pkg/minikube/constants/constants_kubernetes_versions.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkg/minikube/constants/constants_kubernetes_versions.go b/pkg/minikube/constants/constants_kubernetes_versions.go index cfeed84f9a..2d454b5da6 100644 --- a/pkg/minikube/constants/constants_kubernetes_versions.go +++ b/pkg/minikube/constants/constants_kubernetes_versions.go @@ -21,6 +21,8 @@ package constants // ValidKubernetesVersions is a list of Kubernetes versions in order from newest to oldest // This is used when outputting Kubernetes versions and to select the latest patch version when unspecified var ValidKubernetesVersions = []string{ + "v1.34.0-alpha.1", + "v1.33.2", "v1.33.1", "v1.33.0", "v1.33.0-rc.1", @@ -29,6 +31,7 @@ var ValidKubernetesVersions = []string{ "v1.33.0-alpha.3", "v1.33.0-alpha.2", "v1.33.0-alpha.1", + "v1.32.6", "v1.32.5", "v1.32.4", "v1.32.3", @@ -42,6 +45,7 @@ var ValidKubernetesVersions = []string{ "v1.32.0-alpha.3", "v1.32.0-alpha.2", "v1.32.0-alpha.1", + "v1.31.10", "v1.31.9", "v1.31.8", "v1.31.7", @@ -58,6 +62,7 @@ var ValidKubernetesVersions = []string{ "v1.31.0-alpha.3", "v1.31.0-alpha.2", "v1.31.0-alpha.1", + "v1.30.14", "v1.30.13", "v1.30.12", "v1.30.11", From b3a45b3f3944a1de2b877aab2bb00ae360c58d94 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Wed, 25 Jun 2025 11:02:15 -0700 Subject: [PATCH 49/60] bump default/newest kubernetes versions (#20963) --- pkg/minikube/constants/constants.go | 4 ++-- site/content/en/docs/commands/start.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/minikube/constants/constants.go b/pkg/minikube/constants/constants.go index cf7df8444a..7a4fdce1b3 100644 --- a/pkg/minikube/constants/constants.go +++ b/pkg/minikube/constants/constants.go @@ -34,10 +34,10 @@ var ( const ( // DefaultKubernetesVersion is the default Kubernetes version - DefaultKubernetesVersion = "v1.33.1" + DefaultKubernetesVersion = "v1.33.2" // NewestKubernetesVersion is the newest Kubernetes version to test against // NOTE: You may need to update coreDNS & etcd versions in pkg/minikube/bootstrapper/images/images.go - NewestKubernetesVersion = "v1.33.1" + NewestKubernetesVersion = "v1.33.2" // OldestKubernetesVersion is the oldest Kubernetes version to test against OldestKubernetesVersion = "v1.20.0" // NoKubernetesVersion is the version used when users does NOT want to install kubernetes diff --git a/site/content/en/docs/commands/start.md b/site/content/en/docs/commands/start.md index 7f2ac9971d..df1cb28752 100644 --- a/site/content/en/docs/commands/start.md +++ b/site/content/en/docs/commands/start.md @@ -73,7 +73,7 @@ minikube start [flags] --interactive Allow user prompts for more information (default true) --iso-url strings Locations to fetch the minikube ISO from. The list depends on the machine architecture. --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.33.1, 'latest' for v1.33.1). Defaults to 'stable'. + --kubernetes-version string The Kubernetes version that the minikube VM will use (ex: v1.2.3, 'stable' for v1.33.2, 'latest' for v1.33.2). Defaults to 'stable'. --kvm-gpu Enable experimental NVIDIA GPU support in minikube --kvm-hidden Hide the hypervisor signature from the guest in minikube (kvm2 driver only) --kvm-network string The KVM default network name. (kvm2 driver only) (default "default") From 21d0a4d2a256f0b3260810bcf689cc3cd28b8125 Mon Sep 17 00:00:00 2001 From: Imran Pochi Date: Wed, 25 Jun 2025 11:16:03 -0700 Subject: [PATCH 50/60] docs: clarify --addons flag description (#20954) Signed-off-by: Imran Pochi --- cmd/minikube/cmd/start_flags.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/minikube/cmd/start_flags.go b/cmd/minikube/cmd/start_flags.go index 67b092891e..0028d50310 100644 --- a/cmd/minikube/cmd/start_flags.go +++ b/cmd/minikube/cmd/start_flags.go @@ -182,7 +182,7 @@ func initMinikubeFlags() { startCmd.Flags().Uint16(mountPortFlag, defaultMountPort, mountPortDescription) startCmd.Flags().String(mountTypeFlag, defaultMountType, mountTypeDescription) startCmd.Flags().String(mountUID, defaultMountUID, mountUIDDescription) - startCmd.Flags().StringSlice(config.AddonListFlag, nil, "Enable addons. see `minikube addons list` for a list of valid addon names.") + startCmd.Flags().StringSlice(config.AddonListFlag, nil, "Enable one or more addons, in a comma-separated format. See `minikube addons list` for a list of valid addon names.") startCmd.Flags().String(criSocket, "", "The cri socket path to be used.") startCmd.Flags().String(networkPlugin, "", "DEPRECATED: Replaced by --cni") startCmd.Flags().Bool(enableDefaultCNI, false, "DEPRECATED: Replaced by --cni=bridge") From 12752de5162e371f61fc2f51c43ce800e263110f Mon Sep 17 00:00:00 2001 From: Imran Pochi Date: Wed, 25 Jun 2025 11:17:03 -0700 Subject: [PATCH 51/60] docs: update mDNS reload instructions (#20955) Signed-off-by: Imran Pochi --- .../content/en/docs/handbook/addons/ingress-dns.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/site/content/en/docs/handbook/addons/ingress-dns.md b/site/content/en/docs/handbook/addons/ingress-dns.md index cfe05c9ce7..4f49f78061 100644 --- a/site/content/en/docs/handbook/addons/ingress-dns.md +++ b/site/content/en/docs/handbook/addons/ingress-dns.md @@ -291,10 +291,24 @@ Do not use .local as this is a reserved TLD for mDNS and bind9 DNS servers #### mDNS reloading Each time a file is created or a change is made to a file in `/etc/resolver` you may need to run the following to reload Mac OS mDNS resolver. +For macOS versions prior to Big Sur, you can reload the mDNS resolver using the following legacy commands: + ```bash sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist ``` +However, if you're using a newer macOS version (Big Sur and beyond), running the legacy commands may result in the following error: + +```bash +Load failed: 5: Input/output error +Try running `launchctl bootstrap` as root for richer errors. +``` +In this case, the recommended approach is to use the following commands instead: + +```bash +sudo launchctl enable system/com.apple.mDNSResponder.reloaded +sudo launchctl disable system/com.apple.mDNSResponder.reloaded +``` ## TODO - Add a service that runs on the host OS which will update the files in `/etc/resolver` automatically From 30d0c5f4ead6c450e17977b0d9204378ba7ca75f Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Wed, 25 Jun 2025 11:31:17 -0700 Subject: [PATCH 52/60] Addon kong: Update kong/kubernetes-ingress-controller image from 3.4.6 to 3.4.7 (#20969) --- 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 5fef61b625..60a632a58d 100644 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -322,7 +322,7 @@ var Addons = map[string]*Addon{ "0640"), }, false, "kong", "3rd party (Kong HQ)", "@gAmUssA", "https://minikube.sigs.k8s.io/docs/handbook/addons/kong-ingress/", map[string]string{ "Kong": "kong:3.9.0@sha256:0f5de480cfa95c612dcedf707272c13900e8d10e435b5e5bf57d950c87620268", - "KongIngress": "kong/kubernetes-ingress-controller:3.4.6@sha256:4b8918dd3562a40a6a9afebe751e6aa598bc0e57ed12ee1b8ca74ed7eee97cb1", + "KongIngress": "kong/kubernetes-ingress-controller:3.4.7@sha256:b38ef1b431f63261d6d5ddd4340661f9d41f135eb42d29349d695ad5817c9284", }, map[string]string{ "Kong": "docker.io", "KongIngress": "docker.io", From 24faef8b2de82d27cf292b8b42f5631558373797 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Wed, 25 Jun 2025 12:18:32 -0700 Subject: [PATCH 53/60] CNI: Update cilium from v1.17.4 to v1.17.5 (#20968) --- pkg/minikube/cni/cilium.yaml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/pkg/minikube/cni/cilium.yaml b/pkg/minikube/cni/cilium.yaml index 703b3614f8..88d2fada27 100644 --- a/pkg/minikube/cni/cilium.yaml +++ b/pkg/minikube/cni/cilium.yaml @@ -860,7 +860,7 @@ spec: type: Unconfined containers: - name: cilium-agent - image: "quay.io/cilium/cilium:v1.17.4@sha256:24a73fe795351cf3279ac8e84918633000b52a9654ff73a6b0d7223bcff4a67a" + image: "quay.io/cilium/cilium:v1.17.5@sha256:baf8541723ee0b72d6c489c741c81a6fdc5228940d66cb76ef5ea2ce3c639ea6" imagePullPolicy: IfNotPresent command: - cilium-agent @@ -1019,7 +1019,7 @@ spec: mountPath: /tmp initContainers: - name: config - image: "quay.io/cilium/cilium:v1.17.4@sha256:24a73fe795351cf3279ac8e84918633000b52a9654ff73a6b0d7223bcff4a67a" + image: "quay.io/cilium/cilium:v1.17.5@sha256:baf8541723ee0b72d6c489c741c81a6fdc5228940d66cb76ef5ea2ce3c639ea6" imagePullPolicy: IfNotPresent command: - cilium-dbg @@ -1042,7 +1042,7 @@ spec: # Required to mount cgroup2 filesystem on the underlying Kubernetes node. # We use nsenter command with host's cgroup and mount namespaces enabled. - name: mount-cgroup - image: "quay.io/cilium/cilium:v1.17.4@sha256:24a73fe795351cf3279ac8e84918633000b52a9654ff73a6b0d7223bcff4a67a" + image: "quay.io/cilium/cilium:v1.17.5@sha256:baf8541723ee0b72d6c489c741c81a6fdc5228940d66cb76ef5ea2ce3c639ea6" imagePullPolicy: IfNotPresent env: - name: CGROUP_ROOT @@ -1079,7 +1079,7 @@ spec: drop: - ALL - name: apply-sysctl-overwrites - image: "quay.io/cilium/cilium:v1.17.4@sha256:24a73fe795351cf3279ac8e84918633000b52a9654ff73a6b0d7223bcff4a67a" + image: "quay.io/cilium/cilium:v1.17.5@sha256:baf8541723ee0b72d6c489c741c81a6fdc5228940d66cb76ef5ea2ce3c639ea6" imagePullPolicy: IfNotPresent env: - name: BIN_PATH @@ -1117,7 +1117,7 @@ spec: # from a privileged container because the mount propagation bidirectional # only works from privileged containers. - name: mount-bpf-fs - image: "quay.io/cilium/cilium:v1.17.4@sha256:24a73fe795351cf3279ac8e84918633000b52a9654ff73a6b0d7223bcff4a67a" + image: "quay.io/cilium/cilium:v1.17.5@sha256:baf8541723ee0b72d6c489c741c81a6fdc5228940d66cb76ef5ea2ce3c639ea6" imagePullPolicy: IfNotPresent args: - 'mount | grep "/sys/fs/bpf type bpf" || mount -t bpf bpf /sys/fs/bpf' @@ -1133,7 +1133,7 @@ spec: mountPath: /sys/fs/bpf mountPropagation: Bidirectional - name: clean-cilium-state - image: "quay.io/cilium/cilium:v1.17.4@sha256:24a73fe795351cf3279ac8e84918633000b52a9654ff73a6b0d7223bcff4a67a" + image: "quay.io/cilium/cilium:v1.17.5@sha256:baf8541723ee0b72d6c489c741c81a6fdc5228940d66cb76ef5ea2ce3c639ea6" imagePullPolicy: IfNotPresent command: - /init-container.sh @@ -1180,7 +1180,7 @@ spec: mountPath: /var/run/cilium # wait-for-kube-proxy # Install the CNI binaries in an InitContainer so we don't have a writable host mount in the agent - name: install-cni-binaries - image: "quay.io/cilium/cilium:v1.17.4@sha256:24a73fe795351cf3279ac8e84918633000b52a9654ff73a6b0d7223bcff4a67a" + image: "quay.io/cilium/cilium:v1.17.5@sha256:baf8541723ee0b72d6c489c741c81a6fdc5228940d66cb76ef5ea2ce3c639ea6" imagePullPolicy: IfNotPresent command: - "/install-plugin.sh" @@ -1363,7 +1363,7 @@ spec: type: Unconfined containers: - name: cilium-envoy - image: "quay.io/cilium/cilium-envoy:v1.32.6-1746661844-0f602c28cb2aa57b29078195049fb257d5b5246c@sha256:a04218c6879007d60d96339a441c448565b6f86650358652da27582e0efbf182" + image: "quay.io/cilium/cilium-envoy:v1.32.6-1749271279-0864395884b263913eac200ee2048fd985f8e626@sha256:9f69e290a7ea3d4edf9192acd81694089af048ae0d8a67fb63bd62dc1d72203e" imagePullPolicy: IfNotPresent command: - /usr/bin/cilium-envoy-starter @@ -1538,7 +1538,7 @@ spec: spec: containers: - name: cilium-operator - image: "quay.io/cilium/operator-generic:v1.17.4@sha256:a3906412f477b09904f46aac1bed28eb522bef7899ed7dd81c15f78b7aa1b9b5" + image: "quay.io/cilium/operator-generic:v1.17.5@sha256:f954c97eeb1b47ed67d08cc8fb4108fb829f869373cbb3e698a7f8ef1085b09e" imagePullPolicy: IfNotPresent command: - cilium-operator-generic From c9f132fd4d34eb5794aaf7a9d617a7288dcdbffa Mon Sep 17 00:00:00 2001 From: Steven Powell <44844360+spowelljr@users.noreply.github.com> Date: Thu, 26 Jun 2025 16:44:18 -0700 Subject: [PATCH 54/60] Remove spowelljr from reviewers list --- OWNERS | 1 - 1 file changed, 1 deletion(-) diff --git a/OWNERS b/OWNERS index d436b77c90..50b5edab7b 100644 --- a/OWNERS +++ b/OWNERS @@ -3,7 +3,6 @@ reviewers: - medyagh - prezha - - spowelljr - comradeprogrammer approvers: - medyagh From 28b0c9fa29672876e9435f4f3f0424e426ab0fd1 Mon Sep 17 00:00:00 2001 From: gopherorg Date: Sat, 28 Jun 2025 03:24:44 +0800 Subject: [PATCH 55/60] chore: fix some function names in comment (#20990) Signed-off-by: gopherorg --- pkg/minikube/cruntime/cri.go | 2 +- pkg/minikube/process/process.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/minikube/cruntime/cri.go b/pkg/minikube/cruntime/cri.go index 99e28632d7..110f92828b 100644 --- a/pkg/minikube/cruntime/cri.go +++ b/pkg/minikube/cruntime/cri.go @@ -184,7 +184,7 @@ func unpauseCRIContainers(cr CommandRunner, root string, ids []string) error { return nil } -// criCRIContainers kills a list of containers using crictl +// killCRIContainers kills a list of containers using crictl func killCRIContainers(cr CommandRunner, ids []string) error { if len(ids) == 0 { return nil diff --git a/pkg/minikube/process/process.go b/pkg/minikube/process/process.go index f461414fd1..0b93ef4317 100644 --- a/pkg/minikube/process/process.go +++ b/pkg/minikube/process/process.go @@ -33,7 +33,7 @@ func WritePidfile(path string, pid int) error { return os.WriteFile(path, []byte(data), pidfileMode) } -// ReadPid reads a pid from path. +// ReadPidfile reads a pid from path. func ReadPidfile(path string) (int, error) { data, err := os.ReadFile(path) if err != nil { From 7a2dfb41d1a384960a32fc08133d6013667a6ec0 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 30 Jun 2025 10:38:53 -0700 Subject: [PATCH 56/60] update Kubernetes versions list (#20997) --- pkg/minikube/constants/constants_kubernetes_versions.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/minikube/constants/constants_kubernetes_versions.go b/pkg/minikube/constants/constants_kubernetes_versions.go index 2d454b5da6..ba61f0b32d 100644 --- a/pkg/minikube/constants/constants_kubernetes_versions.go +++ b/pkg/minikube/constants/constants_kubernetes_versions.go @@ -21,6 +21,7 @@ package constants // ValidKubernetesVersions is a list of Kubernetes versions in order from newest to oldest // This is used when outputting Kubernetes versions and to select the latest patch version when unspecified var ValidKubernetesVersions = []string{ + "v1.34.0-alpha.2", "v1.34.0-alpha.1", "v1.33.2", "v1.33.1", From 24d5c736e5550743c260ce2636107c0f898f7a40 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 30 Jun 2025 10:39:18 -0700 Subject: [PATCH 57/60] update image constants for kubeadm images (#20996) --- pkg/minikube/constants/constants_kubeadm_images.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkg/minikube/constants/constants_kubeadm_images.go b/pkg/minikube/constants/constants_kubeadm_images.go index 7eb14f0c63..c983686ced 100644 --- a/pkg/minikube/constants/constants_kubeadm_images.go +++ b/pkg/minikube/constants/constants_kubeadm_images.go @@ -18,6 +18,11 @@ package constants var ( KubeadmImages = map[string]map[string]string{ + "v1.34.0-alpha.2": { + "coredns/coredns": "v1.12.1", + "etcd": "3.5.21-0", + "pause": "3.10", + }, "v1.33.2": { "coredns/coredns": "v1.12.0", "etcd": "3.5.21-0", From 4b06829b8bf2b211bd123b0b7c64c1b552c1b708 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 30 Jun 2025 10:55:33 -0700 Subject: [PATCH 58/60] Update go-github from v72.0.0 to v73.0.0 (#21000) --- cmd/minikube/cmd/config/kubernetes_version.go | 2 +- go.mod | 2 +- go.sum | 4 ++-- hack/preload-images/kubernetes.go | 2 +- hack/update/github.go | 2 +- hack/update/ingress_version/update_ingress_version.go | 2 +- hack/update/kubeadm_constants/update_kubeadm_constants.go | 2 +- .../update_kubernetes_versions_list.go | 2 +- hack/update/site_node_version/update_site_node_version.go | 2 +- pkg/perf/monitor/github.go | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cmd/minikube/cmd/config/kubernetes_version.go b/cmd/minikube/cmd/config/kubernetes_version.go index 4f70266324..f58a7844d6 100644 --- a/cmd/minikube/cmd/config/kubernetes_version.go +++ b/cmd/minikube/cmd/config/kubernetes_version.go @@ -20,7 +20,7 @@ import ( "context" "net/http" - "github.com/google/go-github/v72/github" + "github.com/google/go-github/v73/github" "golang.org/x/mod/semver" "k8s.io/minikube/pkg/minikube/constants" ) diff --git a/go.mod b/go.mod index 18a558b9b1..4895af817d 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 github.com/google/go-cmp v0.7.0 github.com/google/go-containerregistry v0.20.3 - github.com/google/go-github/v72 v72.0.0 + github.com/google/go-github/v73 v73.0.0 github.com/google/slowjam v1.1.2 github.com/google/uuid v1.6.0 github.com/hashicorp/go-getter v1.7.8 diff --git a/go.sum b/go.sum index 3e49a434de..f9c89ce8e2 100644 --- a/go.sum +++ b/go.sum @@ -1335,8 +1335,8 @@ github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYV github.com/google/go-containerregistry v0.20.3 h1:oNx7IdTI936V8CQRveCjaxOiegWwvM7kqkbXTpyiovI= github.com/google/go-containerregistry v0.20.3/go.mod h1:w00pIgBRDVUDFM6bq+Qx8lwNWK+cxgCuX1vd3PIBDNI= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-github/v72 v72.0.0 h1:FcIO37BLoVPBO9igQQ6tStsv2asG4IPcYFi655PPvBM= -github.com/google/go-github/v72 v72.0.0/go.mod h1:WWtw8GMRiL62mvIquf1kO3onRHeWWKmK01qdCY8c5fg= +github.com/google/go-github/v73 v73.0.0 h1:aR+Utnh+Y4mMkS+2qLQwcQ/cF9mOTpdwnzlaw//rG24= +github.com/google/go-github/v73 v73.0.0/go.mod h1:fa6w8+/V+edSU0muqdhCVY7Beh1M8F1IlQPZIANKIYw= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= diff --git a/hack/preload-images/kubernetes.go b/hack/preload-images/kubernetes.go index be59927f55..ef5e29186e 100644 --- a/hack/preload-images/kubernetes.go +++ b/hack/preload-images/kubernetes.go @@ -20,7 +20,7 @@ import ( "context" "strings" - "github.com/google/go-github/v72/github" + "github.com/google/go-github/v73/github" "k8s.io/klog/v2" ) diff --git a/hack/update/github.go b/hack/update/github.go index 3a26586e3c..cac43c9b9b 100644 --- a/hack/update/github.go +++ b/hack/update/github.go @@ -23,7 +23,7 @@ import ( "golang.org/x/mod/semver" - "github.com/google/go-github/v72/github" + "github.com/google/go-github/v73/github" ) const ( diff --git a/hack/update/ingress_version/update_ingress_version.go b/hack/update/ingress_version/update_ingress_version.go index f6cbcc2d0f..5fd321e0cc 100644 --- a/hack/update/ingress_version/update_ingress_version.go +++ b/hack/update/ingress_version/update_ingress_version.go @@ -25,7 +25,7 @@ import ( "strings" "time" - "github.com/google/go-github/v72/github" + "github.com/google/go-github/v73/github" "golang.org/x/mod/semver" "k8s.io/klog/v2" diff --git a/hack/update/kubeadm_constants/update_kubeadm_constants.go b/hack/update/kubeadm_constants/update_kubeadm_constants.go index c5dfee6acb..67d9e93bc8 100644 --- a/hack/update/kubeadm_constants/update_kubeadm_constants.go +++ b/hack/update/kubeadm_constants/update_kubeadm_constants.go @@ -29,7 +29,7 @@ import ( "text/template" "time" - "github.com/google/go-github/v72/github" + "github.com/google/go-github/v73/github" "golang.org/x/mod/semver" "k8s.io/klog/v2" "k8s.io/minikube/hack/update" diff --git a/hack/update/kubernetes_versions_list/update_kubernetes_versions_list.go b/hack/update/kubernetes_versions_list/update_kubernetes_versions_list.go index 3f40290097..bc7532432c 100644 --- a/hack/update/kubernetes_versions_list/update_kubernetes_versions_list.go +++ b/hack/update/kubernetes_versions_list/update_kubernetes_versions_list.go @@ -23,7 +23,7 @@ import ( "sort" "time" - "github.com/google/go-github/v72/github" + "github.com/google/go-github/v73/github" "golang.org/x/mod/semver" "k8s.io/klog/v2" "k8s.io/minikube/hack/update" diff --git a/hack/update/site_node_version/update_site_node_version.go b/hack/update/site_node_version/update_site_node_version.go index c1214482e5..0fbc8f2bc0 100644 --- a/hack/update/site_node_version/update_site_node_version.go +++ b/hack/update/site_node_version/update_site_node_version.go @@ -22,7 +22,7 @@ import ( "strings" "time" - "github.com/google/go-github/v72/github" + "github.com/google/go-github/v73/github" "golang.org/x/mod/semver" "k8s.io/klog/v2" "k8s.io/minikube/hack/update" diff --git a/pkg/perf/monitor/github.go b/pkg/perf/monitor/github.go index ea9b2e2848..93ff15395e 100644 --- a/pkg/perf/monitor/github.go +++ b/pkg/perf/monitor/github.go @@ -22,7 +22,7 @@ import ( "os" "time" - "github.com/google/go-github/v72/github" + "github.com/google/go-github/v73/github" "github.com/pkg/errors" "golang.org/x/oauth2" ) From 804c01a7fb924970243d9e4462930d5ba237737f Mon Sep 17 00:00:00 2001 From: Nir Soffer Date: Mon, 30 Jun 2025 21:09:50 +0300 Subject: [PATCH 59/60] vmnet: Support offloading for krunkit (#20831) libkrun virtio-net driver enables TSO offloading and checksum offloading by default, so we must use vment-helper --enable-tso and --enable-checksum-offload with krunkit. These options do not work with vfkit. --- pkg/drivers/vmnet/vmnet.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/pkg/drivers/vmnet/vmnet.go b/pkg/drivers/vmnet/vmnet.go index 0bfe654304..eb0f8c44bc 100644 --- a/pkg/drivers/vmnet/vmnet.go +++ b/pkg/drivers/vmnet/vmnet.go @@ -55,6 +55,11 @@ type Helper struct { // will obtain the same MAC address from vmnet. InterfaceID string + // Offloading is required for krunkit, doss not work with vfkit. + // We must use this until libkrun add support for disabling offloading: + // https://github.com/containers/libkrun/issues/264 + Offloading bool + // Set when vmnet interface is started. macAddress string } @@ -115,13 +120,18 @@ func ValidateHelper() error { // machine. The helper will create a unix datagram socket at the specfied path. // The client (e.g. vfkit) will connect to this socket. func (h *Helper) Start(socketPath string) error { - cmd := exec.Command( - "sudo", + args := []string{ "--non-interactive", executablePath, "--socket", socketPath, "--interface-id", h.InterfaceID, - ) + } + + if h.Offloading { + args = append(args, "--enable-tso", "--enable-checksum-offload") + } + + cmd := exec.Command("sudo", args...) // Create vmnet-helper in a new process group so it is not harmed when // terminating the minikube process group. From 527817e0f6e9105b9bbece0f5ac6ed606d8020cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Jul 2025 20:24:56 +0000 Subject: [PATCH 60/60] Build(deps): Bump golang.org/x/net Bumps [golang.org/x/net](https://github.com/golang/net) from 0.26.0 to 0.38.0. - [Commits](https://github.com/golang/net/compare/v0.26.0...v0.38.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-version: 0.38.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- .../test-flake-chart/report_flakes/go.mod | 12 +++++------ .../test-flake-chart/report_flakes/go.sum | 20 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/hack/jenkins/test-flake-chart/report_flakes/go.mod b/hack/jenkins/test-flake-chart/report_flakes/go.mod index 4947cf0772..c71b54b1a9 100644 --- a/hack/jenkins/test-flake-chart/report_flakes/go.mod +++ b/hack/jenkins/test-flake-chart/report_flakes/go.mod @@ -1,6 +1,6 @@ module flake -go 1.22.3 +go 1.23.0 require cloud.google.com/go/storage v1.43.0 @@ -25,12 +25,12 @@ require ( go.opentelemetry.io/otel v1.24.0 // indirect go.opentelemetry.io/otel/metric v1.24.0 // indirect go.opentelemetry.io/otel/trace v1.24.0 // indirect - golang.org/x/crypto v0.24.0 // indirect - golang.org/x/net v0.26.0 // indirect + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/net v0.38.0 // indirect golang.org/x/oauth2 v0.21.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.21.0 // indirect - golang.org/x/text v0.16.0 // indirect + golang.org/x/sync v0.12.0 // indirect + golang.org/x/sys v0.31.0 // indirect + golang.org/x/text v0.23.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/api v0.187.0 // indirect google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d // indirect diff --git a/hack/jenkins/test-flake-chart/report_flakes/go.sum b/hack/jenkins/test-flake-chart/report_flakes/go.sum index 1a781d90a0..0d5e0617df 100644 --- a/hack/jenkins/test-flake-chart/report_flakes/go.sum +++ b/hack/jenkins/test-flake-chart/report_flakes/go.sum @@ -93,8 +93,8 @@ go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -105,26 +105,26 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=