提交 ef2090ac 编写于 作者: P Priya Modali

Merge branch 'master' of https://github.com/kubernetes/minikube into klog

# Release Notes
## Version 1.14.0-beta.0 - 2020-10-06
## Features
* add dedicated network for docker driver [#9294](https://github.com/kubernetes/minikube/pull/9294)
* Make sure gcp-auth addon can be enabled on startup [#9318](https://github.com/kubernetes/minikube/pull/9318)
## Bug Fixes
* Fix minikube status bug when cluster is paused [#9383](https://github.com/kubernetes/minikube/pull/9383)
* don't allow profile name to be less than 2 characters [#9367](https://github.com/kubernetes/minikube/pull/9367)
* fix: "profile list" shows paused clusters as "Running" [#8978](https://github.com/kubernetes/minikube/pull/8978)
* Fix error in unittest, as pointed out by warning [#9345](https://github.com/kubernetes/minikube/pull/9345)
## Updates
* update kicbase image to ubuntu-based [#9353](https://github.com/kubernetes/minikube/pull/9353)
Thank you to our contributors for this release!
- Anders F Björklund
- Bob Killen
- Daniel Weibel
- Dominik Braun
- Ilya Zuyev
- JJ Asghar
- Jituri, Pranav
- Medya Ghazizadeh
- Michael Ryan Dempsey
- Predrag Rogic
- Priya Wadhwa
- Sharif Elgamal
- Tacio Costa
- Thomas Strömberg
- Till Hoffmann
- loftkun
- programistka
- zhanwang
## Version 1.13.1 - 2020-09-18
* Update Default Kubernetes Version to v1.19.2 [#9265](https://github.com/kubernetes/minikube/pull/9265)
* fix mounting for docker driver in windows [#9263](https://github.com/kubernetes/minikube/pull/9263)
......
......@@ -14,8 +14,8 @@
# Bump these on release - and please check ISO_VERSION for correctness.
VERSION_MAJOR ?= 1
VERSION_MINOR ?= 13
VERSION_BUILD ?= 1
VERSION_MINOR ?= 14
VERSION_BUILD ?= 0-beta.0
RAW_VERSION=$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_BUILD)
VERSION ?= v$(RAW_VERSION)
......@@ -23,7 +23,7 @@ KUBERNETES_VERSION ?= $(shell egrep "DefaultKubernetesVersion =" pkg/minikube/co
KIC_VERSION ?= $(shell egrep "Version =" pkg/drivers/kic/types.go | cut -d \" -f2)
# Default to .0 for higher cache hit rates, as build increments typically don't require new ISO versions
ISO_VERSION ?= v$(VERSION_MAJOR).$(VERSION_MINOR).1
ISO_VERSION ?= v1.13.1
# Dashes are valid in semver, but not Linux packaging. Use ~ to delimit alpha/beta
DEB_VERSION ?= $(subst -,~,$(RAW_VERSION))
RPM_VERSION ?= $(DEB_VERSION)
......@@ -94,12 +94,8 @@ GVISOR_TAG ?= latest
# storage provisioner tag to push changes to
STORAGE_PROVISIONER_TAG ?= v3
# TODO: multi-arch manifest
ifeq ($(GOARCH),amd64)
STORAGE_PROVISIONER_IMAGE ?= $(REGISTRY)/storage-provisioner:$(STORAGE_PROVISIONER_TAG)
else
STORAGE_PROVISIONER_MANIFEST ?= $(REGISTRY)/storage-provisioner:$(STORAGE_PROVISIONER_TAG)
STORAGE_PROVISIONER_IMAGE ?= $(REGISTRY)/storage-provisioner-$(GOARCH):$(STORAGE_PROVISIONER_TAG)
endif
# Set the version information for the Kubernetes servers
MINIKUBE_LDFLAGS := -X k8s.io/minikube/pkg/version.version=$(VERSION) -X k8s.io/minikube/pkg/version.isoVersion=$(ISO_VERSION) -X k8s.io/minikube/pkg/version.isoPath=$(ISO_BUCKET) -X k8s.io/minikube/pkg/version.gitCommitID=$(COMMIT) -X k8s.io/minikube/pkg/version.storageProvisionerVersion=$(STORAGE_PROVISIONER_TAG)
......@@ -579,8 +575,11 @@ else
endif
.PHONY: storage-provisioner-image
storage-provisioner-image: out/storage-provisioner-$(GOARCH) ## Build storage-provisioner docker image
docker build -t $(STORAGE_PROVISIONER_IMAGE) -f deploy/storage-provisioner/Dockerfile --build-arg arch=$(GOARCH) .
storage-provisioner-image: storage-provisioner-image-$(GOARCH) ## Build storage-provisioner docker image
docker tag $(REGISTRY)/storage-provisioner-$(GOARCH):$(STORAGE_PROVISIONER_TAG) $(REGISTRY)/storage-provisioner:$(STORAGE_PROVISIONER_TAG)
storage-provisioner-image-%: out/storage-provisioner-%
docker build -t $(REGISTRY)/storage-provisioner-$*:$(STORAGE_PROVISIONER_TAG) -f deploy/storage-provisioner/Dockerfile --build-arg arch=$* .
.PHONY: kic-base-image
kic-base-image: ## builds the base image used for kic.
......@@ -601,6 +600,18 @@ push-storage-provisioner-image: storage-provisioner-image ## Push storage-provis
docker login gcr.io/k8s-minikube
$(MAKE) push-docker IMAGE=$(STORAGE_PROVISIONER_IMAGE)
ALL_ARCH = amd64 arm arm64 ppc64le s390x
IMAGE = $(REGISTRY)/storage-provisioner
TAG = $(STORAGE_PROVISIONER_TAG)
.PHONY: push-storage-provisioner-manifest
push-storage-provisioner-manifest: $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~storage\-provisioner\-image\-&~g")
docker login gcr.io/k8s-minikube
set -x; for arch in $(ALL_ARCH); do docker push ${IMAGE}-$${arch}:${TAG}; done
docker manifest create --amend $(IMAGE):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(IMAGE)\-&:$(TAG)~g")
set -x; for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${IMAGE}:${TAG} ${IMAGE}-$${arch}:${TAG}; done
docker manifest push $(STORAGE_PROVISIONER_MANIFEST)
.PHONY: push-docker
push-docker: # Push docker image base on to IMAGE variable
@docker pull $(IMAGE) && echo "Image already exist in registry" && exit 1 || echo "Image doesn't exist in registry"
......
......@@ -210,7 +210,7 @@ func init() {
klog.InitFlags(nil)
goflag.Set("logtostderr", "false")
goflag.Set("alsologtostderr", "false")
goflag.Parse()
// goflag.Parse()
pflag.CommandLine.AddGoFlagSet(goflag.CommandLine)
if err := viper.BindPFlags(RootCmd.PersistentFlags()); err != nil {
......
......@@ -155,7 +155,7 @@ func runStart(cmd *cobra.Command, args []string) {
if !config.ProfileNameValid(ClusterFlagValue()) {
out.WarningT("Profile name '{{.name}}' is not valid", out.V{"name": ClusterFlagValue()})
exit.Message(reason.Usage, "Only alphanumeric and dashes '-' are permitted. Minimum 1 character, starting with alphanumeric.")
exit.Message(reason.Usage, "Only alphanumeric and dashes '-' are permitted. Minimum 2 characters, starting with alphanumeric.")
}
existing, err := config.Load(ClusterFlagValue())
......@@ -197,7 +197,7 @@ func runStart(cmd *cobra.Command, args []string) {
machine.MaybeDisplayAdvice(err, ds.Name)
if specified {
// If the user specified a driver, don't fallback to anything else
exit.Error(reason.GuestProvision, "error provisioning host", err)
exitGuestProvision(err)
} else {
success := false
// Walk down the rest of the options
......@@ -224,7 +224,7 @@ func runStart(cmd *cobra.Command, args []string) {
}
}
if !success {
exit.Error(reason.GuestProvision, "error provisioning host", err)
exitGuestProvision(err)
}
}
}
......@@ -248,7 +248,7 @@ func runStart(cmd *cobra.Command, args []string) {
stopProfile(existing.Name)
starter, err = provisionWithDriver(cmd, ds, existing)
if err != nil {
exit.Error(reason.GuestProvision, "error provisioning host", err)
exitGuestProvision(err)
}
}
}
......@@ -1263,3 +1263,10 @@ func exitIfNotForced(r reason.Kind, message string, v ...out.V) {
}
out.Error(r, message, v...)
}
func exitGuestProvision(err error) {
if errors.Cause(err) == oci.ErrInsufficientDockerStorage {
exit.Message(reason.RsrcInsufficientDockerStorage, "preload extraction failed: \"No space left on device\"")
}
exit.Error(reason.GuestProvision, "error provisioning host", err)
}
......@@ -107,6 +107,7 @@ const (
forceSystemd = "force-systemd"
kicBaseImage = "base-image"
startOutput = "output"
ports = "ports"
)
// initMinikubeFlags includes commandline flags for minikube.
......@@ -197,6 +198,9 @@ func initDriverFlags() {
startCmd.Flags().String(hypervVirtualSwitch, "", "The hyperv virtual switch name. Defaults to first found. (hyperv driver only)")
startCmd.Flags().Bool(hypervUseExternalSwitch, false, "Whether to use external switch over Default Switch if virtual switch not explicitly specified. (hyperv driver only)")
startCmd.Flags().String(hypervExternalAdapter, "", "External Adapter on which external switch will be created if no external switch is found. (hyperv driver only)")
// docker & podman
startCmd.Flags().StringSlice(ports, []string{}, "List of ports that should be exposed (docker and podman driver only)")
}
// initNetworkingFlags inits the commandline flags for connectivity related flags for start
......@@ -311,6 +315,7 @@ func generateClusterConfig(cmd *cobra.Command, existing *config.ClusterConfig, k
HostOnlyNicType: viper.GetString(hostOnlyNicType),
NatNicType: viper.GetString(natNicType),
StartHostTimeout: viper.GetDuration(waitTimeout),
ExposedPorts: viper.GetStringSlice(ports),
KubernetesConfig: config.KubernetesConfig{
KubernetesVersion: k8sVersion,
ClusterName: ClusterFlagValue(),
......@@ -547,6 +552,10 @@ func updateExistingConfigFromFlags(cmd *cobra.Command, existing *config.ClusterC
cc.KubernetesConfig.NodePort = viper.GetInt(apiServerPort)
}
if cmd.Flags().Changed(vsockPorts) {
cc.ExposedPorts = viper.GetStringSlice(ports)
}
// pre minikube 1.9.2 cc.KubernetesConfig.NodePort was not populated.
// in minikube config there were two fields for api server port.
// one in cc.KubernetesConfig.NodePort and one in cc.Nodes.Port
......
......@@ -57,6 +57,7 @@ var (
const (
// Additional legacy states:
// Configured means configured
Configured = "Configured" // ~state.Saved
// Misconfigured means misconfigured
......@@ -67,7 +68,9 @@ const (
Irrelevant = "Irrelevant"
// New status modes, based roughly on HTTP/SMTP standards
// 1xx signifies a transitional state. If retried, it will soon return a 2xx, 4xx, or 5xx
Starting = 100
Pausing = 101
Unpausing = 102
......@@ -75,21 +78,29 @@ const (
Deleting = 120
// 2xx signifies that the API Server is able to service requests
OK = 200
Warning = 203
// 4xx signifies an error that requires help from the client to resolve
NotFound = 404
Stopped = 405
Paused = 418 // I'm a teapot!
// 5xx signifies a server-side error (that may be retryable)
Error = 500
InsufficientStorage = 507
Unknown = 520
)
var (
exitCodeToHTTPCode = map[int]int{
// exit code 26 corresponds to insufficient storage
26: 507,
}
codeNames = map[int]string{
100: "Starting",
101: "Pausing",
......@@ -442,14 +453,18 @@ func readEventLog(name string) ([]cloudevents.Event, time.Time, error) {
// clusterState converts Status structs into a ClusterState struct
func clusterState(sts []*Status) ClusterState {
sc := statusCode(sts[0].Host)
statusName := sts[0].APIServer
if sts[0].Host == codeNames[InsufficientStorage] {
statusName = sts[0].Host
}
sc := statusCode(statusName)
cs := ClusterState{
BinaryVersion: version.GetVersion(),
BaseState: BaseState{
Name: ClusterFlagValue(),
StatusCode: sc,
StatusName: sts[0].Host,
StatusName: statusName,
StatusDetail: codeDetails[sc],
},
......@@ -533,6 +548,9 @@ func clusterState(sts []*Status) ClusterState {
klog.Errorf("unable to convert exit code to int: %v", err)
continue
}
if val, ok := exitCodeToHTTPCode[exitCode]; ok {
exitCode = val
}
transientCode = exitCode
for _, n := range cs.Nodes {
n.StatusCode = transientCode
......
......@@ -48,9 +48,8 @@ var (
var stopCmd = &cobra.Command{
Use: "stop",
Short: "Stops a running local Kubernetes cluster",
Long: `Stops a local Kubernetes cluster running in Virtualbox. This command stops the VM
itself, leaving all files intact. The cluster can be started again with the "start" command.`,
Run: runStop,
Long: `Stops a local Kubernetes cluster. This command stops the underlying VM or container, but keeps user data intact. The cluster can be started again with the "start" command.`,
Run: runStop,
}
func init() {
......
......@@ -19,7 +19,6 @@ package cmd
import (
"context"
"errors"
"flag"
"fmt"
"os"
......@@ -45,7 +44,7 @@ var rootCmd = &cobra.Command{
}
func init() {
flag.Parse()
// flag.Parse()
}
func validateArgs(args []string) error {
......
......@@ -86,6 +86,7 @@ spec:
metadata:
labels:
k8s-app: kubernetes-dashboard
gcp-auth-skip-secret: "true"
spec:
containers:
- name: kubernetes-dashboard
......
......@@ -50,6 +50,8 @@ spec:
template:
metadata:
name: gcp-auth-certs-create
labels:
gcp-auth-skip-secret: "true"
spec:
serviceAccountName: minikube-gcp-auth-certs
containers:
......@@ -77,10 +79,11 @@ spec:
labels:
app: gcp-auth
kubernetes.io/minikube-addons: gcp-auth
gcp-auth-skip-secret: "true"
spec:
containers:
- name: gcp-auth
image: gcr.io/k8s-minikube/gcp-auth-webhook:v0.0.2
image: gcr.io/k8s-minikube/gcp-auth-webhook:v0.0.3
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8443
......@@ -109,6 +112,8 @@ spec:
template:
metadata:
name: gcp-auth-certs-patch
labels:
gcp-auth-skip-secret: "true"
spec:
serviceAccountName: minikube-gcp-auth-certs
containers:
......
......@@ -20,6 +20,7 @@ metadata:
labels:
addonmanager.kubernetes.io/mode: Reconcile
kubernetes.io/minikube-addons: gvisor
gcp-auth-skip-secret: "true"
spec:
hostPID: true
containers:
......
......@@ -34,6 +34,7 @@ metadata:
kubernetes.io/bootstrapping: rbac-defaults
app.kubernetes.io/part-of: kube-system
addonmanager.kubernetes.io/mode: Reconcile
gcp-auth-skip-secret: "true"
rules:
- apiGroups:
- ""
......
......@@ -44,6 +44,7 @@ spec:
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controller
addonmanager.kubernetes.io/mode: Reconcile
gcp-auth-skip-secret: "true"
spec:
serviceAccountName: ingress-nginx
containers:
......
......@@ -95,12 +95,13 @@ metadata:
labels:
integration-test: storage-provisioner
addonmanager.kubernetes.io/mode: Reconcile
gcp-auth-skip-secret: "true"
spec:
serviceAccountName: storage-provisioner
hostNetwork: true
containers:
- name: storage-provisioner
image: {{default "gcr.io/k8s-minikube" .ImageRepository}}/storage-provisioner{{.ExoticArch}}:{{.StorageProvisionerVersion}}
image: {{default "gcr.io/k8s-minikube" .ImageRepository}}/storage-provisioner:{{.StorageProvisionerVersion}}
command: ["/storage-provisioner"]
imagePullPolicy: IfNotPresent
volumeMounts:
......
......@@ -42,7 +42,7 @@ var (
)
func main() {
flag.Parse()
// flag.Parse()
refs, err := extensionToBoilerplate(*boilerplatedir)
if err != nil {
log.Fatal(err)
......
......@@ -67,7 +67,7 @@ if ! [[ ${VERSION_BUILD} =~ ^[0-9]+$ ]]; then
fi
#echo "Updating Docker images ..."
#make push-gvisor-addon-image push-storage-provisioner-image
#make push-gvisor-addon-image push-storage-provisioner-manifest
echo "Updating latest bucket for ${VERSION} release ..."
gsutil cp -r "gs://${BUCKET}/releases/${TAGNAME}/*" "gs://${BUCKET}/releases/latest/"
......@@ -34,7 +34,7 @@ import (
func main() {
// init glog: by default, all log statements write to files in a temporary directory, also
// flag.Parse must be called before any logging is done
flag.Parse()
// flag.Parse()
_ = flag.Set("logtostderr", "true")
// fetch respective current stable (vDefault as DefaultKubernetesVersion) and
......
......@@ -46,7 +46,7 @@ var (
func init() {
flag.StringVar(&k8sVersion, "kubernetes-version", "", "desired Kubernetes version, for example `v1.17.2`")
flag.Parse()
// flag.Parse()
if k8sVersion != "" {
k8sVersions = append(k8sVersions, k8sVersion)
}
......
......@@ -78,7 +78,7 @@ func (d *Driver) Create() error {
CPUs: strconv.Itoa(d.NodeConfig.CPU),
Memory: strconv.Itoa(d.NodeConfig.Memory) + "mb",
Envs: d.NodeConfig.Envs,
ExtraArgs: []string{"--expose", fmt.Sprintf("%d", d.NodeConfig.APIServerPort)},
ExtraArgs: append([]string{"--expose", fmt.Sprintf("%d", d.NodeConfig.APIServerPort)}, d.NodeConfig.ExtraArgs...),
OCIBinary: d.NodeConfig.OCIBinary,
APIServerPort: d.NodeConfig.APIServerPort,
}
......@@ -137,6 +137,7 @@ func (d *Driver) Create() error {
var waitForPreload sync.WaitGroup
waitForPreload.Add(1)
var pErr error
go func() {
defer waitForPreload.Done()
// If preload doesn't exist, don't bother extracting tarball to volume
......@@ -147,11 +148,18 @@ func (d *Driver) Create() error {
klog.Infof("Starting extracting preloaded images to volume ...")
// Extract preloaded images to container
if err := oci.ExtractTarballToVolume(d.NodeConfig.OCIBinary, download.TarballPath(d.NodeConfig.KubernetesVersion, d.NodeConfig.ContainerRuntime), params.Name, d.NodeConfig.ImageDigest); err != nil {
if strings.Contains(err.Error(), "No space left on device") {
pErr = oci.ErrInsufficientDockerStorage
return
}
klog.Infof("Unable to extract preloaded tarball to volume: %v", err)
} else {
klog.Infof("duration metric: took %f seconds to extract preloaded images to volume", time.Since(t).Seconds())
}
}()
if pErr == oci.ErrInsufficientDockerStorage {
return pErr
}
if err := oci.CreateContainerNode(params); err != nil {
return errors.Wrap(err, "create kic node")
......
......@@ -48,6 +48,9 @@ var ErrExitedUnexpectedly = errors.New("container exited unexpectedly")
// ErrDaemonInfo is thrown when docker/podman info is failing or not responding
var ErrDaemonInfo = errors.New("daemon info not responding")
// ErrInsufficientDockerStorage is thrown when there is not more storage for docker
var ErrInsufficientDockerStorage = &FailFastError{errors.New("insufficient docker storage, no space left on device")}
// ErrNetworkSubnetTaken is thrown when a subnet is taken by another network
var ErrNetworkSubnetTaken = errors.New("subnet is taken")
......
......@@ -61,4 +61,5 @@ type Config struct {
Envs map[string]string // key,value of environment variables passed to the node
KubernetesVersion string // Kubernetes version to install
ContainerRuntime string // container runtime kic is running
ExtraArgs []string // a list of any extra option to pass to oci binary during creation time, for example --expose 8080...
}
......@@ -90,8 +90,8 @@ func ProfileNameValid(name string) bool {
const RestrictedNamePattern = `(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])`
var validName = regexp.MustCompile(`^` + RestrictedNamePattern + `$`)
return validName.MatchString(name)
// length needs to be more than 1 character because docker volume #9366
return validName.MatchString(name) && len(name) > 1
}
// ProfileNameInReservedKeywords checks if the profile is an internal keywords
......
......@@ -80,10 +80,11 @@ func TestProfileNameValid(t *testing.T) {
"pro-file1": true,
"1st-profile": true,
"1st-2nd-3rd-profile": true,
"n": true,
"1": true,
"12567": true,
"111": true,
"1": false,
"n": false,
"pro file": false,
"pro-file-": false,
"-profile": false,
......
......@@ -71,6 +71,7 @@ type ClusterConfig struct {
Addons map[string]bool
VerifyComponents map[string]bool // map of components to verify and wait for after start.
StartHostTimeout time.Duration
ExposedPorts []string // Only used by the docker and podman driver
}
// KubernetesConfig contains the parameters used to configure the VM Kubernetes.
......
......@@ -413,6 +413,7 @@ func containerdImagesPreloaded(runner command.Runner, images []string) bool {
return true
}
// ImagesPreloaded returns true if all images have been preloaded
func (r *Containerd) ImagesPreloaded(images []string) bool {
return containerdImagesPreloaded(r.Runner, images)
}
......@@ -326,6 +326,7 @@ func crioImagesPreloaded(runner command.Runner, images []string) bool {
return true
}
// ImagesPreloaded returns true if all images have been preloaded
func (r *CRIO) ImagesPreloaded(images []string) bool {
return crioImagesPreloaded(r.Runner, images)
}
......
......@@ -405,6 +405,7 @@ func dockerBoundToContainerd(runner command.Runner) bool {
return false
}
// ImagesPreloaded returns true if all images have been preloaded
func (r *Docker) ImagesPreloaded(images []string) bool {
return dockerImagesPreloaded(r.Runner, images)
}
......@@ -26,6 +26,7 @@ import (
"k8s.io/minikube/pkg/minikube/out/register"
)
// DefaultJSONOutput is a progress tracker with JSON output
var DefaultJSONOutput getter.ProgressTracker = &jsonOutput{}
type jsonOutput struct {
......
......@@ -112,7 +112,7 @@ func IsDocker(name string) bool {
return name == Docker
}
// IsKIC checks if the driver is a Docker for Desktop (Docker on windows or MacOs)
// IsDockerDesktop checks if the driver is a Docker for Desktop (Docker on windows or MacOs)
// for linux and exotic archs, this will be false
func IsDockerDesktop(name string) bool {
if IsDocker(name) {
......
......@@ -211,7 +211,7 @@ func TestMachineName(t *testing.T) {
{
ClusterConfig: config.ClusterConfig{Name: "minikube",
Nodes: []config.Node{
config.Node{
{
Name: "",
IP: "172.17.0.3",
Port: 8443,
......@@ -227,7 +227,7 @@ func TestMachineName(t *testing.T) {
{
ClusterConfig: config.ClusterConfig{Name: "p2",
Nodes: []config.Node{
config.Node{
{
Name: "",
IP: "172.17.0.3",
Port: 8443,
......@@ -235,7 +235,7 @@ func TestMachineName(t *testing.T) {
ControlPlane: true,
Worker: true,
},
config.Node{
{
Name: "m2",
IP: "172.17.0.4",
Port: 0,
......@@ -313,7 +313,7 @@ func TestIndexFromMachineNameClusterConfig(t *testing.T) {
{
ClusterConfig: config.ClusterConfig{Name: "minikube",
Nodes: []config.Node{
config.Node{
{
Name: "",
IP: "172.17.0.3",
Port: 8443,
......@@ -329,7 +329,7 @@ func TestIndexFromMachineNameClusterConfig(t *testing.T) {
{
ClusterConfig: config.ClusterConfig{Name: "p2",
Nodes: []config.Node{
config.Node{
{
Name: "",
IP: "172.17.0.3",
Port: 8443,
......@@ -337,7 +337,7 @@ func TestIndexFromMachineNameClusterConfig(t *testing.T) {
ControlPlane: true,
Worker: true,
},
config.Node{
{
Name: "m2",
IP: "172.17.0.4",
Port: 0,
......
......@@ -383,7 +383,7 @@ func startHost(api libmachine.API, cc *config.ClusterConfig, n *config.Node, del
}
}
if _, ff := err.(*oci.FailFastError); ff {
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
}
......
......@@ -34,7 +34,9 @@ const (
var (
outputFile io.Writer = os.Stdout
GetUUID = randomID
//GetUUID returns the UUID function to use
GetUUID = randomID
eventFile *os.File
)
......
......@@ -110,6 +110,7 @@ type Info struct {
data map[string]string
}
// Type returns the cloud events compatible type of this struct
func (s *Info) Type() string {
return "io.k8s.sigs.minikube.info"
}
......@@ -128,6 +129,7 @@ type Error struct {
data map[string]string
}
// NewError returns a new Error type
func NewError(err string) *Error {
return &Error{
map[string]string{
......@@ -148,6 +150,7 @@ func NewErrorExitCode(err string, exitcode int, additionalData ...map[string]str
return e
}
// Type returns the cloud events compatible type of this struct
func (s *Error) Type() string {
return "io.k8s.sigs.minikube.error"
}
......@@ -34,6 +34,7 @@ package reason
const (
// Reserved UNIX exit codes
ExFailure = 1 // Failure represents a general failure code
ExInterrupted = 2 // Ctrl-C (SIGINT)
......@@ -56,6 +57,7 @@ const (
// navailableOff = 9 // (~EX_UNAVAILABLE)
// Error codes specific to the minikube program
ExProgramError = 10 // generic error
ExProgramUsage = 14 // bad command-line options
ExProgramConflict = 11 // can't do what you want because of existing data
......@@ -64,6 +66,7 @@ const (
ExProgramConfig = 18 // bad configuration specified
// Error codes specific to resource limits (exit code layout follows no rules)
ExResourceError = 20
ExInsufficientMemory = 23
ExInsufficientStorage = 26
......@@ -71,6 +74,7 @@ const (
ExInsufficientCores = 29
// Error codes specific to the host
ExHostError = 30
ExHostConflict = 31
ExHostTimeout = 32
......@@ -81,6 +85,7 @@ const (
ExHostConfig = 38
// Error codes specific to remote networking
ExInternetError = 40
ExInternetConflict = 41
ExInternetTimeout = 42
......@@ -89,6 +94,7 @@ const (
ExInternetUnavailable = 49
// Error codes specific to the libmachine driver
ExDriverError = 50
ExDriverConflict = 51
ExDriverTimeout = 52
......@@ -100,11 +106,14 @@ const (
ExDriverUnavailable = 59
// Error codes specific to the driver provider
ExProviderError = 60
ExProviderConflict = 61
ExProviderTimeout = 62
ExProviderNotRunning = 63
// Reserve 64 for the moment as it used to be usage
ExProviderNotFound = 65
ExProviderUnsupported = 66
ExProviderPermission = 67
......@@ -112,6 +121,7 @@ const (
ExProviderUnavailable = 69 // In common use
// Error codes specific to local networking
ExLocalNetworkError = 70
ExLocalNetworkConflict = 71
ExLocalNetworkTimeout = 72
......@@ -121,6 +131,7 @@ const (
ExLocalNetworkUnavailable = 79
// Error codes specific to the guest host
ExGuestError = 80
ExGuestConflict = 81
ExGuestTimeout = 82
......@@ -132,12 +143,14 @@ const (
ExGuestUnavailable = 89
// Error codes specific to the container runtime
ExRuntimeError = 90
ExRuntimeNotRunning = 93
ExRuntimeNotFound = 95
ExRuntimeUnavailable = 99
// Error codes specific to the Kubernetes control plane
ExControlPlaneError = 100
ExControlPlaneConflict = 101
ExControlPlaneTimeout = 102
......@@ -148,6 +161,7 @@ const (
ExControlPlaneUnavailable = 109
// Error codes specific to a Kubernetes service
ExSvcError = 110
ExSvcConflict = 111
ExSvcTimeout = 112
......
......@@ -61,6 +61,7 @@ type Kind struct {
NoMatch bool
}
// IssueURLs returns URLs for issues
func (k *Kind) IssueURLs() []string {
is := []string{}
for _, i := range k.Issues {
......
......@@ -60,6 +60,12 @@ func configure(cc config.ClusterConfig, n config.Node) (interface{}, error) {
}
}
extraArgs := []string{}
for _, port := range cc.ExposedPorts {
extraArgs = append(extraArgs, "-p", port)
}
return kic.NewDriver(kic.Config{
ClusterName: cc.Name,
MachineName: driver.MachineName(cc, n),
......@@ -72,6 +78,7 @@ func configure(cc config.ClusterConfig, n config.Node) (interface{}, error) {
APIServerPort: cc.Nodes[0].Port,
KubernetesVersion: cc.KubernetesConfig.KubernetesVersion,
ContainerRuntime: cc.KubernetesConfig.ContainerRuntime,
ExtraArgs: extraArgs,
}), nil
}
......
......@@ -72,6 +72,12 @@ func configure(cc config.ClusterConfig, n config.Node) (interface{}, error) {
}
}
extraArgs := []string{}
for _, port := range cc.ExposedPorts {
extraArgs = append(extraArgs, "-p", port)
}
return kic.NewDriver(kic.Config{
ClusterName: cc.Name,
MachineName: driver.MachineName(cc, n),
......@@ -84,6 +90,7 @@ func configure(cc config.ClusterConfig, n config.Node) (interface{}, error) {
APIServerPort: cc.Nodes[0].Port,
KubernetesVersion: cc.KubernetesConfig.KubernetesVersion,
ContainerRuntime: cc.KubernetesConfig.ContainerRuntime,
ExtraArgs: extraArgs,
}), nil
}
......
......@@ -45,6 +45,7 @@ func MakeTempDir() string {
return localpath.MiniPath()
}
// RemoveTempDir removes the temp dir
func RemoveTempDir(tempdir string) {
if filepath.Base(tempdir) == ".minikube" {
tempdir = filepath.Dir(tempdir)
......
......@@ -17,9 +17,18 @@ limitations under the License.
package monitor
const (
// GithubAccessTokenEnvVar is the env var name to use
GithubAccessTokenEnvVar = "GITHUB_ACCESS_TOKEN"
OkToTestLabel = "ok-to-test"
GithubOwner = "kubernetes"
GithubRepo = "minikube"
BotName = "minikube-pr-bot"
// OkToTestLabel is the github label for ok-to-test
OkToTestLabel = "ok-to-test"
// GithubOwner is the owner of the github repository
GithubOwner = "kubernetes"
// GithubRepo is the name of the github repository
GithubRepo = "minikube"
// BotName is the name of the minikube Pull Request bot
BotName = "minikube-pr-bot"
)
......@@ -47,14 +47,17 @@ func CalculateSizeInMB(humanReadableSize string) (int, error) {
return int(size / units.MiB), nil
}
// ConvertMBToBytes converts MB to bytes
func ConvertMBToBytes(mbSize int) int64 {
return int64(mbSize) * units.MiB
}
// ConvertBytesToMB converts bytes to MB
func ConvertBytesToMB(byteSize int64) int {
return int(ConvertUnsignedBytesToMB(uint64(byteSize)))
}
// ConvertUnsignedBytesToMB converts bytes to MB
func ConvertUnsignedBytesToMB(byteSize uint64) int64 {
return int64(byteSize / units.MiB)
}
......
......@@ -83,6 +83,7 @@ minikube start [flags]
--no-vtx-check Disable checking for the availability of hardware virtualization before the vm is started (virtualbox driver only)
-n, --nodes int The number of nodes to spin up. Defaults to 1. (default 1)
-o, --output string Format to print stdout in. Options include: [text,json] (default "text")
--ports strings List of ports that should be exposed (docker and podman driver only)
--preload If set, download tarball of preloaded images if available to improve start time. Defaults to true. (default true)
--registry-mirror strings Registry mirrors to pass to the Docker daemon
--service-cluster-ip-range string The CIDR to be used for service cluster IPs. (default "10.96.0.0/12")
......
......@@ -11,8 +11,7 @@ Stops a running local Kubernetes cluster
### Synopsis
Stops a local Kubernetes cluster running in Virtualbox. This command stops the VM
itself, leaving all files intact. The cluster can be started again with the "start" command.
Stops a local Kubernetes cluster. This command stops the underlying VM or container, but keeps user data intact. The cluster can be started again with the "start" command.
```
minikube stop [flags]
......
......@@ -23,6 +23,10 @@ Add your manifest YAML's to the directory you have created:
`cp *.yaml deploy/addons/<addon name>`
Note: If the addon never needs authentication to GCP, then consider adding the following label to the pod's yaml:
`gcp-auth-skip-secret: "true"`
To make the addon appear in `minikube addons list`, add it to `pkg/addons/config.go`. Here is the entry used by the `registry` addon, which will work for any addon which does not require custom code:
```go
......
......@@ -41,7 +41,7 @@ The list of outstanding items are at http://tinyurl.com/mk-tparty/daily-triage -
The most important level of categorizing the issue is defining what type it is.
We typically want at least one of the following labels on every issue, and some issues may fall into multiple categories:
- `triage/support` - The default for most incoming issues
- `kind/support` - The default for most incoming issues
- `kind/bug` - When it’s a bug or we aren’t delivering the best user experience
Other possibilities:
......@@ -104,7 +104,7 @@ Suspected **Root cause**:
## Prioritization
If the issue is not `triage/support`, it needs a [priority label](https://github.com/kubernetes/community/blob/master/contributors/guide/issue-triage.md#define-priority):
If the issue is not `kind/support`, it needs a [priority label](https://github.com/kubernetes/community/blob/master/contributors/guide/issue-triage.md#define-priority):
`priority/critical-urgent` - someones top priority ASAP, such as security issue, user-visible bug, or build breakage. Rarely used.
......
......@@ -39,7 +39,7 @@ Also see [co/kvm2 open issues](https://github.com/kubernetes/minikube/labels/co%
### Nested Virtulization
If you are running KVM in a nested virtualization environment ensure your config the kernel modules correctly follow either [this](https://stafwag.github.io/blog/blog/2018/06/04/nested-virtualization-in-kvm/) or [this](VM follow to config the kernel modules. also https://computingforgeeks.com/how-to-install-kvm-virtualization-on-debian/) tutorial.
If you are running KVM in a nested virtualization environment ensure your config the kernel modules correctly follow either [this](https://stafwag.github.io/blog/blog/2018/06/04/nested-virtualization-in-kvm/) or [this](https://computingforgeeks.com/how-to-install-kvm-virtualization-on-debian/) tutorial.
## Troubleshooting
* Run `virt-host-validate` and check for the suggestions.
......
......@@ -52,7 +52,7 @@ const (
// TestMain is the test main
func TestMain(m *testing.M) {
flag.Parse()
// flag.Parse()
setMaxParallelism()
start := time.Now()
......
......@@ -52,7 +52,7 @@ func TestInsufficientStorage(t *testing.T) {
}
// make sure 'minikube status' has correct output
stdout := runStatusCmd(ctx, t, profile)
stdout := runStatusCmd(ctx, t, profile, true)
verifyClusterState(t, stdout)
// try deleting events.json and make sure this still works
......@@ -60,16 +60,18 @@ func TestInsufficientStorage(t *testing.T) {
if err := os.Remove(eventsFile); err != nil {
t.Fatalf("removing %s", eventsFile)
}
stdout = runStatusCmd(ctx, t, profile)
stdout = runStatusCmd(ctx, t, profile, true)
verifyClusterState(t, stdout)
}
// runStatusCmd runs the status command and returns stdout
func runStatusCmd(ctx context.Context, t *testing.T, profile string) []byte {
func runStatusCmd(ctx context.Context, t *testing.T, profile string, increaseEnv bool) []byte {
// make sure minikube status shows insufficient storage
c := exec.CommandContext(ctx, Target(), "status", "-p", profile, "--output=json", "--layout=cluster")
// artificially set /var to 100% capacity
c.Env = append(os.Environ(), fmt.Sprintf("%s=100", constants.TestDiskUsedEnv))
if increaseEnv {
c.Env = append(os.Environ(), fmt.Sprintf("%s=100", constants.TestDiskUsedEnv))
}
rr, err := Run(t, c)
// status exits non-0 if status isn't Running
if err == nil {
......@@ -96,3 +98,41 @@ func verifyClusterState(t *testing.T, contents []byte) {
}
}
}
func TestPauseStatus(t *testing.T) {
// run start
profile := UniqueProfileName("pause-status")
ctx, cancel := context.WithTimeout(context.Background(), Minutes(5))
defer Cleanup(t, profile, cancel)
startArgs := []string{"start", "-p", profile, "--output=json", "--wait=true"}
startArgs = append(startArgs, StartArgs()...)
c := exec.CommandContext(ctx, Target(), startArgs...)
rr, err := Run(t, c)
if err != nil {
t.Fatalf("minikube start failed %v\n%v", rr.Command(), err)
}
// run pause
pauseArgs := []string{"pause", "-p", profile}
c = exec.CommandContext(ctx, Target(), pauseArgs...)
rr, err = Run(t, c)
if err != nil {
t.Fatalf("minikube pause failed %v\n%v", rr.Command(), err)
}
// run status
statusOutput := runStatusCmd(context.Background(), t, profile, false)
var cs cmd.ClusterState
if err := json.Unmarshal(statusOutput, &cs); err != nil {
t.Fatalf("unmarshalling: %v", err)
}
// verify the status looks as we expect
if cs.StatusCode != cmd.Paused {
t.Fatalf("incorrect status code: %v", cs.StatusCode)
}
if cs.StatusName != "Paused" {
t.Fatalf("incorrect status name: %v", cs.StatusName)
}
}
......@@ -123,7 +123,7 @@
"Docker is nearly out of disk space, which may cause deployments to fail! ({{.p}}% of capacity)": "",
"Docker is out of disk space! (/var is at {{.p}}% of capacity)": "",
"Docs have been saved at - {{.path}}": "Dokumentacja została zapisana w {{.path}}",
"Documentation: {{.url}}": "Dokumentacja",
"Documentation: {{.url}}": "Dokumentacja: {{.url}}",
"Done! kubectl is now configured to use \"{{.name}}": "Gotowe! kubectl jest skonfigurowany do użycia z \"{{.name}}\".",
"Done! kubectl is now configured to use \"{{.name}}\"": "Gotowe! kubectl jest skonfigurowany do użycia z \"{{.name}}\".",
"Done! kubectl is now configured to use \"{{.name}}\" by default": "",
......@@ -330,7 +330,7 @@
"Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "",
"Number of CPUs allocated to Kubernetes.": "",
"Number of CPUs allocated to the minikube VM": "Liczba procesorów przypisana do maszyny wirtualnej minikube",
"Number of CPUs allocated to the minikube VM.": "Liczba procesorów przypisana do maszyny wirtualnej minikube",
"Number of CPUs allocated to the minikube VM.": "Liczba procesorów przypisana do maszyny wirtualnej minikube.",
"Number of lines back to go within the log": "",
"OS release is {{.pretty_name}}": "",
"One of 'yaml' or 'json'.": "",
......@@ -372,9 +372,9 @@
"Print current and latest version number": "Wyświetl aktualną i najnowszą wersję",
"Print just the version number.": "",
"Print the version of minikube": "Wyświetl wersję minikube",
"Print the version of minikube.": "Wyświetl wersję minikube",
"Print the version of minikube.": "Wyświetl wersję minikube.",
"Problems detected in {{.entry}}:": "Wykryto problem w {{.name}}",
"Problems detected in {{.name}}:": "Wykryto problem w {{.name}}",
"Problems detected in {{.name}}:": "Wykryto problem w {{.name}}:",
"Profile gets or sets the current minikube profile": "Pobiera lub ustawia aktywny profil minikube",
"Profile name \"{{.profilename}}\" is reserved keyword. To delete this profile, run: \"{{.cmd}}\"": "",
"Profile name '{{.name}}' is not valid": "",
......@@ -486,7 +486,7 @@
"The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo -E minikube start --driver={{.driver_name}}'.": "",
"The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo minikube --vm-driver={{.driver_name}}'.": "Sterownik \"{{.driver_name}}\" wymaga uprawnień root'a. Użyj 'sudo minikube --vm-driver={{.driver_name}}'",
"The \"{{.driver_name}}\" driver should not be used with root privileges.": "",
"The \"{{.name}}\" cluster has been deleted.": "Klaster \"{{.name}}\" został usunięty",
"The \"{{.name}}\" cluster has been deleted.": "Klaster \"{{.name}}\" został usunięty.",
"The 'none' driver is designed for experts who need to integrate with an existing VM": "",
"The '{{.addonName}}' addon is enabled": "",
"The '{{.driver}}' driver requires elevated permissions. The following commands will be executed:\\n\\n{{ .example }}\\n": "",
......@@ -799,4 +799,4 @@
"{{.prefix}}minikube {{.version}} on {{.platform}}": "{{.prefix}}minikube {{.version}} na {{.platform}}",
"{{.type}} is not yet a supported filesystem. We will try anyways!": "{{.type}} nie jest wspierany przez system plików. I tak spróbujemy!",
"{{.url}} is not accessible: {{.error}}": ""
}
\ No newline at end of file
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册