diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index b1b964756efc..bdaa2a97dd9a 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -89,11 +89,13 @@ type versionJSON struct { } var ( - registryMirror []string - insecureRegistry []string - apiServerNames []string - apiServerIPs []net.IP - hostRe = regexp.MustCompile(`^[^-][\w\.-]+$`) + // ErrKubernetesPatchNotFound is when a patch was not found for the given . version + ErrKubernetesPatchNotFound = errors.New("Unable to detect the latest patch release for specified Kubernetes version") + registryMirror []string + insecureRegistry []string + apiServerNames []string + apiServerIPs []net.IP + hostRe = regexp.MustCompile(`^[^-][\w\.-]+$`) ) func init() { @@ -318,7 +320,10 @@ func provisionWithDriver(cmd *cobra.Command, ds registry.DriverState, existing * stopk8s = true } - k8sVersion := getKubernetesVersion(existing) + k8sVersion, err := getKubernetesVersion(existing) + if err != nil { + klog.Warningf("failed getting Kubernetes version: %v", err) + } rtime := getContainerRuntime(existing) cc, n, err := generateClusterConfig(cmd, existing, k8sVersion, rtime, driverName) if err != nil { @@ -1585,17 +1590,23 @@ func createNode(cc config.ClusterConfig, existing *config.ClusterConfig) (config // Create the initial node, which will necessarily be a control plane if existing != nil { cp, err := config.PrimaryControlPlane(existing) - cp.KubernetesVersion = getKubernetesVersion(&cc) - cp.ContainerRuntime = getContainerRuntime(&cc) if err != nil { return cc, config.Node{}, err } + cp.KubernetesVersion, err = getKubernetesVersion(&cc) + if err != nil { + klog.Warningf("failed getting Kubernetes version: %v", err) + } + cp.ContainerRuntime = getContainerRuntime(&cc) // Make sure that existing nodes honor if KubernetesVersion gets specified on restart // KubernetesVersion is the only attribute that the user can override in the Node object nodes := []config.Node{} for _, n := range existing.Nodes { - n.KubernetesVersion = getKubernetesVersion(&cc) + n.KubernetesVersion, err = getKubernetesVersion(&cc) + if err != nil { + klog.Warningf("failed getting Kubernetes version: %v", err) + } n.ContainerRuntime = getContainerRuntime(&cc) nodes = append(nodes, n) } @@ -1604,9 +1615,13 @@ func createNode(cc config.ClusterConfig, existing *config.ClusterConfig) (config return cc, cp, nil } + kubeVer, err := getKubernetesVersion(&cc) + if err != nil { + klog.Warningf("failed getting Kubernetes version: %v", err) + } cp := config.Node{ Port: cc.KubernetesConfig.NodePort, - KubernetesVersion: getKubernetesVersion(&cc), + KubernetesVersion: kubeVer, ContainerRuntime: getContainerRuntime(&cc), ControlPlane: true, Worker: true, @@ -1653,12 +1668,27 @@ func autoSetDriverOptions(cmd *cobra.Command, drvName string) (err error) { // validateKubernetesVersion ensures that the requested version is reasonable func validateKubernetesVersion(old *config.ClusterConfig) { - nvs, _ := semver.Make(strings.TrimPrefix(getKubernetesVersion(old), version.VersionPrefix)) + paramVersion := viper.GetString(kubernetesVersion) + paramVersion = strings.TrimPrefix(strings.ToLower(paramVersion), version.VersionPrefix) + kubernetesVer, err := getKubernetesVersion(old) + if err != nil { + if errors.Is(err, ErrKubernetesPatchNotFound) { + exit.Message(reason.PatchNotFound, "Unable to detect the latest patch release for specified major.minor version v{{.majorminor}}", + out.V{"majorminor": paramVersion}) + } + exit.Message(reason.Usage, `Unable to parse "{{.kubernetes_version}}": {{.error}}`, out.V{"kubernetes_version": paramVersion, "error": err}) + + } + + nvs, _ := semver.Make(strings.TrimPrefix(kubernetesVer, version.VersionPrefix)) oldestVersion := semver.MustParse(strings.TrimPrefix(constants.OldestKubernetesVersion, version.VersionPrefix)) defaultVersion := semver.MustParse(strings.TrimPrefix(constants.DefaultKubernetesVersion, version.VersionPrefix)) newestVersion := semver.MustParse(strings.TrimPrefix(constants.NewestKubernetesVersion, version.VersionPrefix)) zeroVersion := semver.MustParse(strings.TrimPrefix(constants.NoKubernetesVersion, version.VersionPrefix)) + if isTwoDigitSemver(paramVersion) && getLatestPatch(paramVersion) != "" { + out.Styled(style.Workaround, `Using Kubernetes {{.version}} since patch version was unspecified`, out.V{"version": nvs}) + } if nvs.Equals(zeroVersion) { klog.Infof("No Kubernetes version set for minikube, setting Kubernetes version to %s", constants.NoKubernetesVersion) return @@ -1729,7 +1759,7 @@ func isBaseImageApplicable(drv string) bool { return registry.IsKIC(drv) } -func getKubernetesVersion(old *config.ClusterConfig) string { +func getKubernetesVersion(old *config.ClusterConfig) (string, error) { if viper.GetBool(noKubernetes) { // Exit if --kubernetes-version is specified. if viper.GetString(kubernetesVersion) != "" { @@ -1758,12 +1788,20 @@ $ minikube config unset kubernetes-version`) paramVersion = constants.NewestKubernetesVersion } - nvs, err := semver.Make(strings.TrimPrefix(paramVersion, version.VersionPrefix)) + kubernetesSemver := strings.TrimPrefix(strings.ToLower(paramVersion), version.VersionPrefix) + if isTwoDigitSemver(kubernetesSemver) { + potentialPatch := getLatestPatch(kubernetesSemver) + if potentialPatch == "" { + return "", ErrKubernetesPatchNotFound + } + kubernetesSemver = potentialPatch + } + nvs, err := semver.Make(kubernetesSemver) if err != nil { exit.Message(reason.Usage, `Unable to parse "{{.kubernetes_version}}": {{.error}}`, out.V{"kubernetes_version": paramVersion, "error": err}) } - return version.VersionPrefix + nvs.String() + return version.VersionPrefix + nvs.String(), nil } // validateDockerStorageDriver checks that docker is using overlay2 @@ -1848,7 +1886,11 @@ func validateBareMetal(drvName string) { } // conntrack is required starting with Kubernetes 1.18, include the release candidates for completion - version, _ := util.ParseKubernetesVersion(getKubernetesVersion(nil)) + kubeVer, err := getKubernetesVersion(nil) + 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")) { 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()}) @@ -1878,3 +1920,21 @@ func exitGuestProvision(err error) { } exit.Error(reason.GuestProvision, "error provisioning guest", err) } + +// Example input = 1.26 => output = "1.26.5" +// Example input = 1.26.5 => output = "1.26.5" +// Example input = 1.26.999 => output = "" +func getLatestPatch(majorMinorVer string) string { + for _, k := range constants.ValidKubernetesVersions { + if strings.HasPrefix(k, fmt.Sprintf("v%s.", majorMinorVer)) { + return strings.TrimPrefix(k, version.VersionPrefix) + } + + } + return "" +} + +func isTwoDigitSemver(ver string) bool { + majorMinorOnly := regexp.MustCompile(`^(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)$`) + return majorMinorOnly.MatchString(ver) +} diff --git a/cmd/minikube/cmd/start_flags.go b/cmd/minikube/cmd/start_flags.go index 4e6a3359be96..6374b5c3921a 100644 --- a/cmd/minikube/cmd/start_flags.go +++ b/cmd/minikube/cmd/start_flags.go @@ -811,7 +811,11 @@ func updateExistingConfigFromFlags(cmd *cobra.Command, existing *config.ClusterC updateStringFromFlag(cmd, &cc.SocketVMnetPath, socketVMnetPath) if cmd.Flags().Changed(kubernetesVersion) { - cc.KubernetesConfig.KubernetesVersion = getKubernetesVersion(existing) + kubeVer, err := getKubernetesVersion(existing) + if err != nil { + klog.Warningf("failed getting Kubernetes version: %v", err) + } + cc.KubernetesConfig.KubernetesVersion = kubeVer } if cmd.Flags().Changed(containerRuntime) { cc.KubernetesConfig.ContainerRuntime = getContainerRuntime(existing) diff --git a/cmd/minikube/cmd/start_test.go b/cmd/minikube/cmd/start_test.go index 9b0088f1e3a7..434187b4f72e 100644 --- a/cmd/minikube/cmd/start_test.go +++ b/cmd/minikube/cmd/start_test.go @@ -25,6 +25,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" + "k8s.io/klog/v2" cfg "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/minikube/cruntime" @@ -62,6 +63,16 @@ func TestGetKubernetesVersion(t *testing.T) { paramVersion: "v1.16.0", cfg: &cfg.ClusterConfig{KubernetesConfig: cfg.KubernetesConfig{KubernetesVersion: "v1.15.0"}}, }, + { + description: "kubernetes-version without patch version", + expectedVersion: "v1.16.15", + paramVersion: "v1.16", + }, + { + description: "kubernetes-version without patch version", + expectedVersion: "v1.16.15", + paramVersion: "1.16", + }, { description: "kubernetes-version given as 'stable', no config", expectedVersion: constants.DefaultKubernetesVersion, @@ -92,7 +103,10 @@ func TestGetKubernetesVersion(t *testing.T) { for _, test := range tests { t.Run(test.description, func(t *testing.T) { viper.SetDefault(kubernetesVersion, test.paramVersion) - version := getKubernetesVersion(test.cfg) + version, err := getKubernetesVersion(test.cfg) + if err != nil { + klog.Warningf("failed getting Kubernetes version: %v", err) + } // check whether we are getting the expected version if version != test.expectedVersion { @@ -451,6 +465,109 @@ func TestValidateRuntime(t *testing.T) { } } +func TestIsTwoDigitSemver(t *testing.T) { + var tcs = []struct { + desc string + version string + expected bool + }{ + { + desc: "a valid three digit version", + version: "1.26.5", + expected: false, + }, + { + desc: "a valid two digit version", + version: "1.26", + expected: true, + }, + { + desc: "a valid two digit version with a period", + version: "1.26.", + expected: false, + }, + { + desc: "an invalid major version", + version: "2", + expected: false, + }, + { + desc: "a valid major version", + version: "1", + expected: false, + }, + { + desc: "a two digit version with a 0 as the major/minor components", + version: "0.0", + expected: true, + }, + { + desc: "a two digit version with negative major version", + version: "-1.0", + expected: false, + }, + { + desc: "a two digit version with negative minor version", + version: "1.-1", + expected: false, + }, + { + desc: "a missing minor version", + version: "1.", + expected: false, + }, + { + desc: "a missing major version", + version: ".2", + expected: false, + }, + { + desc: "a valid two digit version with whitespace between components", + version: "1. 1", + expected: false, + }, + { + desc: "a two digit version with a non-digit major component", + version: "a.12", + expected: false, + }, + { + desc: "a two digit version with a non-digit minor component", + version: "1.a", + expected: false, + }, + { + desc: "a two digit version with extraneous non-digits in minor component", + version: "1.2a", + expected: false, + }, + { + desc: "a two digit version larger major/minor components", + version: "123456789.987654321", + expected: true, + }, + { + desc: "a valid two digit version with a version prefix", + version: "v1.26", + expected: false, + }, + { + desc: "a valid three digit version with a version prefix", + version: "v1.26.5", + expected: false, + }, + } + for _, tc := range tcs { + t.Run(tc.desc, func(t *testing.T) { + actual := isTwoDigitSemver(tc.version) + // check whether the function correctly verifies if it is a 2 digit semver + if actual != tc.expected { + t.Fatalf("test failed. Expected version %s to return %t", tc.version, tc.expected) + } + }) + } +} + func TestValidatePorts(t *testing.T) { isMicrosoftWSL := detect.IsMicrosoftWSL() type portTest struct { diff --git a/pkg/minikube/out/out.go b/pkg/minikube/out/out.go index 5c9680efcdb6..0043bc875031 100644 --- a/pkg/minikube/out/out.go +++ b/pkg/minikube/out/out.go @@ -21,12 +21,12 @@ import ( "bytes" "fmt" "html" - "html/template" "io" "os" "path/filepath" "strconv" "strings" + "text/template" "time" "github.com/Delta456/box-cli-maker/v2" diff --git a/pkg/minikube/reason/reason.go b/pkg/minikube/reason/reason.go index 8d6ed7dbd172..129c5fdc6e01 100644 --- a/pkg/minikube/reason/reason.go +++ b/pkg/minikube/reason/reason.go @@ -57,6 +57,11 @@ func (k *Kind) IssueURLs() []string { // Sections are ordered roughly by stack dependencies var ( + // minikube could not find a patch for the provided major.minor version + PatchNotFound = Kind{ID: "MK_PATCH_NOT_FOUND", ExitCode: ExProgramUsage, + Advice: translate.T("Specify --kubernetes-version in v. form. example: 'v1.1.14'"), + } + // minikube has been passed an incorrect parameter Usage = Kind{ID: "MK_USAGE", ExitCode: ExProgramUsage} // minikube has no current cluster running diff --git a/site/content/en/docs/contrib/errorcodes.en.md b/site/content/en/docs/contrib/errorcodes.en.md index 6f766dedefdb..ce5689c7ee7c 100644 --- a/site/content/en/docs/contrib/errorcodes.en.md +++ b/site/content/en/docs/contrib/errorcodes.en.md @@ -7,6 +7,9 @@ description: > ## Error Strings +"MK_PATCH_NOT_FOUND" (Exit code ExProgramUsage) +minikube could not find a patch for the provided major.minor version + "MK_USAGE" (Exit code ExProgramUsage) minikube has been passed an incorrect parameter diff --git a/translations/de.json b/translations/de.json index 6b359f6ab62a..1bb842561e7a 100644 --- a/translations/de.json +++ b/translations/de.json @@ -799,6 +799,7 @@ "Tunnel successfully started": "Tunnel erfolgreich gestartet", "Unable to bind flags": "Konnte Parameter-Flags nicht binden", "Unable to create dedicated network, this might result in cluster IP change after restart: {{.error}}": "Kann dediziertes Netzwerk nicht anlegen, dies kann dazu führen, dass sich die Cluster IP ändert, wenn der Cluster neugestartet wird: {{.error}}", + "Unable to detect the latest patch release for specified major.minor version v{{.majorminor}}": "", "Unable to enable dashboard": "Kann Dashboard nicht aktivieren", "Unable to fetch latest version info": "Kann aktuellste Versions-Info nicht laden", "Unable to find control plane": "Kann Kontroll-Ebene nicht finden", @@ -867,6 +868,7 @@ "Userspace file server is shutdown": "Userspace File Server ist heruntergefahren", "Userspace file server: ": "Userspace File Server:", "Using Kubernetes v1.24+ with the Docker runtime requires cri-docker to be installed": "", + "Using Kubernetes {{.version}} since patch version was unspecified": "", "Using image repository {{.name}}": "Verwenden des Image-Repositorys {{.name}}", "Using image {{.registry}}{{.image}}": "Verwende Image {{.registry}}{{.image}}", "Using image {{.registry}}{{.image}} (global image repository)": "Verwende das Image {{.registry}}{{.image}} (globale Image Repository)", diff --git a/translations/es.json b/translations/es.json index b64ab27155e8..5cd506e60163 100644 --- a/translations/es.json +++ b/translations/es.json @@ -800,6 +800,7 @@ "Tunnel successfully started": "", "Unable to bind flags": "", "Unable to create dedicated network, this might result in cluster IP change after restart: {{.error}}": "", + "Unable to detect the latest patch release for specified major.minor version v{{.majorminor}}": "", "Unable to enable dashboard": "", "Unable to fetch latest version info": "", "Unable to find control plane": "", @@ -868,6 +869,7 @@ "Userspace file server is shutdown": "", "Userspace file server: ": "", "Using Kubernetes v1.24+ with the Docker runtime requires cri-docker to be installed": "", + "Using Kubernetes {{.version}} since patch version was unspecified": "", "Using image repository {{.name}}": "Utilizando el repositorio de imágenes {{.name}}", "Using image {{.registry}}{{.image}}": "", "Using image {{.registry}}{{.image}} (global image repository)": "", diff --git a/translations/fr.json b/translations/fr.json index e1eefcb860ea..c9d20c999675 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -779,6 +779,7 @@ "Tunnel successfully started": "Tunnel démarré avec succès", "Unable to bind flags": "Impossible de lier les indicateurs", "Unable to create dedicated network, this might result in cluster IP change after restart: {{.error}}": "Impossible de créer un réseau dédié, cela peut entraîner une modification de l'adresse IP du cluster après le redémarrage : {{.error}}", + "Unable to detect the latest patch release for specified major.minor version v{{.majorminor}}": "", "Unable to enable dashboard": "Impossible d'activer le tableau de bord", "Unable to fetch latest version info": "Impossible de récupérer les informations sur la dernière version", "Unable to find control plane": "Impossible de trouver le plan de contrôle", @@ -845,6 +846,7 @@ "Userspace file server is shutdown": "Le serveur de fichiers de l'espace utilisateur est arrêté", "Userspace file server: ": "Serveur de fichiers de l'espace utilisateur :", "Using Kubernetes v1.24+ with the Docker runtime requires cri-docker to be installed": "L'utilisation de Kubernetes v1.24+ avec le runtime Docker nécessite l'installation de cri-docker", + "Using Kubernetes {{.version}} since patch version was unspecified": "", "Using image repository {{.name}}": "Utilisation du dépôt d'images {{.name}}…", "Using image {{.registry}}{{.image}}": "Utilisation de l'image {{.registry}}{{.image}}", "Using image {{.registry}}{{.image}} (global image repository)": "Utilisation de l'image {{.registry}}{{.image}} (référentiel d'images global)", diff --git a/translations/ja.json b/translations/ja.json index ba8ab7754781..1ff94b48b82a 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -748,6 +748,7 @@ "Tunnel successfully started": "トンネルが無事開始しました", "Unable to bind flags": "フラグをバインドできません", "Unable to create dedicated network, this might result in cluster IP change after restart: {{.error}}": "独立したネットワークの作成ができず、再起動後にクラスター IP が変更される結果になるかも知れません: {{.error}}", + "Unable to detect the latest patch release for specified major.minor version v{{.majorminor}}": "", "Unable to enable dashboard": "ダッシュボードが有効になりません", "Unable to fetch latest version info": "最新バージョン情報を取得できません", "Unable to find control plane": "コントロールプレーンが見つかりません", @@ -812,6 +813,7 @@ "Userspace file server is shutdown": "ユーザースペースのファイルサーバーが停止しました", "Userspace file server: ": "ユーザースペースのファイルサーバー: ", "Using Kubernetes v1.24+ with the Docker runtime requires cri-docker to be installed": "Docker ランタイムで Kubernetes v1.24+ を使用するには、cri-docker をインストールする必要があります", + "Using Kubernetes {{.version}} since patch version was unspecified": "", "Using image repository {{.name}}": "{{.name}} イメージリポジトリーを使用しています", "Using image {{.registry}}{{.image}}": "{{.registry}}{{.image}} イメージを使用しています", "Using image {{.registry}}{{.image}} (global image repository)": "{{.registry}}{{.image}} イメージ (グローバルイメージリポジトリー) を使用しています", diff --git a/translations/ko.json b/translations/ko.json index 2384b0b84e3b..ad8f562135f5 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -797,6 +797,7 @@ "Tunnel successfully started": "", "Unable to bind flags": "flags 를 합칠 수 없습니다", "Unable to create dedicated network, this might result in cluster IP change after restart: {{.error}}": "", + "Unable to detect the latest patch release for specified major.minor version v{{.majorminor}}": "", "Unable to enable dashboard": "대시보드를 활성화할 수 없습니다", "Unable to fetch latest version info": "최신 버전 정보를 가져올 수 없습니다", "Unable to find control plane": "", @@ -867,6 +868,7 @@ "Userspace file server is shutdown": "", "Userspace file server: ": "", "Using Kubernetes v1.24+ with the Docker runtime requires cri-docker to be installed": "", + "Using Kubernetes {{.version}} since patch version was unspecified": "", "Using image repository {{.name}}": "", "Using image {{.registry}}{{.image}}": "", "Using image {{.registry}}{{.image}} (global image repository)": "", diff --git a/translations/pl.json b/translations/pl.json index 78456bc1f891..600277542d7e 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -812,6 +812,7 @@ "Tunnel successfully started": "", "Unable to bind flags": "", "Unable to create dedicated network, this might result in cluster IP change after restart: {{.error}}": "", + "Unable to detect the latest patch release for specified major.minor version v{{.majorminor}}": "", "Unable to enable dashboard": "", "Unable to fetch latest version info": "", "Unable to find control plane": "", @@ -877,6 +878,7 @@ "Userspace file server is shutdown": "", "Userspace file server: ": "", "Using Kubernetes v1.24+ with the Docker runtime requires cri-docker to be installed": "", + "Using Kubernetes {{.version}} since patch version was unspecified": "", "Using image repository {{.name}}": "", "Using image {{.registry}}{{.image}}": "", "Using image {{.registry}}{{.image}} (global image repository)": "", diff --git a/translations/ru.json b/translations/ru.json index 7d27908a6b5e..d92d0c80e0c1 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -739,6 +739,7 @@ "Tunnel successfully started": "", "Unable to bind flags": "", "Unable to create dedicated network, this might result in cluster IP change after restart: {{.error}}": "", + "Unable to detect the latest patch release for specified major.minor version v{{.majorminor}}": "", "Unable to enable dashboard": "", "Unable to fetch latest version info": "", "Unable to find control plane": "", @@ -803,6 +804,7 @@ "Userspace file server is shutdown": "", "Userspace file server: ": "", "Using Kubernetes v1.24+ with the Docker runtime requires cri-docker to be installed": "", + "Using Kubernetes {{.version}} since patch version was unspecified": "", "Using image repository {{.name}}": "", "Using image {{.registry}}{{.image}}": "Используется образ {{.registry}}{{.image}}", "Using image {{.registry}}{{.image}} (global image repository)": "", diff --git a/translations/strings.txt b/translations/strings.txt index 662a1ec39eee..254467e04988 100644 --- a/translations/strings.txt +++ b/translations/strings.txt @@ -739,6 +739,7 @@ "Tunnel successfully started": "", "Unable to bind flags": "", "Unable to create dedicated network, this might result in cluster IP change after restart: {{.error}}": "", + "Unable to detect the latest patch release for specified major.minor version v{{.majorminor}}": "", "Unable to enable dashboard": "", "Unable to fetch latest version info": "", "Unable to find control plane": "", @@ -803,6 +804,7 @@ "Userspace file server is shutdown": "", "Userspace file server: ": "", "Using Kubernetes v1.24+ with the Docker runtime requires cri-docker to be installed": "", + "Using Kubernetes {{.version}} since patch version was unspecified": "", "Using image repository {{.name}}": "", "Using image {{.registry}}{{.image}}": "", "Using image {{.registry}}{{.image}} (global image repository)": "", diff --git a/translations/zh-CN.json b/translations/zh-CN.json index c6c670dd3d0c..3f6a3eb8325e 100644 --- a/translations/zh-CN.json +++ b/translations/zh-CN.json @@ -903,6 +903,7 @@ "Tunnel successfully started": "", "Unable to bind flags": "无法绑定标志", "Unable to create dedicated network, this might result in cluster IP change after restart: {{.error}}": "", + "Unable to detect the latest patch release for specified major.minor version v{{.majorminor}}": "", "Unable to determine a default driver to use. Try specifying --vm-driver, or see https://minikube.sigs.k8s.io/docs/start/": "无法确定要使用的默认驱动。尝试通过 --vm-dirver 指定,或者查阅 https://minikube.sigs.k8s.io/docs/start/", "Unable to enable dashboard": "", "Unable to fetch latest version info": "", @@ -978,6 +979,7 @@ "Userspace file server is shutdown": "", "Userspace file server: ": "", "Using Kubernetes v1.24+ with the Docker runtime requires cri-docker to be installed": "", + "Using Kubernetes {{.version}} since patch version was unspecified": "", "Using image repository {{.name}}": "正在使用镜像存储库 {{.name}}", "Using image {{.registry}}{{.image}}": "", "Using image {{.registry}}{{.image}} (global image repository)": "",