Merge branch 'master' of github.com:kubernetes/minikube into fix-download-test
commit
e36f848902
73
CHANGELOG.md
73
CHANGELOG.md
|
@ -1,5 +1,78 @@
|
|||
# Release Notes
|
||||
|
||||
## Version 1.17.0 - 2020-01-22
|
||||
|
||||
Features:
|
||||
|
||||
* Add multi-arch (arm64) support for docker/podman drivers [#9969](https://github.com/kubernetes/minikube/pull/9969)
|
||||
* Add new driver "SSH" to bootstrap generic minkube clusters over ssh [#10099](https://github.com/kubernetes/minikube/pull/10099)
|
||||
* Annotate Kubeconfig with 'Extension' to identify contexts/clusters created by minikube [#10126](https://github.com/kubernetes/minikube/pull/10126)
|
||||
* Add support for systemd cgroup to containerd runtime [#10100](https://github.com/kubernetes/minikube/pull/10100)
|
||||
* Add --network flag to select docker network to run with docker driver [#9538](https://github.com/kubernetes/minikube/pull/9538)
|
||||
|
||||
|
||||
|
||||
Minor Improvements:
|
||||
|
||||
* Improve exit codes by splitting PROVIDER_DOCKER_ERROR into more specific reason codes [#10212](https://github.com/kubernetes/minikube/pull/10212)
|
||||
* Improve warning about the suggested memory size [#10187](https://github.com/kubernetes/minikube/pull/10187)
|
||||
* Remove systemd dependency from none driver [#10112](https://github.com/kubernetes/minikube/pull/10112)
|
||||
* Delete the existing cluster if guest driver mismatch [#10084](https://github.com/kubernetes/minikube/pull/10084)
|
||||
* Remove obsolete 'vmwarefusion' driver, add friendly message [#9958](https://github.com/kubernetes/minikube/pull/9958)
|
||||
* UI: Add a spinner for `creating container` step [#10024](https://github.com/kubernetes/minikube/pull/10024)
|
||||
* Added validation for --insecure-registry values [#9977](https://github.com/kubernetes/minikube/pull/9977)
|
||||
|
||||
|
||||
Bug Fixes:
|
||||
|
||||
* Snap package manger: fix cert copy issue [#10042](https://github.com/kubernetes/minikube/pull/10042)
|
||||
* Ignore non-socks5 ALL_PROXY env var when checking docker status [#10109](https://github.com/kubernetes/minikube/pull/10109)
|
||||
* Docker-env: avoid race condition in bootstrap certs for parallel runs [#10118](https://github.com/kubernetes/minikube/pull/10118)
|
||||
* Fix 'profile list' for multi-node clusters [#9955](https://github.com/kubernetes/minikube/pull/9955)
|
||||
* Change metrics-server pull policy to IfNotPresent [#10096](https://github.com/kubernetes/minikube/pull/10096)
|
||||
* Podman driver: Handle installations without default bridge [#10092](https://github.com/kubernetes/minikube/pull/10092)
|
||||
* Fix docker inspect network go template for network which doesn't have MTU [#10053](https://github.com/kubernetes/minikube/pull/10053)
|
||||
* Docker/Podman: add control-plane to NO_PROXY [#10046](https://github.com/kubernetes/minikube/pull/10046)
|
||||
* "cache add": fix command error when not specifying :latest tag [#10058](https://github.com/kubernetes/minikube/pull/10058)
|
||||
* Networking: Fix ClusterDomain value in kubeadm KubeletConfiguration [#10049](https://github.com/kubernetes/minikube/pull/10049)
|
||||
* Fix typo in the csi-hostpath-driver addon name [#10034](https://github.com/kubernetes/minikube/pull/10034)
|
||||
|
||||
|
||||
Upgrades:
|
||||
|
||||
* bump default Kubernetes version to v1.20.2 and add v1.20.3-rc.0 [#10194](https://github.com/kubernetes/minikube/pull/10194)
|
||||
* Upgrade Docker, from 20.10.1 to 20.10.2 [#10154](https://github.com/kubernetes/minikube/pull/10154)
|
||||
* ISO: Added sch_htb, cls_fw, cls_matchall, act_connmark and ifb kernel modules [#10048](https://github.com/kubernetes/minikube/pull/10048)
|
||||
* ISO: add XFS_QUOTA support to guest vm [#9999](https://github.com/kubernetes/minikube/pull/9999)
|
||||
|
||||
Thank you to our contributors for this release!
|
||||
|
||||
- AUT0R3V
|
||||
- Amar Tumballi
|
||||
- Anders F Björklund
|
||||
- Daehyeok Mun
|
||||
- Eric Briand
|
||||
- Ilya Zuyev
|
||||
- Ivan Milchev
|
||||
- Jituri, Pranav
|
||||
- Laurent VERDOÏA
|
||||
- Ling Samuel
|
||||
- Medya Ghazizadeh
|
||||
- Oliver Radwell
|
||||
- Pablo Caderno
|
||||
- Priya Wadhwa
|
||||
- Sadlil
|
||||
- Sharif Elgamal
|
||||
- Steven Powell
|
||||
- Thomas Strömberg
|
||||
- Yanshu Zhao
|
||||
- alonyb
|
||||
- anencore94
|
||||
- cxsu
|
||||
- zouyu
|
||||
|
||||
## Version 1.16.0 - 2020-12-17
|
||||
|
||||
* fix ip node retrieve for none driver [#9986](https://github.com/kubernetes/minikube/pull/9986)
|
||||
* remove experimental warning for multinode [#9987](https://github.com/kubernetes/minikube/pull/9987)
|
||||
* Enable Ingress Addon for Docker Windows [#9761](https://github.com/kubernetes/minikube/pull/9761)
|
||||
|
|
52
Makefile
52
Makefile
|
@ -14,7 +14,7 @@
|
|||
|
||||
# Bump these on release - and please check ISO_VERSION for correctness.
|
||||
VERSION_MAJOR ?= 1
|
||||
VERSION_MINOR ?= 16
|
||||
VERSION_MINOR ?= 17
|
||||
VERSION_BUILD ?= 0
|
||||
RAW_VERSION=$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_BUILD)
|
||||
VERSION ?= v$(RAW_VERSION)
|
||||
|
@ -26,7 +26,10 @@ KIC_VERSION ?= $(shell egrep "Version =" pkg/drivers/kic/types.go | cut -d \" -f
|
|||
ISO_VERSION ?= v1.17.0
|
||||
# Dashes are valid in semver, but not Linux packaging. Use ~ to delimit alpha/beta
|
||||
DEB_VERSION ?= $(subst -,~,$(RAW_VERSION))
|
||||
DEB_REVISION ?= 0
|
||||
|
||||
RPM_VERSION ?= $(DEB_VERSION)
|
||||
RPM_REVISION ?= 0
|
||||
|
||||
# used by hack/jenkins/release_build_and_upload.sh and KVM_BUILD_IMAGE, see also BUILD_IMAGE below
|
||||
GO_VERSION ?= 1.15.5
|
||||
|
@ -397,6 +400,7 @@ clean: ## Clean build
|
|||
rm -f pkg/minikube/assets/assets.go
|
||||
rm -f pkg/minikube/translate/translations.go
|
||||
rm -rf ./vendor
|
||||
rm -rf /tmp/tmp.*.minikube_*
|
||||
|
||||
.PHONY: gendocs
|
||||
gendocs: out/docs/minikube.md ## Generate documentation
|
||||
|
@ -462,40 +466,44 @@ out/docs/minikube.md: $(shell find "cmd") $(shell find "pkg/minikube/constants")
|
|||
go run -ldflags="$(MINIKUBE_LDFLAGS)" -tags gendocs hack/help_text/gen_help_text.go
|
||||
|
||||
deb_version:
|
||||
@echo $(DEB_VERSION)
|
||||
@echo $(DEB_VERSION)-$(DEB_REVISION)
|
||||
|
||||
out/minikube_$(DEB_VERSION).deb: out/minikube_$(DEB_VERSION)-0_amd64.deb
|
||||
out/minikube_$(DEB_VERSION).deb: out/minikube_$(DEB_VERSION)-$(DEB_REVISION)_amd64.deb
|
||||
cp $< $@
|
||||
|
||||
out/minikube_$(DEB_VERSION)-0_%.deb: out/minikube-linux-%
|
||||
cp -r installers/linux/deb/minikube_deb_template out/minikube_$(DEB_VERSION)
|
||||
chmod 0755 out/minikube_$(DEB_VERSION)/DEBIAN
|
||||
sed -E -i 's/--VERSION--/'$(DEB_VERSION)'/g' out/minikube_$(DEB_VERSION)/DEBIAN/control
|
||||
sed -E -i 's/--ARCH--/'$*'/g' out/minikube_$(DEB_VERSION)/DEBIAN/control
|
||||
out/minikube_$(DEB_VERSION)-$(DEB_REVISION)_%.deb: out/minikube-linux-%
|
||||
$(eval DEB_PACKAGING_DIRECTORY_$*=$(shell mktemp -d --suffix ".minikube_$(DEB_VERSION)-$*-deb"))
|
||||
cp -r installers/linux/deb/minikube_deb_template/* $(DEB_PACKAGING_DIRECTORY_$*)/
|
||||
chmod 0755 $(DEB_PACKAGING_DIRECTORY_$*)/DEBIAN
|
||||
sed -E -i 's/--VERSION--/'$(DEB_VERSION)'/g' $(DEB_PACKAGING_DIRECTORY_$*)/DEBIAN/control
|
||||
sed -E -i 's/--ARCH--/'$*'/g' $(DEB_PACKAGING_DIRECTORY_$*)/DEBIAN/control
|
||||
|
||||
if [ "$*" = "amd64" ]; then \
|
||||
sed -E -i 's/--RECOMMENDS--/virtualbox/' out/minikube_$(DEB_VERSION)/DEBIAN/control; \
|
||||
sed -E -i 's/--RECOMMENDS--/virtualbox/' $(DEB_PACKAGING_DIRECTORY_$*)/DEBIAN/control; \
|
||||
else \
|
||||
sed -E -i '/Recommends: --RECOMMENDS--/d' out/minikube_$(DEB_VERSION)/DEBIAN/control; \
|
||||
sed -E -i '/Recommends: --RECOMMENDS--/d' $(DEB_PACKAGING_DIRECTORY_$*)/DEBIAN/control; \
|
||||
fi
|
||||
mkdir -p out/minikube_$(DEB_VERSION)/usr/bin
|
||||
cp $< out/minikube_$(DEB_VERSION)/usr/bin/minikube
|
||||
fakeroot dpkg-deb --build out/minikube_$(DEB_VERSION) $@
|
||||
rm -rf out/minikube_$(DEB_VERSION)
|
||||
|
||||
mkdir -p $(DEB_PACKAGING_DIRECTORY_$*)/usr/bin
|
||||
cp $< $(DEB_PACKAGING_DIRECTORY_$*)/usr/bin/minikube
|
||||
fakeroot dpkg-deb --build $(DEB_PACKAGING_DIRECTORY_$*) $@
|
||||
rm -rf $(DEB_PACKAGING_DIRECTORY_$*)
|
||||
|
||||
rpm_version:
|
||||
@echo $(RPM_VERSION)
|
||||
@echo $(RPM_VERSION)-$(RPM_REVISION)
|
||||
|
||||
out/minikube-$(RPM_VERSION).rpm: out/minikube-$(RPM_VERSION)-0.x86_64.rpm
|
||||
out/minikube-$(RPM_VERSION).rpm: out/minikube-$(RPM_VERSION)-$(RPM_REVISION).x86_64.rpm
|
||||
cp $< $@
|
||||
|
||||
out/minikube-$(RPM_VERSION)-0.%.rpm: out/minikube-linux-%
|
||||
cp -r installers/linux/rpm/minikube_rpm_template out/minikube-$(RPM_VERSION)
|
||||
sed -E -i 's/--VERSION--/'$(RPM_VERSION)'/g' out/minikube-$(RPM_VERSION)/minikube.spec
|
||||
sed -E -i 's|--OUT--|'$(PWD)/out'|g' out/minikube-$(RPM_VERSION)/minikube.spec
|
||||
$(eval RPM_PACKAGING_DIRECTORY_$*=$(shell mktemp -d --suffix ".minikube_$(RPM_VERSION)-$*-rpm"))
|
||||
cp -r installers/linux/rpm/minikube_rpm_template/* $(RPM_PACKAGING_DIRECTORY_$*)/
|
||||
sed -E -i 's/--VERSION--/'$(RPM_VERSION)'/g' $(RPM_PACKAGING_DIRECTORY_$*)/minikube.spec
|
||||
sed -E -i 's|--OUT--|'$(PWD)/out'|g' $(RPM_PACKAGING_DIRECTORY_$*)/minikube.spec
|
||||
rpmbuild -bb -D "_rpmdir $(PWD)/out" --target $* \
|
||||
out/minikube-$(RPM_VERSION)/minikube.spec
|
||||
@mv out/$*/minikube-$(RPM_VERSION)-0.$*.rpm out/ && rmdir out/$*
|
||||
rm -rf out/minikube-$(RPM_VERSION)
|
||||
$(RPM_PACKAGING_DIRECTORY_$*)/minikube.spec
|
||||
@mv out/$*/minikube-$(RPM_VERSION)-$(RPM_REVISION).$*.rpm out/ && rmdir out/$*
|
||||
rm -rf $(RPM_PACKAGING_DIRECTORY_$*)
|
||||
|
||||
.PHONY: apt
|
||||
apt: out/Release ## Generate apt package file
|
||||
|
|
|
@ -740,7 +740,11 @@ func validateDriver(ds registry.DriverState, existing *config.ClusterConfig) {
|
|||
}, `The '{{.driver}}' provider was not found: {{.error}}`, out.V{"driver": name, "error": st.Error})
|
||||
}
|
||||
|
||||
id := fmt.Sprintf("PROVIDER_%s_ERROR", strings.ToUpper(name))
|
||||
id := st.Reason
|
||||
if id == "" {
|
||||
id = fmt.Sprintf("PROVIDER_%s_ERROR", strings.ToUpper(name))
|
||||
}
|
||||
|
||||
code := reason.ExProviderUnavailable
|
||||
|
||||
if !st.Running {
|
||||
|
|
|
@ -142,7 +142,7 @@ func initMinikubeFlags() {
|
|||
startCmd.Flags().String(kicBaseImage, kic.BaseImage, "The base image to use for docker/podman drivers. Intended for local development.")
|
||||
startCmd.Flags().Bool(keepContext, false, "This will keep the existing kubectl context and will create a minikube context.")
|
||||
startCmd.Flags().Bool(embedCerts, false, "if true, will embed the certs in kubeconfig.")
|
||||
startCmd.Flags().String(containerRuntime, "docker", fmt.Sprintf("The container runtime to be used (%s).", strings.Join(cruntime.ValidRuntimes(), ", ")))
|
||||
startCmd.Flags().String(containerRuntime, constants.DefaultContainerRuntime, fmt.Sprintf("The container runtime to be used (%s).", strings.Join(cruntime.ValidRuntimes(), ", ")))
|
||||
startCmd.Flags().Bool(createMount, false, "This will start the mount daemon and automatically mount files into minikube.")
|
||||
startCmd.Flags().String(mountString, constants.DefaultMountDir+":/minikube-host", "The argument to pass the minikube mount command on start.")
|
||||
startCmd.Flags().StringSliceVar(&config.AddonList, "addons", nil, "Enable addons. see `minikube addons list` for a list of valid addon names.")
|
||||
|
|
|
@ -1,4 +1,12 @@
|
|||
[
|
||||
{
|
||||
"name": "v1.17.0",
|
||||
"checksums": {
|
||||
"darwin": "ad2b4de4b3f8863c2cfa9f5072cdc787141b0587fb9855dd645242253489fab3",
|
||||
"linux": "e312901e12c347d0e4eec74d94b8d75512943eb62479b441bb1332f05cde0d09",
|
||||
"windows": "dcae6ee972a49c4389d5e3ea81039b826cda55fefbe23b9273eeb46514abe244"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "v1.16.0",
|
||||
"checksums": {
|
||||
|
|
|
@ -25,6 +25,7 @@ apiServer:
|
|||
enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
|
||||
controllerManager:
|
||||
extraArgs:
|
||||
allocate-node-cidrs: "true"
|
||||
leader-elect: "false"
|
||||
scheduler:
|
||||
extraArgs:
|
||||
|
|
|
@ -25,6 +25,7 @@ apiServer:
|
|||
enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
|
||||
controllerManager:
|
||||
extraArgs:
|
||||
allocate-node-cidrs: "true"
|
||||
leader-elect: "false"
|
||||
scheduler:
|
||||
extraArgs:
|
||||
|
|
|
@ -25,6 +25,7 @@ apiServer:
|
|||
enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
|
||||
controllerManager:
|
||||
extraArgs:
|
||||
allocate-node-cidrs: "true"
|
||||
leader-elect: "false"
|
||||
scheduler:
|
||||
extraArgs:
|
||||
|
|
|
@ -27,6 +27,7 @@ apiServer:
|
|||
feature-gates: "a=b"
|
||||
controllerManager:
|
||||
extraArgs:
|
||||
allocate-node-cidrs: "true"
|
||||
feature-gates: "a=b"
|
||||
kube-api-burst: "32"
|
||||
leader-elect: "false"
|
||||
|
|
|
@ -25,6 +25,7 @@ apiServer:
|
|||
enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
|
||||
controllerManager:
|
||||
extraArgs:
|
||||
allocate-node-cidrs: "true"
|
||||
leader-elect: "false"
|
||||
scheduler:
|
||||
extraArgs:
|
||||
|
|
|
@ -25,6 +25,7 @@ apiServer:
|
|||
enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
|
||||
controllerManager:
|
||||
extraArgs:
|
||||
allocate-node-cidrs: "true"
|
||||
leader-elect: "false"
|
||||
scheduler:
|
||||
extraArgs:
|
||||
|
|
|
@ -25,6 +25,7 @@ apiServer:
|
|||
enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
|
||||
controllerManager:
|
||||
extraArgs:
|
||||
allocate-node-cidrs: "true"
|
||||
leader-elect: "false"
|
||||
scheduler:
|
||||
extraArgs:
|
||||
|
@ -41,7 +42,7 @@ etcd:
|
|||
proxy-refresh-interval: "70000"
|
||||
kubernetesVersion: v1.19.0
|
||||
networking:
|
||||
dnsDomain: 1.1.1.1
|
||||
dnsDomain: minikube.local
|
||||
podSubnet: "10.244.0.0/16"
|
||||
serviceSubnet: 10.96.0.0/12
|
||||
---
|
||||
|
@ -51,7 +52,7 @@ authentication:
|
|||
x509:
|
||||
clientCAFile: /var/lib/minikube/certs/ca.crt
|
||||
cgroupDriver: systemd
|
||||
clusterDomain: "cluster.local"
|
||||
clusterDomain: "minikube.local"
|
||||
# disable disk resource management by default
|
||||
imageGCHighThresholdPercent: 100
|
||||
evictionHard:
|
||||
|
|
|
@ -26,6 +26,7 @@ apiServer:
|
|||
enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
|
||||
controllerManager:
|
||||
extraArgs:
|
||||
allocate-node-cidrs: "true"
|
||||
leader-elect: "false"
|
||||
scheduler:
|
||||
extraArgs:
|
||||
|
|
|
@ -26,6 +26,7 @@ apiServer:
|
|||
fail-no-swap: "true"
|
||||
controllerManager:
|
||||
extraArgs:
|
||||
allocate-node-cidrs: "true"
|
||||
kube-api-burst: "32"
|
||||
leader-elect: "false"
|
||||
scheduler:
|
||||
|
|
|
@ -27,10 +27,10 @@ import (
|
|||
|
||||
const (
|
||||
// DefaultKubernetesVersion is the default Kubernetes version
|
||||
DefaultKubernetesVersion = "v1.20.0"
|
||||
DefaultKubernetesVersion = "v1.20.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.20.0"
|
||||
NewestKubernetesVersion = "v1.20.3-rc.0"
|
||||
// OldestKubernetesVersion is the oldest Kubernetes version to test against
|
||||
OldestKubernetesVersion = "v1.13.0"
|
||||
// DefaultClusterName is the default nane for the k8s cluster
|
||||
|
@ -45,6 +45,8 @@ const (
|
|||
RegistryAddonPort = 5000
|
||||
// CRIO is the default name and spelling for the cri-o container runtime
|
||||
CRIO = "crio"
|
||||
// DefaultContainerRuntime is our default container runtime
|
||||
DefaultContainerRuntime = "docker"
|
||||
|
||||
// APIServerName is the default API server name
|
||||
APIServerName = "minikubeCA"
|
||||
|
|
|
@ -84,7 +84,10 @@ func (r *Docker) Version() (string, error) {
|
|||
|
||||
// SocketPath returns the path to the socket file for Docker
|
||||
func (r *Docker) SocketPath() string {
|
||||
return r.Socket
|
||||
if r.Socket != "" {
|
||||
return r.Socket
|
||||
}
|
||||
return "/var/run/dockershim.sock"
|
||||
}
|
||||
|
||||
// Available returns an error if it is not possible to use this runtime on a host
|
||||
|
@ -108,6 +111,10 @@ func (r *Docker) Enable(disOthers, forceSystemd bool) error {
|
|||
}
|
||||
}
|
||||
|
||||
if err := populateCRIConfig(r.Runner, r.SocketPath()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if forceSystemd {
|
||||
if err := r.forceSystemd(); err != nil {
|
||||
return err
|
||||
|
|
|
@ -95,8 +95,10 @@ func status() registry.State {
|
|||
cmd := exec.CommandContext(ctx, oci.Docker, "version", "--format", "{{.Server.Os}}-{{.Server.Version}}")
|
||||
o, err := cmd.Output()
|
||||
if err != nil {
|
||||
reason := ""
|
||||
if ctx.Err() == context.DeadlineExceeded {
|
||||
err = errors.Wrapf(err, "deadline exceeded running %q", strings.Join(cmd.Args, " "))
|
||||
reason = "PROVIDER_DOCKER_DEADLINE_EXCEEDED"
|
||||
}
|
||||
|
||||
klog.Warningf("docker version returned error: %v", err)
|
||||
|
@ -104,26 +106,25 @@ func status() registry.State {
|
|||
if exitErr, ok := err.(*exec.ExitError); ok {
|
||||
stderr := strings.TrimSpace(string(exitErr.Stderr))
|
||||
newErr := fmt.Errorf(`%q %v: %s`, strings.Join(cmd.Args, " "), exitErr, stderr)
|
||||
|
||||
return suggestFix(stderr, newErr)
|
||||
return suggestFix("version", exitErr.ExitCode(), stderr, newErr)
|
||||
}
|
||||
|
||||
return registry.State{Error: err, Installed: true, Healthy: false, Fix: "Restart the Docker service", Doc: docURL}
|
||||
return registry.State{Reason: reason, Error: err, Installed: true, Healthy: false, Fix: "Restart the Docker service", Doc: docURL}
|
||||
}
|
||||
|
||||
klog.Infof("docker version: %s", o)
|
||||
if strings.Contains(string(o), "windows-") {
|
||||
return registry.State{Error: oci.ErrWindowsContainers, Installed: true, Healthy: false, Fix: "Change container type to \"linux\" in Docker Desktop settings", Doc: docURL + "#verify-docker-container-type-is-linux"}
|
||||
return registry.State{Reason: "PROVIDER_DOCKER_WINDOWS_CONTAINERS", Error: oci.ErrWindowsContainers, Installed: true, Healthy: false, Fix: "Change container type to \"linux\" in Docker Desktop settings", Doc: docURL + "#verify-docker-container-type-is-linux"}
|
||||
}
|
||||
|
||||
si, err := oci.CachedDaemonInfo("docker")
|
||||
if err != nil {
|
||||
// No known fix because we haven't yet seen a failure here
|
||||
return registry.State{Error: errors.Wrap(err, "docker info"), Installed: true, Healthy: false, Doc: docURL}
|
||||
return registry.State{Reason: "PROVIDER_DOCKER_INFO_FAILED", Error: errors.Wrap(err, "docker info"), Installed: true, Healthy: false, Doc: docURL}
|
||||
}
|
||||
|
||||
for _, serr := range si.Errors {
|
||||
return suggestFix(serr, fmt.Errorf("docker info error: %s", serr))
|
||||
return suggestFix("info", -1, serr, fmt.Errorf("docker info error: %s", serr))
|
||||
}
|
||||
|
||||
return checkNeedsImprovement()
|
||||
|
@ -157,23 +158,43 @@ func checkOverlayMod() registry.State {
|
|||
}
|
||||
|
||||
// suggestFix matches a stderr with possible fix for the docker driver
|
||||
func suggestFix(stderr string, err error) registry.State {
|
||||
func suggestFix(src string, exitcode int, stderr string, err error) registry.State {
|
||||
if strings.Contains(stderr, "permission denied") && runtime.GOOS == "linux" {
|
||||
return registry.State{Error: err, Installed: true, Running: true, Healthy: false, Fix: "Add your user to the 'docker' group: 'sudo usermod -aG docker $USER && newgrp docker'", Doc: "https://docs.docker.com/engine/install/linux-postinstall/"}
|
||||
return registry.State{Reason: "PROVIDER_DOCKER_NEWGRP", Error: err, Installed: true, Running: true, Healthy: false, Fix: "Add your user to the 'docker' group: 'sudo usermod -aG docker $USER && newgrp docker'", Doc: "https://docs.docker.com/engine/install/linux-postinstall/"}
|
||||
}
|
||||
|
||||
if strings.Contains(stderr, "/pipe/docker_engine: The system cannot find the file specified.") && runtime.GOOS == "windows" {
|
||||
return registry.State{Error: err, Installed: true, Running: false, Healthy: false, Fix: "Start the Docker service. If Docker is already running, you may need to reset Docker to factory settings with: Settings > Reset.", Doc: "https://github.com/docker/for-win/issues/1825#issuecomment-450501157"}
|
||||
return registry.State{Reason: "PROVIDER_DOCKER_PIPE_NOT_FOUND", Error: err, Installed: true, Running: false, Healthy: false, Fix: "Start the Docker service. If Docker is already running, you may need to reset Docker to factory settings with: Settings > Reset.", Doc: "https://github.com/docker/for-win/issues/1825#issuecomment-450501157"}
|
||||
}
|
||||
|
||||
if dockerNotRunning(stderr) {
|
||||
return registry.State{Error: err, Installed: true, Running: false, Healthy: false, Fix: "Start the Docker service", Doc: docURL}
|
||||
reason := dockerNotRunning(stderr)
|
||||
if reason != "" {
|
||||
return registry.State{Reason: reason, Error: err, Installed: true, Running: false, Healthy: false, Fix: "Start the Docker service", Doc: docURL}
|
||||
}
|
||||
|
||||
// We don't have good advice, but at least we can provide a good error message
|
||||
return registry.State{Error: err, Installed: true, Running: true, Healthy: false, Doc: docURL}
|
||||
reason = strings.ToUpper(fmt.Sprintf("PROVIDER_DOCKER_%s_ERROR", src))
|
||||
if exitcode > 0 {
|
||||
reason = strings.ToUpper(fmt.Sprintf("PROVIDER_DOCKER_%s_EXIT_%d", src, exitcode))
|
||||
}
|
||||
return registry.State{Reason: reason, Error: err, Installed: true, Running: true, Healthy: false, Doc: docURL}
|
||||
}
|
||||
|
||||
func dockerNotRunning(s string) bool {
|
||||
return strings.Contains(s, "Cannot connect") || strings.Contains(s, "refused") || strings.Contains(s, "Is the docker daemon running") || strings.Contains(s, "docker daemon is not running")
|
||||
// Return a reason code for Docker not running
|
||||
func dockerNotRunning(s string) string {
|
||||
// These codes are explicitly in order of the most likely to be helpful to a user
|
||||
|
||||
if strings.Contains(s, "Is the docker daemon running") || strings.Contains(s, "docker daemon is not running") {
|
||||
return "PROVIDER_DOCKER_NOT_RUNNING"
|
||||
}
|
||||
|
||||
if strings.Contains(s, "Cannot connect") {
|
||||
return "PROVIDER_DOCKER_CANNOT_CONNECT"
|
||||
}
|
||||
|
||||
if strings.Contains(s, "refused") {
|
||||
return "PROVIDER_DOCKER_REFUSED"
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
|
|
@ -79,8 +79,10 @@ type State struct {
|
|||
Running bool // it at least appears to be running
|
||||
NeedsImprovement bool // healthy but could be improved
|
||||
Error error
|
||||
Fix string
|
||||
Doc string
|
||||
|
||||
Reason string // A reason ID, propagated to reason.Kind.ID
|
||||
Fix string
|
||||
Doc string
|
||||
}
|
||||
|
||||
// DriverDef defines how to initialize and load a machine driver
|
||||
|
|
|
@ -66,7 +66,7 @@ minikube start [flags]
|
|||
--interactive Allow user prompts for more information (default true)
|
||||
--iso-url strings Locations to fetch the minikube ISO from. (default [https://storage.googleapis.com/minikube/iso/minikube-v1.17.0.iso,https://github.com/kubernetes/minikube/releases/download/v1.17.0/minikube-v1.17.0.iso,https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.17.0.iso])
|
||||
--keep-context This will keep the existing kubectl context and will create a minikube context.
|
||||
--kubernetes-version string The Kubernetes version that the minikube VM will use (ex: v1.2.3, 'stable' for v1.20.0, 'latest' for v1.20.0). Defaults to 'stable'.
|
||||
--kubernetes-version string The Kubernetes version that the minikube VM will use (ex: v1.2.3, 'stable' for v1.20.2, 'latest' for v1.20.3-rc.0). 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 network name. (kvm2 driver only) (default "default")
|
||||
|
|
|
@ -197,8 +197,7 @@ func TestDownloadOnlyKic(t *testing.T) {
|
|||
ctx, cancel := context.WithTimeout(context.Background(), Minutes(15))
|
||||
defer Cleanup(t, profile, cancel)
|
||||
|
||||
// TODO: #7795 add containerd to download only too
|
||||
cRuntime := "docker"
|
||||
cRuntime := ContainerRuntime()
|
||||
|
||||
args := []string{"start", "--download-only", "-p", profile, "--force", "--alsologtostderr"}
|
||||
args = append(args, StartArgs()...)
|
||||
|
|
|
@ -30,6 +30,9 @@ func TestDockerFlags(t *testing.T) {
|
|||
if NoneDriver() {
|
||||
t.Skip("skipping: none driver does not support ssh or bundle docker")
|
||||
}
|
||||
if ContainerRuntime() != "docker" {
|
||||
t.Skipf("skipping: only runs with docker container runtime, currently testing %s", ContainerRuntime())
|
||||
}
|
||||
MaybeParallel(t)
|
||||
|
||||
profile := UniqueProfileName("docker-flags")
|
||||
|
@ -82,16 +85,36 @@ func TestForceSystemdFlag(t *testing.T) {
|
|||
t.Errorf("failed to start minikube with args: %q : %v", rr.Command(), err)
|
||||
}
|
||||
|
||||
rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", "docker info --format {{.CgroupDriver}}"))
|
||||
containerRuntime := ContainerRuntime()
|
||||
switch containerRuntime {
|
||||
case "docker":
|
||||
validateDockerSystemd(ctx, t, profile)
|
||||
case "containerd":
|
||||
validateContainerdSystemd(ctx, t, profile)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func validateDockerSystemd(ctx context.Context, t *testing.T, profile string) {
|
||||
rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", "docker info --format {{.CgroupDriver}}"))
|
||||
if err != nil {
|
||||
t.Errorf("failed to get docker cgroup driver. args %q: %v", rr.Command(), err)
|
||||
}
|
||||
|
||||
if !strings.Contains(rr.Output(), "systemd") {
|
||||
t.Fatalf("expected systemd cgroup driver, got: %v", rr.Output())
|
||||
}
|
||||
}
|
||||
|
||||
func validateContainerdSystemd(ctx context.Context, t *testing.T, profile string) {
|
||||
rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", "cat /etc/containerd/config.toml"))
|
||||
if err != nil {
|
||||
t.Errorf("failed to get docker cgroup driver. args %q: %v", rr.Command(), err)
|
||||
}
|
||||
if !strings.Contains(rr.Output(), "systemd_cgroup = true") {
|
||||
t.Fatalf("expected systemd cgroup driver, got: %v", rr.Output())
|
||||
}
|
||||
}
|
||||
|
||||
func TestForceSystemdEnv(t *testing.T) {
|
||||
if NoneDriver() {
|
||||
t.Skip("skipping: none driver does not support ssh or bundle docker")
|
||||
|
@ -109,13 +132,11 @@ func TestForceSystemdEnv(t *testing.T) {
|
|||
if err != nil {
|
||||
t.Errorf("failed to start minikube with args: %q : %v", rr.Command(), err)
|
||||
}
|
||||
|
||||
rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", "docker info --format {{.CgroupDriver}}"))
|
||||
if err != nil {
|
||||
t.Errorf("failed to get docker cgroup driver. args %q: %v", rr.Command(), err)
|
||||
}
|
||||
|
||||
if !strings.Contains(rr.Output(), "systemd") {
|
||||
t.Fatalf("expected systemd cgroup driver, got: %v", rr.Output())
|
||||
containerRuntime := ContainerRuntime()
|
||||
switch containerRuntime {
|
||||
case "docker":
|
||||
validateDockerSystemd(ctx, t, profile)
|
||||
case "containerd":
|
||||
validateContainerdSystemd(ctx, t, profile)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -159,7 +159,11 @@ func validateNodeLabels(ctx context.Context, t *testing.T, profile string) {
|
|||
}
|
||||
|
||||
// check functionality of minikube after evaling docker-env
|
||||
// TODO: Add validatePodmanEnv for crio runtime: #10231
|
||||
func validateDockerEnv(ctx context.Context, t *testing.T, profile string) {
|
||||
if cr := ContainerRuntime(); cr != "docker" {
|
||||
t.Skipf("only validate docker env with docker container runtime, currently testing %s", cr)
|
||||
}
|
||||
defer PostMortemLogs(t, profile)
|
||||
mctx, cancel := context.WithTimeout(ctx, Seconds(120))
|
||||
defer cancel()
|
||||
|
|
|
@ -27,6 +27,7 @@ import (
|
|||
"testing"
|
||||
"time"
|
||||
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/driver"
|
||||
)
|
||||
|
||||
|
@ -129,6 +130,17 @@ func KicDriver() bool {
|
|||
return DockerDriver() || PodmanDriver()
|
||||
}
|
||||
|
||||
// ContainerRuntime returns the name of a specific container runtime if it was specified
|
||||
func ContainerRuntime() string {
|
||||
flag := "--container-runtime="
|
||||
for _, s := range StartArgs() {
|
||||
if strings.HasPrefix(s, flag) {
|
||||
return strings.TrimPrefix(s, flag)
|
||||
}
|
||||
}
|
||||
return constants.DefaultContainerRuntime
|
||||
}
|
||||
|
||||
// GithubActionRunner returns true if running inside a github action runner
|
||||
func GithubActionRunner() bool {
|
||||
// based on https://help.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables
|
||||
|
|
|
@ -38,6 +38,9 @@ func TestSkaffold(t *testing.T) {
|
|||
if NoneDriver() {
|
||||
t.Skip("none driver doesn't support `minikube docker-env`; skaffold depends on this command")
|
||||
}
|
||||
if cr := ContainerRuntime(); cr != "docker" {
|
||||
t.Skipf("skaffold requires docker-env, currently testing %s container runtime", cr)
|
||||
}
|
||||
|
||||
profile := UniqueProfileName("skaffold")
|
||||
ctx, cancel := context.WithTimeout(context.Background(), Minutes(5))
|
||||
|
|
|
@ -227,7 +227,6 @@ func validateAddonAfterStop(ctx context.Context, t *testing.T, profile string, t
|
|||
}
|
||||
|
||||
func validateKubernetesImages(ctx context.Context, t *testing.T, profile string, tcName string, tcVersion string, startArgs []string) {
|
||||
defer PostMortemLogs(t, profile)
|
||||
if !NoneDriver() {
|
||||
testPulledImages(ctx, t, profile, tcVersion)
|
||||
}
|
||||
|
@ -286,9 +285,12 @@ func testPulledImages(ctx context.Context, t *testing.T, profile string, version
|
|||
jv := map[string][]struct {
|
||||
Tags []string `json:"repoTags"`
|
||||
}{}
|
||||
err = json.Unmarshal(rr.Stdout.Bytes(), &jv)
|
||||
|
||||
stdout := rr.Stdout.String()
|
||||
|
||||
err = json.Unmarshal([]byte(stdout), &jv)
|
||||
if err != nil {
|
||||
t.Errorf("failed to decode images json %v. output: %s", err, rr.Output())
|
||||
t.Errorf("failed to decode images json %v. output:\n%s", err, stdout)
|
||||
}
|
||||
found := map[string]bool{}
|
||||
for _, img := range jv["images"] {
|
||||
|
|
|
@ -63,7 +63,7 @@ func legacyStartArgs() []string {
|
|||
return strings.Split(strings.Replace(*startArgs, "--driver", "--vm-driver", -1), " ")
|
||||
}
|
||||
|
||||
// TestRunningBinaryUpgrade does an upgrade test on a running cluster
|
||||
// TestRunningBinaryUpgrade upgrades a running legacy cluster to head minikube
|
||||
func TestRunningBinaryUpgrade(t *testing.T) {
|
||||
// not supported till v1.10, and passing new images to old releases isn't supported anyways
|
||||
if TestingKicBaseImage() {
|
||||
|
@ -92,7 +92,26 @@ func TestRunningBinaryUpgrade(t *testing.T) {
|
|||
args := append([]string{"start", "-p", profile, "--memory=2200"}, legacyStartArgs()...)
|
||||
rr := &RunResult{}
|
||||
r := func() error {
|
||||
rr, err = Run(t, exec.CommandContext(ctx, tf.Name(), args...))
|
||||
c := exec.CommandContext(ctx, tf.Name(), args...)
|
||||
legacyEnv := []string{}
|
||||
// replace the global KUBECONFIG with a fresh kubeconfig
|
||||
// because for minikube<1.17.0 it can not read the new kubeconfigs that have extra "Extenions" block
|
||||
// see: https://github.com/kubernetes/minikube/issues/10210
|
||||
for _, e := range os.Environ() {
|
||||
if !strings.Contains(e, "KUBECONFIG") { // get all global envs except the Kubeconfig which is used by new versions of minikubes
|
||||
legacyEnv = append(legacyEnv, e)
|
||||
}
|
||||
}
|
||||
// using a fresh kubeconfig for this test
|
||||
legacyKubeConfig, err := ioutil.TempFile("", "legacy_kubeconfig")
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create temp file for legacy kubeconfig %v", err)
|
||||
}
|
||||
|
||||
defer os.Remove(legacyKubeConfig.Name()) // clean up
|
||||
legacyEnv = append(legacyEnv, fmt.Sprintf("KUBECONFIG=%s", legacyKubeConfig.Name()))
|
||||
c.Env = legacyEnv
|
||||
rr, err = Run(t, c)
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -108,7 +127,7 @@ func TestRunningBinaryUpgrade(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
// TestStoppedBinaryUpgrade does an upgrade test on a stopped cluster
|
||||
// TestStoppedBinaryUpgrade starts a legacy minikube and stops it and then upgrades to head minikube
|
||||
func TestStoppedBinaryUpgrade(t *testing.T) {
|
||||
// not supported till v1.10, and passing new images to old releases isn't supported anyways
|
||||
if TestingKicBaseImage() {
|
||||
|
@ -139,7 +158,26 @@ func TestStoppedBinaryUpgrade(t *testing.T) {
|
|||
args := append([]string{"start", "-p", profile, "--memory=2200"}, legacyStartArgs()...)
|
||||
rr := &RunResult{}
|
||||
r := func() error {
|
||||
rr, err = Run(t, exec.CommandContext(ctx, tf.Name(), args...))
|
||||
c := exec.CommandContext(ctx, tf.Name(), args...)
|
||||
legacyEnv := []string{}
|
||||
// replace the global KUBECONFIG with a fresh kubeconfig
|
||||
// because for minikube<1.17.0 it can not read the new kubeconfigs that have extra "Extenions" block
|
||||
// see: https://github.com/kubernetes/minikube/issues/10210
|
||||
for _, e := range os.Environ() {
|
||||
if !strings.Contains(e, "KUBECONFIG") { // get all global envs except the Kubeconfig which is used by new versions of minikubes
|
||||
legacyEnv = append(legacyEnv, e)
|
||||
}
|
||||
}
|
||||
// using a fresh kubeconfig for this test
|
||||
legacyKubeConfig, err := ioutil.TempFile("", "legacy_kubeconfig")
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create temp file for legacy kubeconfig %v", err)
|
||||
}
|
||||
|
||||
defer os.Remove(legacyKubeConfig.Name()) // clean up
|
||||
legacyEnv = append(legacyEnv, fmt.Sprintf("KUBECONFIG=%s", legacyKubeConfig.Name()))
|
||||
c.Env = legacyEnv
|
||||
rr, err = Run(t, c)
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue