Merge branch 'master' of github.com:kubernetes/minikube into mitm
commit
8504abea89
|
@ -3,7 +3,9 @@ on:
|
|||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
env:
|
||||
GOPROXY: https://proxy.golang.org
|
||||
GO_VERSION: 1.16.4
|
||||
jobs:
|
||||
generate-docs:
|
||||
runs-on: ubuntu-18.04
|
||||
|
@ -11,8 +13,24 @@ jobs:
|
|||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: 1.16.4
|
||||
go-version: ${{env.GO_VERSION}}
|
||||
stable: true
|
||||
- name: gendocs
|
||||
- name: Generate Docs
|
||||
id: gendocs
|
||||
run: |
|
||||
./hack/generate_docs.sh ${{ secrets.MINIKUBE_BOT_PAT }}
|
||||
make generate-docs
|
||||
echo "::set-output name=changes::$(git status --porcelain)"
|
||||
- name: Create PR
|
||||
if: ${{ steps.gendocs.outputs.changes != '' }}
|
||||
uses: peter-evans/create-pull-request@v3
|
||||
with:
|
||||
token: ${{ secrets.MINIKUBE_BOT_PAT }}
|
||||
commit-message: Update auto-generated docs and translations
|
||||
committer: minikube-bot <minikube-bot@google.com>
|
||||
author: minikube-bot <minikube-bot@google.com>
|
||||
branch: gendocs
|
||||
push-to-fork: minikube-bot/minikube
|
||||
base: master
|
||||
delete-branch: true
|
||||
title: 'Update auto-generated docs and translations'
|
||||
body: 'Committing changes resulting from `make generate-docs`\n\nAutogenerated by the generate-docs github action workflow.\n\n${{ steps.gendocs.outputs.changes }}'
|
||||
|
|
|
@ -2,16 +2,19 @@ name: "time-to-k8s benchmark"
|
|||
on:
|
||||
release:
|
||||
types: [released]
|
||||
env:
|
||||
GOPROXY: https://proxy.golang.org
|
||||
GO_VERSION: 1.16.4
|
||||
jobs:
|
||||
benchmark:
|
||||
runs-on: ubuntu-18.04
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout submodules
|
||||
run: git submodule update --init
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: 1.16.4
|
||||
go-version: ${{env.GO_VERSION}}
|
||||
stable: true
|
||||
- name: Benchmark
|
||||
run: |
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
name: Translations Validation
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- "translations/**"
|
||||
env:
|
||||
GOPROXY: https://proxy.golang.org
|
||||
GO_VERSION: 1.16.4
|
||||
jobs:
|
||||
unit_test:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: ${{env.GO_VERSION}}
|
||||
stable: true
|
||||
- name: Install libvirt
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libvirt-dev
|
||||
- name: Download Dependencies
|
||||
run: go mod download
|
||||
- name: Unit Test
|
||||
env:
|
||||
TESTSUITE: unittest
|
||||
run: make test
|
||||
continue-on-error: false
|
64
CHANGELOG.md
64
CHANGELOG.md
|
@ -1,5 +1,69 @@
|
|||
# Release Notes
|
||||
|
||||
## Version 1.22.0-beta.0 - 2021-06-28
|
||||
|
||||
Features:
|
||||
|
||||
* auto-pause addon: add support for arm64 [#11743](https://github.com/kubernetes/minikube/pull/11743)
|
||||
* `addon list`: add info on each addon's maintainer [#11753](https://github.com/kubernetes/minikube/pull/11753)
|
||||
* add ability to pass max to `--cpu` and `--memory` flags [#11692](https://github.com/kubernetes/minikube/pull/11692)
|
||||
|
||||
Bugs:
|
||||
|
||||
* Fix `--base-image` caching for images specified by name:tag [#11603](https://github.com/kubernetes/minikube/pull/11603)
|
||||
* Fix embed-certs global config [#11576](https://github.com/kubernetes/minikube/pull/11576)
|
||||
* Fix a download link to use arm64 instead of amd64 [#11653](https://github.com/kubernetes/minikube/pull/11653)
|
||||
* fix downloading duplicate base image [#11690](https://github.com/kubernetes/minikube/pull/11690)
|
||||
* fix multi-node loosing track of nodes after second restart [#11731](https://github.com/kubernetes/minikube/pull/11731)
|
||||
* gcp-auth: do not override existing environment variables in pods [#11665](https://github.com/kubernetes/minikube/pull/11665)
|
||||
|
||||
Minor improvements:
|
||||
|
||||
* Allow running amd64 binary on M1 [#11674](https://github.com/kubernetes/minikube/pull/11674)
|
||||
* improve containerd experience on cgroup v2 [#11632](https://github.com/kubernetes/minikube/pull/11632)
|
||||
* Improve French locale [#11728](https://github.com/kubernetes/minikube/pull/11728)
|
||||
* Fix UI error for stoppping systemd service [#11667](https://github.com/kubernetes/minikube/pull/11667)
|
||||
* international languages: allow using LC_ALL env to set local language for windows [#11721](https://github.com/kubernetes/minikube/pull/11721)
|
||||
* Change registery_mirror to registery-mirror [#11678](https://github.com/kubernetes/minikube/pull/11678)
|
||||
|
||||
Version Upgrades:
|
||||
|
||||
* ISO: Upgrade podman to 3.1.2 [#11704](https://github.com/kubernetes/minikube/pull/11704)
|
||||
* Upgrade Buildroot to 2021.02 LTS with Linux 4.19 [#11688](https://github.com/kubernetes/minikube/pull/11688)
|
||||
|
||||
For a more detailed changelog, including changes occuring in pre-release versions, see [CHANGELOG.md](https://github.com/kubernetes/minikube/blob/master/CHANGELOG.md).
|
||||
|
||||
Thank you to our contributors for this release!
|
||||
|
||||
- Anders F Björklund
|
||||
- Andriy Dzikh
|
||||
- Daehyeok Mun
|
||||
- Dongjoon Hyun
|
||||
- Felipe Crescencio de Oliveira
|
||||
- Ilya Zuyev
|
||||
- JacekDuszenko
|
||||
- Jeff MAURY
|
||||
- Medya Ghazizadeh
|
||||
- Peixuan Ding
|
||||
- RA489
|
||||
- Sharif Elgamal
|
||||
- Steven Powell
|
||||
- Vishal Jain
|
||||
- zhangdb-git
|
||||
|
||||
Thank you to our PR reviewers for this release!
|
||||
|
||||
- medyagh (63 comments)
|
||||
- sharifelgamal (9 comments)
|
||||
- ilya-zuyev (6 comments)
|
||||
- andriyDev (3 comments)
|
||||
- spowelljr (3 comments)
|
||||
- afbjorklund (1 comments)
|
||||
- prezha (1 comments)
|
||||
- tharun208 (1 comments)
|
||||
|
||||
Thank you to our triage members for this release!
|
||||
|
||||
## Version 1.21.0 - 2021-06-10
|
||||
* add more polish translations [#11587](https://github.com/kubernetes/minikube/pull/11587)
|
||||
* Modify MetricsServer to use v1 api version (instead of v1beta1). [#11584](https://github.com/kubernetes/minikube/pull/11584)
|
||||
|
|
17
Makefile
17
Makefile
|
@ -14,8 +14,8 @@
|
|||
|
||||
# Bump these on release - and please check ISO_VERSION for correctness.
|
||||
VERSION_MAJOR ?= 1
|
||||
VERSION_MINOR ?= 21
|
||||
VERSION_BUILD ?= 0
|
||||
VERSION_MINOR ?= 22
|
||||
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 ?= v1.21.0
|
||||
ISO_VERSION ?= v1.22.0-beta.0
|
||||
# Dashes are valid in semver, but not Linux packaging. Use ~ to delimit alpha/beta
|
||||
DEB_VERSION ?= $(subst -,~,$(RAW_VERSION))
|
||||
DEB_REVISION ?= 0
|
||||
|
@ -680,8 +680,8 @@ KICBASE_IMAGE_HUB ?= kicbase/stable:$(KIC_VERSION)
|
|||
KICBASE_IMAGE_REGISTRIES ?= $(KICBASE_IMAGE_GCR) $(KICBASE_IMAGE_HUB)
|
||||
|
||||
.PHONY: local-kicbase
|
||||
local-kicbase: deploy/kicbase/auto-pause ## Builds the kicbase image and tags it local/kicbase:latest and local/kicbase:$(KIC_VERSION)-$(COMMIT_SHORT)
|
||||
docker build -f ./deploy/kicbase/Dockerfile -t local/kicbase:$(KIC_VERSION) --build-arg COMMIT_SHA=${VERSION}-$(COMMIT) --cache-from $(KICBASE_IMAGE_GCR) ./deploy/kicbase
|
||||
local-kicbase: ## Builds the kicbase image and tags it local/kicbase:latest and local/kicbase:$(KIC_VERSION)-$(COMMIT_SHORT)
|
||||
docker build -f ./deploy/kicbase/Dockerfile -t local/kicbase:$(KIC_VERSION) --build-arg COMMIT_SHA=${VERSION}-$(COMMIT) --cache-from $(KICBASE_IMAGE_GCR) .
|
||||
docker tag local/kicbase:$(KIC_VERSION) local/kicbase:latest
|
||||
docker tag local/kicbase:$(KIC_VERSION) local/kicbase:$(KIC_VERSION)-$(COMMIT_SHORT)
|
||||
|
||||
|
@ -695,7 +695,7 @@ local-kicbase-debug: local-kicbase ## Builds a local kicbase image and switches
|
|||
$(SED) 's|Version = .*|Version = \"$(KIC_VERSION)-$(COMMIT_SHORT)\"|;s|baseImageSHA = .*|baseImageSHA = \"\"|;s|gcrRepo = .*|gcrRepo = \"local/kicbase\"|;s|dockerhubRepo = .*|dockerhubRepo = \"local/kicbase\"|' pkg/drivers/kic/types.go
|
||||
|
||||
.PHONY: push-kic-base-image
|
||||
push-kic-base-image: deploy/kicbase/auto-pause docker-multi-arch-builder ## Push multi-arch local/kicbase:latest to all remote registries
|
||||
push-kic-base-image: docker-multi-arch-builder ## Push multi-arch local/kicbase:latest to all remote registries
|
||||
ifdef AUTOPUSH
|
||||
docker login gcr.io/k8s-minikube
|
||||
docker login docker.pkg.github.com
|
||||
|
@ -706,7 +706,7 @@ endif
|
|||
ifndef CIBUILD
|
||||
$(call user_confirm, 'Are you sure you want to push $(KICBASE_IMAGE_REGISTRIES) ?')
|
||||
endif
|
||||
env $(X_BUILD_ENV) docker buildx build --builder $(X_DOCKER_BUILDER) --platform $(KICBASE_ARCH) $(addprefix -t ,$(KICBASE_IMAGE_REGISTRIES)) --push --build-arg COMMIT_SHA=${VERSION}-$(COMMIT) ./deploy/kicbase
|
||||
env $(X_BUILD_ENV) docker buildx build -f ./deploy/kicbase/Dockerfile --builder $(X_DOCKER_BUILDER) --platform $(KICBASE_ARCH) $(addprefix -t ,$(KICBASE_IMAGE_REGISTRIES)) --push --build-arg COMMIT_SHA=${VERSION}-$(COMMIT) .
|
||||
|
||||
out/preload-tool:
|
||||
go build -ldflags="$(MINIKUBE_LDFLAGS)" -o $@ ./hack/preload-images/*.go
|
||||
|
@ -869,9 +869,6 @@ site: site/themes/docsy/assets/vendor/bootstrap/package.js out/hugo/hugo ## Serv
|
|||
out/mkcmp:
|
||||
GOOS=$(GOOS) GOARCH=$(GOARCH) go build -o $@ cmd/performance/mkcmp/main.go
|
||||
|
||||
.PHONY: deploy/kicbase/auto-pause # auto pause binary to be used for kic image work around for not passing the whole repo as docker context
|
||||
deploy/kicbase/auto-pause: $(SOURCE_FILES) $(ASSET_FILES)
|
||||
GOOS=linux GOARCH=$(GOARCH) go build -o $@ cmd/auto-pause/auto-pause.go
|
||||
|
||||
# auto pause binary to be used for ISO
|
||||
deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/usr/bin/auto-pause: $(SOURCE_FILES) $(ASSET_FILES)
|
||||
|
|
|
@ -98,7 +98,7 @@ var printAddonsList = func(cc *config.ClusterConfig) {
|
|||
|
||||
var tData [][]string
|
||||
table := tablewriter.NewWriter(os.Stdout)
|
||||
table.SetHeader([]string{"Addon Name", "Profile", "Status"})
|
||||
table.SetHeader([]string{"Addon Name", "Profile", "Status", "Maintainer"})
|
||||
table.SetAutoFormatHeaders(true)
|
||||
table.SetBorders(tablewriter.Border{Left: true, Top: true, Right: true, Bottom: true})
|
||||
table.SetCenterSeparator("|")
|
||||
|
@ -106,7 +106,11 @@ var printAddonsList = func(cc *config.ClusterConfig) {
|
|||
for _, addonName := range addonNames {
|
||||
addonBundle := assets.Addons[addonName]
|
||||
enabled := addonBundle.IsEnabled(cc)
|
||||
tData = append(tData, []string{addonName, cc.Name, fmt.Sprintf("%s %s", stringFromStatus(enabled), iconFromStatus(enabled))})
|
||||
maintainer := addonBundle.Maintainer
|
||||
if maintainer == "" {
|
||||
maintainer = "unknown (third-party)"
|
||||
}
|
||||
tData = append(tData, []string{addonName, cc.Name, fmt.Sprintf("%s %s", stringFromStatus(enabled), iconFromStatus(enabled)), maintainer})
|
||||
}
|
||||
|
||||
table.AppendBulk(tData)
|
||||
|
|
|
@ -76,7 +76,7 @@ var settings = []Setting{
|
|||
{
|
||||
name: "cpus",
|
||||
set: SetInt,
|
||||
validations: []setFn{IsPositive},
|
||||
validations: []setFn{IsValidCPUs},
|
||||
callbacks: []setFn{RequiresRestartMsg},
|
||||
},
|
||||
{
|
||||
|
|
|
@ -25,6 +25,7 @@ import (
|
|||
"strings"
|
||||
|
||||
units "github.com/docker/go-units"
|
||||
"k8s.io/minikube/pkg/minikube/constants"
|
||||
"k8s.io/minikube/pkg/minikube/cruntime"
|
||||
"k8s.io/minikube/pkg/minikube/driver"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
|
@ -53,8 +54,19 @@ func IsValidDiskSize(name string, disksize string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
// IsValidCPUs checks if a string is a valid number of CPUs
|
||||
func IsValidCPUs(name string, cpus string) error {
|
||||
if cpus == constants.MaxResources {
|
||||
return nil
|
||||
}
|
||||
return IsPositive(name, cpus)
|
||||
}
|
||||
|
||||
// IsValidMemory checks if a string is a valid memory size
|
||||
func IsValidMemory(name string, memsize string) error {
|
||||
if memsize == constants.MaxResources {
|
||||
return nil
|
||||
}
|
||||
_, err := units.FromHumanSize(memsize)
|
||||
if err != nil {
|
||||
return fmt.Errorf("invalid memory size: %v", err)
|
||||
|
|
|
@ -25,9 +25,6 @@ import (
|
|||
"strings"
|
||||
"time"
|
||||
|
||||
"k8s.io/minikube/pkg/minikube/notify"
|
||||
"k8s.io/minikube/pkg/version"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/pflag"
|
||||
"github.com/spf13/viper"
|
||||
|
@ -41,9 +38,11 @@ import (
|
|||
"k8s.io/minikube/pkg/minikube/detect"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/localpath"
|
||||
"k8s.io/minikube/pkg/minikube/notify"
|
||||
"k8s.io/minikube/pkg/minikube/out"
|
||||
"k8s.io/minikube/pkg/minikube/reason"
|
||||
"k8s.io/minikube/pkg/minikube/translate"
|
||||
"k8s.io/minikube/pkg/version"
|
||||
)
|
||||
|
||||
var dirs = [...]string{
|
||||
|
@ -96,7 +95,7 @@ func Execute() {
|
|||
}
|
||||
|
||||
if runtime.GOOS == "darwin" && detect.IsAmd64M1Emulation() {
|
||||
exit.Message(reason.WrongBinaryM1, "You are trying to run amd64 binary on M1 system. Please use darwin/arm64 binary instead (Download at {{.url}}.)",
|
||||
out.Infof("You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)",
|
||||
out.V{"url": notify.DownloadURL(version.GetVersion(), "darwin", "arm64")})
|
||||
}
|
||||
|
||||
|
|
|
@ -1030,56 +1030,49 @@ func validateRequestedMemorySize(req int, drvName string) {
|
|||
|
||||
// validateCPUCount validates the cpu count matches the minimum recommended & not exceeding the available cpu count
|
||||
func validateCPUCount(drvName string) {
|
||||
var cpuCount int
|
||||
if driver.BareMetal(drvName) {
|
||||
var availableCPUs int
|
||||
|
||||
// Uses the gopsutil cpu package to count the number of logical cpu cores
|
||||
cpuCount := getCPUCount(drvName)
|
||||
isKIC := driver.IsKIC(drvName)
|
||||
|
||||
if isKIC {
|
||||
si, err := oci.CachedDaemonInfo(drvName)
|
||||
if err != nil {
|
||||
si, err = oci.DaemonInfo(drvName)
|
||||
if err != nil {
|
||||
exit.Message(reason.Usage, "Ensure your {{.driver_name}} is running and is healthy.", out.V{"driver_name": driver.FullName(drvName)})
|
||||
}
|
||||
}
|
||||
availableCPUs = si.CPUs
|
||||
} else {
|
||||
ci, err := cpu.Counts(true)
|
||||
if err != nil {
|
||||
klog.Warningf("Unable to get CPU info: %v", err)
|
||||
} else {
|
||||
cpuCount = ci
|
||||
exit.Message(reason.Usage, "Unable to get CPU info: {{.err}}", out.V{"err": err})
|
||||
}
|
||||
} else {
|
||||
cpuCount = viper.GetInt(cpus)
|
||||
availableCPUs = ci
|
||||
}
|
||||
|
||||
if cpuCount < minimumCPUS {
|
||||
exitIfNotForced(reason.RsrcInsufficientCores, "Requested cpu count {{.requested_cpus}} is less than the minimum allowed of {{.minimum_cpus}}", out.V{"requested_cpus": cpuCount, "minimum_cpus": minimumCPUS})
|
||||
}
|
||||
|
||||
if !driver.IsKIC((drvName)) {
|
||||
return
|
||||
}
|
||||
|
||||
si, err := oci.CachedDaemonInfo(drvName)
|
||||
if err != nil {
|
||||
out.Styled(style.Confused, "Failed to verify '{{.driver_name}} info' will try again ...", out.V{"driver_name": drvName})
|
||||
si, err = oci.DaemonInfo(drvName)
|
||||
if err != nil {
|
||||
exit.Message(reason.Usage, "Ensure your {{.driver_name}} is running and is healthy.", out.V{"driver_name": driver.FullName(drvName)})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if si.CPUs < cpuCount {
|
||||
|
||||
if availableCPUs < cpuCount {
|
||||
if driver.IsDockerDesktop(drvName) {
|
||||
out.Styled(style.Empty, `- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.`, out.V{"driver_name": drvName})
|
||||
if runtime.GOOS == "darwin" {
|
||||
out.Styled(style.Empty, `- Docs https://docs.docker.com/docker-for-mac/#resources`, out.V{"driver_name": drvName})
|
||||
out.Styled(style.Empty, `- Docs https://docs.docker.com/docker-for-mac/#resources`)
|
||||
}
|
||||
if runtime.GOOS == "windows" {
|
||||
out.String("\n\t")
|
||||
out.Styled(style.Empty, `- Docs https://docs.docker.com/docker-for-windows/#resources`, out.V{"driver_name": drvName})
|
||||
out.Styled(style.Empty, `- Docs https://docs.docker.com/docker-for-windows/#resources`)
|
||||
}
|
||||
}
|
||||
|
||||
exitIfNotForced(reason.RsrcInsufficientCores, "Requested cpu count {{.requested_cpus}} is greater than the available cpus of {{.avail_cpus}}", out.V{"requested_cpus": cpuCount, "avail_cpus": si.CPUs})
|
||||
exitIfNotForced(reason.RsrcInsufficientCores, "Requested cpu count {{.requested_cpus}} is greater than the available cpus of {{.avail_cpus}}", out.V{"requested_cpus": cpuCount, "avail_cpus": availableCPUs})
|
||||
}
|
||||
|
||||
// looks good
|
||||
if si.CPUs >= 2 {
|
||||
if availableCPUs >= 2 {
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -1236,13 +1229,32 @@ func validateChangedMemoryFlags(drvName string) {
|
|||
if !driver.HasResourceLimits(drvName) {
|
||||
out.WarningT("The '{{.name}}' driver does not respect the --memory flag", out.V{"name": drvName})
|
||||
}
|
||||
req, err := util.CalculateSizeInMB(viper.GetString(memory))
|
||||
if err != nil {
|
||||
exitIfNotForced(reason.Usage, "Unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": viper.GetString(memory), "error": err})
|
||||
var req int
|
||||
var err error
|
||||
memString := viper.GetString(memory)
|
||||
if memString == constants.MaxResources {
|
||||
sysLimit, containerLimit, err := memoryLimits(drvName)
|
||||
if err != nil {
|
||||
klog.Warningf("Unable to query memory limits: %+v", err)
|
||||
}
|
||||
req = noLimitMemory(sysLimit, containerLimit)
|
||||
} else {
|
||||
req, err = util.CalculateSizeInMB(memString)
|
||||
if err != nil {
|
||||
exitIfNotForced(reason.Usage, "Unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": memString, "error": err})
|
||||
}
|
||||
}
|
||||
validateRequestedMemorySize(req, drvName)
|
||||
}
|
||||
|
||||
func noLimitMemory(sysLimit int, containerLimit int) int {
|
||||
if containerLimit != 0 {
|
||||
return containerLimit
|
||||
}
|
||||
// Recommend 1GB to handle OS/VM overhead
|
||||
return sysLimit - 1024
|
||||
}
|
||||
|
||||
// This function validates if the --registry-mirror
|
||||
// args match the format of http://localhost
|
||||
func validateRegistryMirror() {
|
||||
|
|
|
@ -23,10 +23,12 @@ import (
|
|||
|
||||
"github.com/blang/semver"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/shirou/gopsutil/v3/cpu"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/minikube/pkg/drivers/kic"
|
||||
"k8s.io/minikube/pkg/drivers/kic/oci"
|
||||
"k8s.io/minikube/pkg/minikube/bootstrapper/bsutil"
|
||||
"k8s.io/minikube/pkg/minikube/bootstrapper/bsutil/kverify"
|
||||
"k8s.io/minikube/pkg/minikube/cni"
|
||||
|
@ -135,8 +137,8 @@ func initMinikubeFlags() {
|
|||
startCmd.Flags().Bool(interactive, true, "Allow user prompts for more information")
|
||||
startCmd.Flags().Bool(dryRun, false, "dry-run mode. Validates configuration, but does not mutate system state")
|
||||
|
||||
startCmd.Flags().Int(cpus, 2, "Number of CPUs allocated to Kubernetes.")
|
||||
startCmd.Flags().String(memory, "", "Amount of RAM to allocate to Kubernetes (format: <number>[<unit>], where unit = b, k, m or g).")
|
||||
startCmd.Flags().String(cpus, "2", fmt.Sprintf("Number of CPUs allocated to Kubernetes. Use %q to use the maximum number of CPUs.", constants.MaxResources))
|
||||
startCmd.Flags().String(memory, "", fmt.Sprintf("Amount of RAM to allocate to Kubernetes (format: <number>[<unit>], where unit = b, k, m or g). Use %q to use the maximum amount of memory.", constants.MaxResources))
|
||||
startCmd.Flags().String(humanReadableDiskSize, defaultDiskSize, "Disk size allocated to the minikube VM (format: <number>[<unit>], where unit = b, k, m or g).")
|
||||
startCmd.Flags().Bool(downloadOnly, false, "If true, only download and cache files for later use - don't install or start anything.")
|
||||
startCmd.Flags().Bool(cacheImages, true, "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none.")
|
||||
|
@ -290,6 +292,30 @@ func generateClusterConfig(cmd *cobra.Command, existing *config.ClusterConfig, k
|
|||
return createNode(cc, kubeNodeName, existing)
|
||||
}
|
||||
|
||||
func getCPUCount(drvName string) int {
|
||||
if viper.GetString(cpus) != constants.MaxResources {
|
||||
return viper.GetInt(cpus)
|
||||
}
|
||||
|
||||
if !driver.IsKIC(drvName) {
|
||||
ci, err := cpu.Counts(true)
|
||||
if err != nil {
|
||||
exit.Message(reason.Usage, "Unable to get CPU info: {{.err}}", out.V{"err": err})
|
||||
}
|
||||
return ci
|
||||
}
|
||||
|
||||
si, err := oci.CachedDaemonInfo(drvName)
|
||||
if err != nil {
|
||||
si, err = oci.DaemonInfo(drvName)
|
||||
if err != nil {
|
||||
exit.Message(reason.Usage, "Ensure your {{.driver_name}} is running and is healthy.", out.V{"driver_name": driver.FullName(drvName)})
|
||||
}
|
||||
}
|
||||
|
||||
return si.CPUs
|
||||
}
|
||||
|
||||
func getMemorySize(cmd *cobra.Command, drvName string) int {
|
||||
sysLimit, containerLimit, err := memoryLimits(drvName)
|
||||
if err != nil {
|
||||
|
@ -298,10 +324,15 @@ func getMemorySize(cmd *cobra.Command, drvName string) int {
|
|||
|
||||
mem := suggestMemoryAllocation(sysLimit, containerLimit, viper.GetInt(nodes))
|
||||
if cmd.Flags().Changed(memory) || viper.IsSet(memory) {
|
||||
memString := viper.GetString(memory)
|
||||
var err error
|
||||
mem, err = pkgutil.CalculateSizeInMB(viper.GetString(memory))
|
||||
if err != nil {
|
||||
exit.Message(reason.Usage, "Generate unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": viper.GetString(memory), "error": err})
|
||||
if memString == constants.MaxResources {
|
||||
mem = noLimitMemory(sysLimit, containerLimit)
|
||||
} else {
|
||||
mem, err = pkgutil.CalculateSizeInMB(memString)
|
||||
if err != nil {
|
||||
exit.Message(reason.Usage, "Generate unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": memString, "error": err})
|
||||
}
|
||||
}
|
||||
if driver.IsKIC(drvName) && mem > containerLimit {
|
||||
exit.Message(reason.Usage, "{{.driver_name}} has only {{.container_limit}}MB memory but you specified {{.specified_memory}}MB", out.V{"container_limit": containerLimit, "specified_memory": mem, "driver_name": driver.FullName(drvName)})
|
||||
|
@ -384,7 +415,7 @@ func generateNewConfigFromFlags(cmd *cobra.Command, k8sVersion string, drvName s
|
|||
KicBaseImage: viper.GetString(kicBaseImage),
|
||||
Network: viper.GetString(network),
|
||||
Memory: getMemorySize(cmd, drvName),
|
||||
CPUs: viper.GetInt(cpus),
|
||||
CPUs: getCPUCount(drvName),
|
||||
DiskSize: getDiskSize(),
|
||||
Driver: drvName,
|
||||
ListenAddress: viper.GetString(listenAddress),
|
||||
|
|
|
@ -16,7 +16,7 @@ ExecStart=/usr/bin/containerd \
|
|||
--root ${PERSISTENT_DIR}/var/lib/containerd
|
||||
TasksMax=8192
|
||||
Delegate=yes
|
||||
KillMode=process
|
||||
KillMode=mixed
|
||||
LimitNOFILE=1048576
|
||||
# Having non-zero Limit*s causes performance problems due to accounting overhead
|
||||
# in the kernel. We recommend using cgroups to do container-local accounting.
|
||||
|
|
|
@ -21,4 +21,4 @@ sha256 74a4e916acddc6cf47ab5752bdebb6732ce2c028505ef57b7edc21d2da9039b6 v1.18.4.
|
|||
sha256 fc8a8e61375e3ce30563eeb0fd6534c4f48fc20300a72e6ff51cc99cb2703516 v1.19.0.tar.gz
|
||||
sha256 6165c5b8212ea03be2a465403177318bfe25a54c3e8d66d720344643913a0223 v1.19.1.tar.gz
|
||||
sha256 76fd7543bc92d4364a11060f43a5131893a76c6e6e9d6de3a6bb6292c110b631 v1.20.0.tar.gz
|
||||
sha256 1c01d4a76cdcfe3ac24147eb1d5f6ebd782bd98fb0ac0c19b79bd5a6560b1481 v1.20.2.tar.gz
|
||||
sha256 36d9f4cf4966342e2d4099e44d8156c55c6a10745c67ce4f856aa9f6dcc2d9ba v1.20.2.tar.gz
|
||||
|
|
|
@ -17,6 +17,14 @@
|
|||
# For systemd + docker configuration used below, see the following references:
|
||||
# https://systemd.io/CONTAINER_INTERFACE/
|
||||
|
||||
|
||||
# multi-tage docker build so we can build auto-pause for arm64
|
||||
FROM golang:1.16
|
||||
WORKDIR /src
|
||||
# becaue auto-pause binary depends on minikube's code we need to pass the whole source code as the context
|
||||
ADD . .
|
||||
RUN cd ./cmd/auto-pause/ && go build
|
||||
|
||||
# start from ubuntu 20.04, this image is reasonably small as a starting point
|
||||
# for a kubernetes node image, it doesn't contain much we don't need
|
||||
FROM ubuntu:focal-20210401
|
||||
|
@ -24,12 +32,11 @@ FROM ubuntu:focal-20210401
|
|||
ARG BUILDKIT_VERSION="v0.8.2"
|
||||
|
||||
# copy in static files (configs, scripts)
|
||||
COPY 10-network-security.conf /etc/sysctl.d/10-network-security.conf
|
||||
COPY 11-tcp-mtu-probing.conf /etc/sysctl.d/11-tcp-mtu-probing.conf
|
||||
COPY clean-install /usr/local/bin/clean-install
|
||||
COPY entrypoint /usr/local/bin/entrypoint
|
||||
# must first run `make deploy/kicbase/auto-pause`
|
||||
COPY auto-pause /bin/auto-pause
|
||||
COPY deploy/kicbase/10-network-security.conf /etc/sysctl.d/10-network-security.conf
|
||||
COPY deploy/kicbase/11-tcp-mtu-probing.conf /etc/sysctl.d/11-tcp-mtu-probing.conf
|
||||
COPY deploy/kicbase/clean-install /usr/local/bin/clean-install
|
||||
COPY deploy/kicbase/entrypoint /usr/local/bin/entrypoint
|
||||
COPY --from=0 /src/cmd/auto-pause /bin/auto-pause
|
||||
|
||||
# Install dependencies, first from apt, then from release tarballs.
|
||||
# NOTE: we use one RUN to minimize layers.
|
||||
|
@ -152,14 +159,14 @@ RUN sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/lib
|
|||
systemd-tmpfiles --create
|
||||
|
||||
# automount service
|
||||
COPY automount/minikube-automount /usr/sbin/minikube-automount
|
||||
COPY automount/minikube-automount.service /usr/lib/systemd/system/minikube-automount.service
|
||||
COPY deploy/kicbase/automount/minikube-automount /usr/sbin/minikube-automount
|
||||
COPY deploy/kicbase/automount/minikube-automount.service /usr/lib/systemd/system/minikube-automount.service
|
||||
RUN ln -fs /usr/lib/systemd/system/minikube-automount.service \
|
||||
/etc/systemd/system/multi-user.target.wants/minikube-automount.service
|
||||
|
||||
# scheduled stop service
|
||||
COPY scheduled-stop/minikube-scheduled-stop /var/lib/minikube/scheduled-stop/minikube-scheduled-stop
|
||||
COPY scheduled-stop/minikube-scheduled-stop.service /usr/lib/systemd/system/minikube-scheduled-stop.service
|
||||
COPY deploy/kicbase/scheduled-stop/minikube-scheduled-stop /var/lib/minikube/scheduled-stop/minikube-scheduled-stop
|
||||
COPY deploy/kicbase/scheduled-stop/minikube-scheduled-stop.service /usr/lib/systemd/system/minikube-scheduled-stop.service
|
||||
RUN chmod +x /var/lib/minikube/scheduled-stop/minikube-scheduled-stop
|
||||
|
||||
# disable non-docker runtimes by default
|
||||
|
|
|
@ -48,7 +48,7 @@ func getSHAFromURL(url string) (string, error) {
|
|||
}
|
||||
|
||||
func TestReleasesJSON(t *testing.T) {
|
||||
releases, err := notify.GetAllVersionsFromURL(notify.GithubMinikubeReleasesURL)
|
||||
releases, err := notify.AllVersionsFromURL(notify.GithubMinikubeReleasesURL)
|
||||
if err != nil {
|
||||
t.Fatalf("Error getting releases.json: %v", err)
|
||||
}
|
||||
|
|
|
@ -1,5 +1,13 @@
|
|||
[
|
||||
{
|
||||
"name": "v1.22.0-beta.0",
|
||||
"checksums": {
|
||||
"darwin": "1ec06c37be5c6c79a7255da09ff83490a44d1e8cd2b2f45e4b489edfdeacde94",
|
||||
"linux": "c9d9ac605a94748379188cced6b832037b8069441744b889214990c4ca3485a5",
|
||||
"windows": "68fb9c24f0ea55b985856d0cce9fa0c288b8a4d7e13519d6f0790038165d7ef1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "v1.21.0-beta.0",
|
||||
"checksums": {
|
||||
"darwin": "69ab001eb4984d09ed731d5ac92afd8310e5c7672c2275b39d7a4c7e2dcfb4c6",
|
||||
|
|
8
go.mod
8
go.mod
|
@ -72,7 +72,7 @@ require (
|
|||
github.com/shirou/gopsutil/v3 v3.21.5
|
||||
github.com/spf13/cobra v1.1.3
|
||||
github.com/spf13/pflag v1.0.5
|
||||
github.com/spf13/viper v1.8.0
|
||||
github.com/spf13/viper v1.8.1
|
||||
github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f
|
||||
github.com/zchee/go-vmnet v0.0.0-20161021174912-97ebf9174097
|
||||
go.opencensus.io v0.23.0
|
||||
|
@ -83,13 +83,13 @@ require (
|
|||
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83
|
||||
golang.org/x/exp v0.0.0-20210220032938-85be41e4509f
|
||||
golang.org/x/mod v0.4.2
|
||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c
|
||||
golang.org/x/oauth2 v0.0.0-20210615190721-d04028783cf1
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
|
||||
golang.org/x/sys v0.0.0-20210603125802-9665404d3644
|
||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22
|
||||
golang.org/x/term v0.0.0-20210406210042-72f3dc4e9b72
|
||||
golang.org/x/text v0.3.6
|
||||
gonum.org/v1/plot v0.9.0
|
||||
google.golang.org/api v0.48.0
|
||||
google.golang.org/api v0.49.0
|
||||
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0
|
||||
k8s.io/api v0.21.2
|
||||
|
|
23
go.sum
23
go.sum
|
@ -22,8 +22,9 @@ cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmW
|
|||
cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
|
||||
cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
|
||||
cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
|
||||
cloud.google.com/go v0.83.0 h1:bAMqZidYkmIsUqe6PtkEPT7Q+vfizScn+jfNA6jwK9c=
|
||||
cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
|
||||
cloud.google.com/go v0.84.0 h1:hVhK90DwCdOAYGME/FJd9vNIZye9HBR6Yy3fu4js3N8=
|
||||
cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
|
||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||
|
@ -997,8 +998,8 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
|||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
||||
github.com/spf13/viper v1.8.0 h1:QRwDgoG8xX+kp69di68D+YYTCWfYEckbZRfUlEIAal0=
|
||||
github.com/spf13/viper v1.8.0/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
|
||||
github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44=
|
||||
github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
|
||||
github.com/storageos/go-api v2.2.0+incompatible/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY=
|
||||
github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
|
@ -1261,8 +1262,9 @@ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ
|
|||
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c h1:pkQiBZBvdos9qq4wBAHqlzuZHEXo07pqV06ef90u1WI=
|
||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20210615190721-d04028783cf1 h1:x622Z2o4hgCr/4CiKWc51jHVKaWdtVpBNmEI8wI9Qns=
|
||||
golang.org/x/oauth2 v0.0.0-20210615190721-d04028783cf1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -1368,8 +1370,9 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210603125802-9665404d3644 h1:CA1DEQ4NdKphKeL70tvsWNdT5oFh1lOjihRcEDROi0I=
|
||||
golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio=
|
||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
|
@ -1459,8 +1462,9 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f
|
|||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.2 h1:kRBLX7v7Af8W7Gdbbc908OJcdgtK8bOz9Uaj8/F1ACA=
|
||||
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.3 h1:L69ShwSZEyCsLKoAxDKeMvLDZkumEe8gXUZAjab0tX8=
|
||||
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
@ -1503,8 +1507,9 @@ google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk
|
|||
google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=
|
||||
google.golang.org/api v0.45.0/go.mod h1:ISLIJCedJolbZvDfAk+Ctuq5hf+aJ33WgtUsfyFoLXA=
|
||||
google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
|
||||
google.golang.org/api v0.48.0 h1:RDAPWfNFY06dffEXfn7hZF5Fr1ZbnChzfQZAPyBd1+I=
|
||||
google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
|
||||
google.golang.org/api v0.49.0 h1:gjIBDxlTG7vnzMmEnYwTnvLTF8Rjzo+ETCgEX1YZ/fY=
|
||||
google.golang.org/api v0.49.0/go.mod h1:BECiH72wsfwUvOVn3+btPD5WHi0LzavZReBndi42L18=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
|
@ -1565,8 +1570,10 @@ google.golang.org/genproto v0.0.0-20210413151531-c14fb6ef47c3/go.mod h1:P3QM42oQ
|
|||
google.golang.org/genproto v0.0.0-20210420162539-3c870d7478d2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
|
||||
google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
|
||||
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||
google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08 h1:pc16UedxnxXXtGxHCSUhafAoVHQZ0yXl8ZelMH4EETc=
|
||||
google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||
google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||
google.golang.org/genproto v0.0.0-20210617175327-b9e0b3197ced h1:c5geK1iMU3cDKtFrCVQIcjR3W+JOZMuhIyICMCTbtus=
|
||||
google.golang.org/genproto v0.0.0-20210617175327-b9e0b3197ced/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
|
||||
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||
|
|
|
@ -17,9 +17,9 @@
|
|||
set -e
|
||||
|
||||
install_kind() {
|
||||
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.0/kind-linux-amd64
|
||||
curl -Lo ./kind https://github.com/kubernetes-sigs/kind/releases/latest/download/kind-linux-amd64
|
||||
chmod +x ./kind
|
||||
sudo mv ./kind /usr/local
|
||||
sudo mv ./kind /usr/local/bin/kind
|
||||
}
|
||||
|
||||
install_k3d() {
|
||||
|
@ -51,7 +51,7 @@ run_benchmark() {
|
|||
pwd
|
||||
( cd ./hack/benchmark/time-to-k8s/time-to-k8s-repo/ &&
|
||||
git submodule update --init &&
|
||||
go run . --config local-kubernetes.yaml --iterations 5 --output output.csv )
|
||||
go run . --config local-kubernetes.yaml --iterations 10 --output output.csv )
|
||||
}
|
||||
|
||||
generate_chart() {
|
||||
|
|
|
@ -1,53 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Copyright 2021 The Kubernetes Authors All rights reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
set -x
|
||||
|
||||
if [ "$#" -ne 1 ]; then
|
||||
# there's no secret and therefore no reason to run this script
|
||||
exit 0
|
||||
fi
|
||||
|
||||
install_gh() {
|
||||
export access_token="$1"
|
||||
|
||||
# Make sure gh is installed and configured
|
||||
./hack/jenkins/installers/check_install_gh.sh
|
||||
}
|
||||
|
||||
config_git() {
|
||||
git config user.name "minikube-bot"
|
||||
git config user.email "minikube-bot@google.com"
|
||||
}
|
||||
|
||||
make generate-docs
|
||||
|
||||
# If there are changes, open a PR
|
||||
changes=$(git status --porcelain)
|
||||
if [ "$changes" != "" ]; then
|
||||
install_gh $1
|
||||
config_git
|
||||
|
||||
branch=gendocs$(date +%s%N)
|
||||
git checkout -b $branch
|
||||
|
||||
git add .
|
||||
git commit -m "Update generate-docs"
|
||||
|
||||
git remote add minikube-bot https://minikube-bot:"$1"@github.com/minikube-bot/minikube.git
|
||||
git push -u minikube-bot $branch
|
||||
gh pr create --repo kubernetes/minikube --base master --head minikube-bot:$branch --title "Update auto-generated docs and translations" --body "Committing changes resulting from \`make generate-docs\`"
|
||||
fi
|
|
@ -1,6 +1,18 @@
|
|||
<html>
|
||||
<head>
|
||||
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
|
||||
<style>
|
||||
table {
|
||||
border: 1px solid gray;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
td, th {
|
||||
border-bottom: 1px solid gray;
|
||||
padding: 8px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="chart_div"></div>
|
||||
|
|
|
@ -1,19 +1,59 @@
|
|||
|
||||
// Displays an error message to the UI. Any previous message will be erased.
|
||||
function displayError(message) {
|
||||
console.error(message);
|
||||
// Clear the body of all children.
|
||||
while (document.body.firstChild) {
|
||||
document.body.removeChild(document.body.firstChild);
|
||||
}
|
||||
const element = document.createElement("p");
|
||||
element.innerText = "Error: " + message;
|
||||
element.style.color = "red";
|
||||
element.style.fontFamily = "Arial";
|
||||
element.style.fontWeight = "bold";
|
||||
element.style.margin = "5rem";
|
||||
document.body.appendChild(element);
|
||||
}
|
||||
|
||||
// Creates a generator that reads the response body one line at a time.
|
||||
async function* bodyByLinesIterator(response) {
|
||||
// TODO: Replace this with something that actually reads the body line by line
|
||||
// (since the file can be big).
|
||||
const lines = (await response.text()).split("\n");
|
||||
for (let line of lines) {
|
||||
// Skip any empty lines (most likely at the end).
|
||||
if (line !== "") {
|
||||
yield line;
|
||||
async function* bodyByLinesIterator(response, updateProgress) {
|
||||
const utf8Decoder = new TextDecoder('utf-8');
|
||||
const reader = response.body.getReader();
|
||||
|
||||
const re = /\n|\r|\r\n/gm;
|
||||
let pendingText = "";
|
||||
|
||||
let readerDone = false;
|
||||
while (!readerDone) {
|
||||
// Read a chunk.
|
||||
const { value: chunk, done } = await reader.read();
|
||||
readerDone = done;
|
||||
if (!chunk) {
|
||||
continue;
|
||||
}
|
||||
// Notify the listener of progress.
|
||||
updateProgress(chunk.length);
|
||||
const decodedChunk = utf8Decoder.decode(chunk);
|
||||
|
||||
let startIndex = 0;
|
||||
let result;
|
||||
// Keep processing until there are no more new lines.
|
||||
while ((result = re.exec(decodedChunk)) !== null) {
|
||||
const text = decodedChunk.substring(startIndex, result.index);
|
||||
startIndex = re.lastIndex;
|
||||
|
||||
const line = pendingText + text;
|
||||
pendingText = "";
|
||||
if (line !== "") {
|
||||
yield line;
|
||||
}
|
||||
}
|
||||
// Any text after the last new line is appended to any pending text.
|
||||
pendingText += decodedChunk.substring(startIndex);
|
||||
}
|
||||
|
||||
// If there is any text remaining, return it.
|
||||
if (pendingText !== "") {
|
||||
yield pendingText;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -41,10 +81,31 @@ async function loadTestData() {
|
|||
throw `Failed to fetch data from GCS bucket. Error: ${responseText}`;
|
||||
}
|
||||
|
||||
const lines = bodyByLinesIterator(response);
|
||||
const box = document.createElement("div");
|
||||
box.style.width = "100%";
|
||||
const innerBox = document.createElement("div");
|
||||
innerBox.style.margin = "5rem";
|
||||
box.appendChild(innerBox);
|
||||
const progressBarPrompt = document.createElement("h1");
|
||||
progressBarPrompt.style.fontFamily = "Arial";
|
||||
progressBarPrompt.style.textAlign = "center";
|
||||
progressBarPrompt.innerText = "Downloading data...";
|
||||
innerBox.appendChild(progressBarPrompt);
|
||||
const progressBar = document.createElement("progress");
|
||||
progressBar.setAttribute("max", Number(response.headers.get('Content-Length')));
|
||||
progressBar.style.width = "100%";
|
||||
innerBox.appendChild(progressBar);
|
||||
document.body.appendChild(box);
|
||||
|
||||
let readBytes = 0;
|
||||
const lines = bodyByLinesIterator(response, value => {
|
||||
readBytes += value;
|
||||
progressBar.setAttribute("value", readBytes);
|
||||
});
|
||||
// Consume the header to ensure the data has the right number of fields.
|
||||
const header = (await lines.next()).value;
|
||||
if (header.split(",").length != 6) {
|
||||
document.body.removeChild(box);
|
||||
throw `Fetched CSV data contains wrong number of fields. Expected: 6. Actual Header: "${header}"`;
|
||||
}
|
||||
|
||||
|
@ -71,15 +132,20 @@ async function loadTestData() {
|
|||
duration: Number(splitLine[5]),
|
||||
});
|
||||
}
|
||||
document.body.removeChild(box);
|
||||
if (testData.length == 0) {
|
||||
throw "Fetched CSV data is empty or poorly formatted.";
|
||||
}
|
||||
return testData;
|
||||
}
|
||||
|
||||
Array.prototype.sum = function() {
|
||||
return this.reduce((sum, value) => sum + value, 0);
|
||||
};
|
||||
|
||||
// Computes the average of an array of numbers.
|
||||
Array.prototype.average = function () {
|
||||
return this.length === 0 ? 0 : this.reduce((sum, value) => sum + value, 0) / this.length;
|
||||
return this.length === 0 ? 0 : (this.sum() / this.length);
|
||||
};
|
||||
|
||||
// Groups array elements by keys obtained through `keyGetter`.
|
||||
|
@ -106,21 +172,34 @@ function parseUrlQuery(query) {
|
|||
}));
|
||||
}
|
||||
|
||||
async function init() {
|
||||
google.charts.load('current', { 'packages': ['corechart'] });
|
||||
let testData;
|
||||
try {
|
||||
// Wait for Google Charts to load, and for test data to load.
|
||||
// Only store the test data (at index 1) into `testData`.
|
||||
testData = (await Promise.all([
|
||||
new Promise(resolve => google.charts.setOnLoadCallback(resolve)),
|
||||
loadTestData()
|
||||
]))[1];
|
||||
} catch (err) {
|
||||
displayError(err);
|
||||
return;
|
||||
}
|
||||
// Takes a set of test runs (all of the same test), and aggregates them into one element per date.
|
||||
function aggregateRuns(testRuns) {
|
||||
return testRuns
|
||||
// Group runs by the date it ran.
|
||||
.groupBy(run => run.date.getTime())
|
||||
// Sort by run date, past to future.
|
||||
.sort((a, b) => a[0].date - b[0].date)
|
||||
// Map each group to all variables need to format the rows.
|
||||
.map(tests => ({
|
||||
date: tests[0].date, // Get one of the dates from the tests (which will all be the same).
|
||||
flakeRate: tests.map(test => test.status === testStatus.FAILED ? 100 : 0).average(), // Compute average of runs where FAILED counts as 100%.
|
||||
duration: tests.map(test => test.duration).average(), // Compute average duration of runs.
|
||||
commitHashes: tests.map(test => ({ // Take all hashes, statuses, and durations of tests in this group.
|
||||
hash: test.commit,
|
||||
status: test.status,
|
||||
duration: test.duration
|
||||
})).groupBy(run => run.hash).map(runsWithSameHash => ({
|
||||
hash: runsWithSameHash[0].hash,
|
||||
failures: runsWithSameHash.map(run => run.status === testStatus.FAILED ? 1 : 0).sum(),
|
||||
runs: runsWithSameHash.length,
|
||||
duration: runsWithSameHash.map(run => run.duration).average(),
|
||||
}))
|
||||
}));
|
||||
}
|
||||
|
||||
const hashToLink = (hash, environment) => `https://storage.googleapis.com/minikube-builds/logs/master/${hash.substring(0,7)}/${environment}.html`;
|
||||
|
||||
function displayTestAndEnvironmentChart(testData, testName, environmentName) {
|
||||
const data = new google.visualization.DataTable();
|
||||
data.addColumn('date', 'Date');
|
||||
data.addColumn('number', 'Flake Percentage');
|
||||
|
@ -128,50 +207,33 @@ async function init() {
|
|||
data.addColumn('number', 'Duration');
|
||||
data.addColumn({ type: 'string', role: 'tooltip', 'p': { 'html': true } });
|
||||
|
||||
const query = parseUrlQuery(window.location.search);
|
||||
const desiredTest = query.test || "", desiredEnvironment = query.env || "";
|
||||
|
||||
const groups = testData
|
||||
const testRuns = testData
|
||||
// Filter to only contain unskipped runs of the requested test and requested environment.
|
||||
.filter(test => test.name === desiredTest && test.environment === desiredEnvironment && test.status !== testStatus.SKIPPED)
|
||||
.groupBy(test => test.date.getTime());
|
||||
.filter(test => test.name === testName && test.environment === environmentName && test.status !== testStatus.SKIPPED);
|
||||
|
||||
data.addRows(
|
||||
groups
|
||||
// Sort by run date, past to future.
|
||||
.sort((a, b) => a[0].date - b[0].date)
|
||||
// Map each group to all variables need to format the rows.
|
||||
.map(tests => ({
|
||||
date: tests[0].date, // Get one of the dates from the tests (which will all be the same).
|
||||
flakeRate: tests.map(test => test.status === testStatus.FAILED ? 100 : 0).average(), // Compute average of runs where FAILED counts as 100%.
|
||||
duration: tests.map(test => test.duration).average(), // Compute average duration of runs.
|
||||
commitHashes: tests.map(test => ({ // Take all hashes, statuses, and durations of tests in this group.
|
||||
hash: test.commit,
|
||||
status: test.status,
|
||||
duration: test.duration
|
||||
}))
|
||||
}))
|
||||
aggregateRuns(testRuns)
|
||||
.map(groupData => [
|
||||
groupData.date,
|
||||
groupData.flakeRate,
|
||||
`<div class="py-2 ps-2">
|
||||
`<div style="padding: 1rem; font-family: 'Arial'; font-size: 14">
|
||||
<b>${groupData.date.toString()}</b><br>
|
||||
<b>Flake Percentage:</b> ${groupData.flakeRate.toFixed(2)}%<br>
|
||||
<b>Hashes:</b><br>
|
||||
${groupData.commitHashes.map(({ hash, status }) => ` - ${hash} (${status})`).join("<br>")}
|
||||
${groupData.commitHashes.map(({ hash, failures, runs }) => ` - <a href="${hashToLink(hash, environmentName)}">${hash}</a> (Failures: ${failures}/${runs})`).join("<br>")}
|
||||
</div>`,
|
||||
groupData.duration,
|
||||
`<div class="py-2 ps-2">
|
||||
`<div style="padding: 1rem; font-family: 'Arial'; font-size: 14">
|
||||
<b>${groupData.date.toString()}</b><br>
|
||||
<b>Average Duration:</b> ${groupData.duration.toFixed(2)}s<br>
|
||||
<b>Hashes:</b><br>
|
||||
${groupData.commitHashes.map(({ hash, duration }) => ` - ${hash} (${duration}s)`).join("<br>")}
|
||||
${groupData.commitHashes.map(({ hash, runs, duration }) => ` - <a href="${hashToLink(hash, environmentName)}">${hash}</a> (Average of ${runs}: ${duration.toFixed(2)}s)`).join("<br>")}
|
||||
</div>`,
|
||||
])
|
||||
);
|
||||
|
||||
const options = {
|
||||
title: `Flake rate and duration by day of ${desiredTest} on ${desiredEnvironment}`,
|
||||
title: `Flake rate and duration by day of ${testName} on ${environmentName}`,
|
||||
width: window.innerWidth,
|
||||
height: window.innerHeight,
|
||||
pointSize: 10,
|
||||
|
@ -191,4 +253,134 @@ async function init() {
|
|||
chart.draw(data, options);
|
||||
}
|
||||
|
||||
function createRecentFlakePercentageTable(recentFlakePercentage, environmentName) {
|
||||
const createCell = (elementType, text) => {
|
||||
const element = document.createElement(elementType);
|
||||
element.innerHTML = text;
|
||||
return element;
|
||||
}
|
||||
|
||||
const table = document.createElement("table");
|
||||
const tableHeaderRow = document.createElement("tr");
|
||||
tableHeaderRow.appendChild(createCell("th", "Test Name")).style.textAlign = "left";
|
||||
tableHeaderRow.appendChild(createCell("th", "Recent Flake Percentage"));
|
||||
table.appendChild(tableHeaderRow);
|
||||
for (const {testName, flakeRate} of recentFlakePercentage){
|
||||
const row = document.createElement("tr");
|
||||
row.appendChild(createCell("td", `<a href="${window.location.pathname}?env=${environmentName}&test=${testName}">${testName}</a>`));
|
||||
row.appendChild(createCell("td", `${flakeRate.toFixed(2)}%`)).style.textAlign = "right";
|
||||
table.appendChild(row);
|
||||
}
|
||||
return table;
|
||||
}
|
||||
|
||||
function displayEnvironmentChart(testData, environmentName) {
|
||||
// Number of days to use to look for "flaky-est" tests.
|
||||
const dateRange = 15;
|
||||
// Number of tests to display in chart.
|
||||
const topFlakes = 10;
|
||||
|
||||
const testRuns = testData
|
||||
// Filter to only contain unskipped runs of the requested test and requested environment.
|
||||
.filter(test => test.environment === environmentName && test.status !== testStatus.SKIPPED)
|
||||
.groupBy(test => test.name);
|
||||
|
||||
const aggregatedRuns = new Map(testRuns.map(test => [
|
||||
test[0].name,
|
||||
new Map(aggregateRuns(test)
|
||||
.map(runDate => [ runDate.date.getTime(), runDate ]))]));
|
||||
const uniqueDates = new Set();
|
||||
for (const [_, runDateMap] of aggregatedRuns) {
|
||||
for (const [dateTime, _] of runDateMap) {
|
||||
uniqueDates.add(dateTime);
|
||||
}
|
||||
}
|
||||
const orderedDates = Array.from(uniqueDates).sort();
|
||||
const recentDates = orderedDates.slice(-dateRange);
|
||||
|
||||
const recentFlakePercentage = Array.from(aggregatedRuns).map(([testName, data]) => {
|
||||
const {flakeCount, totalCount} = recentDates.map(date => {
|
||||
const dateInfo = data.get(date);
|
||||
return dateInfo === undefined ? null : {
|
||||
flakeRate: dateInfo.flakeRate,
|
||||
runs: dateInfo.commitHashes.length
|
||||
};
|
||||
}).filter(dateInfo => dateInfo != null)
|
||||
.reduce(({flakeCount, totalCount}, {flakeRate, runs}) => ({
|
||||
flakeCount: flakeRate * runs + flakeCount,
|
||||
totalCount: runs + totalCount
|
||||
}), {flakeCount: 0, totalCount: 0});
|
||||
return {
|
||||
testName,
|
||||
flakeRate: totalCount === 0 ? 0 : flakeCount / totalCount,
|
||||
};
|
||||
}).sort((a, b) => b.flakeRate - a.flakeRate);
|
||||
|
||||
const recentTopFlakes = recentFlakePercentage
|
||||
.slice(0, topFlakes)
|
||||
.map(({testName}) => testName);
|
||||
|
||||
const data = new google.visualization.DataTable();
|
||||
data.addColumn('date', 'Date');
|
||||
for (const name of recentTopFlakes) {
|
||||
data.addColumn('number', `Flake Percentage - ${name}`);
|
||||
data.addColumn({ type: 'string', role: 'tooltip', 'p': { 'html': true } });
|
||||
}
|
||||
data.addRows(
|
||||
orderedDates.map(dateTime => [new Date(dateTime)].concat(recentTopFlakes.map(name => {
|
||||
const data = aggregatedRuns.get(name).get(dateTime);
|
||||
return data !== undefined ? [
|
||||
data.flakeRate,
|
||||
`<div style="padding: 1rem; font-family: 'Arial'; font-size: 14">
|
||||
<b style="display: block">${name}</b><br>
|
||||
<b>${data.date.toString()}</b><br>
|
||||
<b>Flake Percentage:</b> ${data.flakeRate.toFixed(2)}%<br>
|
||||
<b>Hashes:</b><br>
|
||||
${data.commitHashes.map(({ hash, failures, runs }) => ` - <a href="${hashToLink(hash, environmentName)}">${hash}</a> (Failures: ${failures}/${runs})`).join("<br>")}
|
||||
</div>`
|
||||
] : [null, null];
|
||||
})).flat())
|
||||
);
|
||||
const options = {
|
||||
title: `Flake rate by day of top ${topFlakes} of recent test flakiness (past ${dateRange} days) on ${environmentName}`,
|
||||
width: window.innerWidth,
|
||||
height: window.innerHeight,
|
||||
pointSize: 10,
|
||||
pointShape: "circle",
|
||||
vAxes: {
|
||||
0: { title: "Flake rate", minValue: 0, maxValue: 100 },
|
||||
},
|
||||
tooltip: { trigger: "selection", isHtml: true }
|
||||
};
|
||||
const chart = new google.visualization.LineChart(document.getElementById('chart_div'));
|
||||
chart.draw(data, options);
|
||||
|
||||
document.body.appendChild(createRecentFlakePercentageTable(recentFlakePercentage, environmentName));
|
||||
}
|
||||
|
||||
async function init() {
|
||||
google.charts.load('current', { 'packages': ['corechart'] });
|
||||
let testData;
|
||||
try {
|
||||
// Wait for Google Charts to load, and for test data to load.
|
||||
// Only store the test data (at index 1) into `testData`.
|
||||
testData = (await Promise.all([
|
||||
new Promise(resolve => google.charts.setOnLoadCallback(resolve)),
|
||||
loadTestData()
|
||||
]))[1];
|
||||
} catch (err) {
|
||||
displayError(err);
|
||||
return;
|
||||
}
|
||||
|
||||
const query = parseUrlQuery(window.location.search);
|
||||
const desiredTest = query.test, desiredEnvironment = query.env || "";
|
||||
|
||||
if (desiredTest === undefined) {
|
||||
displayEnvironmentChart(testData, desiredEnvironment);
|
||||
} else {
|
||||
displayTestAndEnvironmentChart(testData, desiredTest, desiredEnvironment);
|
||||
}
|
||||
}
|
||||
|
||||
init();
|
||||
|
|
|
@ -81,6 +81,8 @@ if [[ "$FAILED_RATES_LINES" -gt 30 ]]; then
|
|||
printf "|More tests...|Continued...|\n\nToo many tests failed - See test logs for more details." >> "$TMP_COMMENT"
|
||||
fi
|
||||
|
||||
printf "\n\nTo see the flake rates of all tests on $ENVIRONMENT, click [here](https:\/\/storage.googleapis.com\/minikube-flake-rate\/flake_chart.html?env=$ENVIRONMENT)." >> "$TMP_COMMENT"
|
||||
|
||||
# install gh if not present
|
||||
$DIR/../installers/check_install_gh.sh
|
||||
|
||||
|
|
|
@ -49,5 +49,5 @@ echo ">> uploading ${SUMMARY_OUT}"
|
|||
gsutil -qm cp "${SUMMARY_OUT}" "gs://${JOB_GCS_BUCKET}_summary.json" || true
|
||||
|
||||
if [[ "${MINIKUBE_LOCATION}" == "master" ]]; then
|
||||
./test-flake-chart/jenkins_upload_tests.sh "${SUMMARY_OUT}"
|
||||
./test-flake-chart/upload_tests.sh "${SUMMARY_OUT}"
|
||||
fi
|
||||
|
|
|
@ -45,39 +45,39 @@ const (
|
|||
|
||||
var (
|
||||
schema = map[string]update.Item{
|
||||
".github/workflows/iso.yml": {
|
||||
Replace: map[string]string{
|
||||
`go-version: '.*`: `go-version: '{{.StableVersion}}'`,
|
||||
},
|
||||
},
|
||||
".github/workflows/kic_image.yml": {
|
||||
Replace: map[string]string{
|
||||
`go-version: '.*`: `go-version: '{{.StableVersion}}'`,
|
||||
},
|
||||
},
|
||||
".github/workflows/build.yml": {
|
||||
Replace: map[string]string{
|
||||
`go-version: '.*`: `go-version: '{{.StableVersion}}'`,
|
||||
`GO_VERSION: '.*`: `GO_VERSION: '{{.StableVersion}}'`,
|
||||
},
|
||||
},
|
||||
".github/workflows/master.yml": {
|
||||
Replace: map[string]string{
|
||||
`go-version: '.*`: `go-version: '{{.StableVersion}}'`,
|
||||
`GO_VERSION: '.*`: `GO_VERSION: '{{.StableVersion}}'`,
|
||||
},
|
||||
},
|
||||
".github/workflows/pr.yml": {
|
||||
Replace: map[string]string{
|
||||
`go-version: '.*`: `go-version: '{{.StableVersion}}'`,
|
||||
`GO_VERSION: '.*`: `GO_VERSION: '{{.StableVersion}}'`,
|
||||
},
|
||||
},
|
||||
".github/workflows/docs.yml": {
|
||||
Replace: map[string]string{
|
||||
`go-version: '.*`: `go-version: '{{.StableVersion}}'`,
|
||||
`GO_VERSION: '.*`: `GO_VERSION: '{{.StableVersion}}'`,
|
||||
},
|
||||
},
|
||||
".github/workflows/time-to-k8s.yml": {
|
||||
Replace: map[string]string{
|
||||
`go-version: '.*`: `go-version: '{{.StableVersion}}'`,
|
||||
`GO_VERSION: '.*`: `GO_VERSION: '{{.StableVersion}}'`,
|
||||
},
|
||||
},
|
||||
".github/workflows/translations.yml": {
|
||||
Replace: map[string]string{
|
||||
`GO_VERSION: '.*`: `GO_VERSION: '{{.StableVersion}}'`,
|
||||
},
|
||||
},
|
||||
".github/workflows/pr_verified.yaml": {
|
||||
Replace: map[string]string{
|
||||
`GO_VERSION: '.*`: `GO_VERSION: '{{.StableVersion}}'`,
|
||||
},
|
||||
},
|
||||
".travis.yml": {
|
||||
|
|
|
@ -17,7 +17,6 @@ limitations under the License.
|
|||
package addons
|
||||
|
||||
import (
|
||||
"runtime"
|
||||
"strconv"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
@ -43,8 +42,8 @@ func enableOrDisableAutoPause(cc *config.ClusterConfig, name string, val string)
|
|||
out.Infof("auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.")
|
||||
out.Infof("https://github.com/kubernetes/minikube/labels/co/auto-pause")
|
||||
|
||||
if cc.KubernetesConfig.ContainerRuntime != "docker" || runtime.GOARCH != "amd64" {
|
||||
exit.Message(reason.Usage, `auto-pause currently is only supported on docker runtime and amd64. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601`)
|
||||
if cc.KubernetesConfig.ContainerRuntime != "docker" {
|
||||
exit.Message(reason.Usage, `auto-pause currently is only supported on docker runtime. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601`)
|
||||
}
|
||||
co := mustload.Running(cc.Name)
|
||||
if enable {
|
||||
|
|
|
@ -24,9 +24,9 @@ import (
|
|||
|
||||
const (
|
||||
// Version is the current version of kic
|
||||
Version = "v0.0.23"
|
||||
Version = "v0.0.24"
|
||||
// SHA of the kic base image
|
||||
baseImageSHA = "baf6d94b2050bcbecd98994e265cf965a4f4768978620ccf5227a6dcb75ade45"
|
||||
baseImageSHA = "ba324e0dc025040a8ea6b883d008ec4a43a47db106fb59ac7446982c20c2cdc5"
|
||||
// The name of the GCR kicbase repository
|
||||
gcrRepo = "gcr.io/k8s-minikube/kicbase"
|
||||
// The name of the Dockerhub kicbase repository
|
||||
|
|
|
@ -32,10 +32,11 @@ import (
|
|||
|
||||
// Addon is a named list of assets, that can be enabled
|
||||
type Addon struct {
|
||||
Assets []*BinAsset
|
||||
enabled bool
|
||||
addonName string
|
||||
Images map[string]string
|
||||
Assets []*BinAsset
|
||||
enabled bool
|
||||
addonName string
|
||||
Maintainer string
|
||||
Images map[string]string
|
||||
|
||||
// Registries currently only shows the default registry of images
|
||||
Registries map[string]string
|
||||
|
@ -48,11 +49,12 @@ type NetworkInfo struct {
|
|||
}
|
||||
|
||||
// NewAddon creates a new Addon
|
||||
func NewAddon(assets []*BinAsset, enabled bool, addonName string, images map[string]string, registries map[string]string) *Addon {
|
||||
func NewAddon(assets []*BinAsset, enabled bool, addonName string, maintainer string, images map[string]string, registries map[string]string) *Addon {
|
||||
a := &Addon{
|
||||
Assets: assets,
|
||||
enabled: enabled,
|
||||
addonName: addonName,
|
||||
Maintainer: maintainer,
|
||||
Images: images,
|
||||
Registries: registries,
|
||||
}
|
||||
|
@ -111,7 +113,7 @@ var Addons = map[string]*Addon{
|
|||
"0640"),
|
||||
|
||||
// GuestPersistentDir
|
||||
}, false, "auto-pause", map[string]string{
|
||||
}, false, "auto-pause", "google", map[string]string{
|
||||
"AutoPauseHook": "k8s-minikube/auto-pause-hook:v0.0.2@sha256:c76be418df5ca9c66d0d11c2c68461acbf4072c1cdfc17e64729c5ef4d5a4128",
|
||||
}, map[string]string{
|
||||
"AutoPauseHook": "gcr.io",
|
||||
|
@ -128,7 +130,7 @@ var Addons = map[string]*Addon{
|
|||
MustBinAsset(addons.DashboardAssets, "dashboard/dashboard-sa.yaml", vmpath.GuestAddonsDir, "dashboard-sa.yaml", "0640"),
|
||||
MustBinAsset(addons.DashboardAssets, "dashboard/dashboard-secret.yaml", vmpath.GuestAddonsDir, "dashboard-secret.yaml", "0640"),
|
||||
MustBinAsset(addons.DashboardAssets, "dashboard/dashboard-svc.yaml", vmpath.GuestAddonsDir, "dashboard-svc.yaml", "0640"),
|
||||
}, false, "dashboard", map[string]string{
|
||||
}, false, "dashboard", "kubernetes", map[string]string{
|
||||
"Dashboard": "kubernetesui/dashboard:v2.1.0@sha256:7f80b5ba141bead69c4fee8661464857af300d7d7ed0274cf7beecedc00322e6",
|
||||
"MetricsScraper": "kubernetesui/metrics-scraper:v1.0.4@sha256:555981a24f184420f3be0c79d4efb6c948a85cfce84034f85a563f4151a81cbf",
|
||||
}, nil),
|
||||
|
@ -138,21 +140,21 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"storageclass.yaml",
|
||||
"0640"),
|
||||
}, true, "default-storageclass", nil, nil),
|
||||
}, true, "default-storageclass", "kubernetes", nil, nil),
|
||||
"pod-security-policy": NewAddon([]*BinAsset{
|
||||
MustBinAsset(addons.PodSecurityPolicyAssets,
|
||||
"pod-security-policy/pod-security-policy.yaml.tmpl",
|
||||
vmpath.GuestAddonsDir,
|
||||
"pod-security-policy.yaml",
|
||||
"0640"),
|
||||
}, false, "pod-security-policy", nil, nil),
|
||||
}, false, "pod-security-policy", "", nil, nil),
|
||||
"storage-provisioner": NewAddon([]*BinAsset{
|
||||
MustBinAsset(addons.StorageProvisionerAssets,
|
||||
"storage-provisioner/storage-provisioner.yaml.tmpl",
|
||||
vmpath.GuestAddonsDir,
|
||||
"storage-provisioner.yaml",
|
||||
"0640"),
|
||||
}, true, "storage-provisioner", map[string]string{
|
||||
}, true, "storage-provisioner", "kubernetes", map[string]string{
|
||||
"StorageProvisioner": fmt.Sprintf("k8s-minikube/storage-provisioner:%s", version.GetStorageProvisionerVersion()),
|
||||
}, map[string]string{
|
||||
"StorageProvisioner": "gcr.io",
|
||||
|
@ -178,7 +180,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"storage-privisioner-glusterfile.yaml",
|
||||
"0640"),
|
||||
}, false, "storage-provisioner-gluster", map[string]string{
|
||||
}, false, "storage-provisioner-gluster", "", map[string]string{
|
||||
"Heketi": "heketi/heketi:10@sha256:76d5a6a3b7cf083d1e99efa1c15abedbc5c8b73bef3ade299ce9a4c16c9660f8",
|
||||
"GlusterfileProvisioner": "gluster/glusterfile-provisioner:latest@sha256:9961a35cb3f06701958e202324141c30024b195579e5eb1704599659ddea5223",
|
||||
"GlusterfsServer": "nixpanic/glusterfs-server:pr_fake-disk@sha256:3c58ae9d4e2007758954879d3f4095533831eb757c64ca6a0e32d1fc53fb6034",
|
||||
|
@ -216,7 +218,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"kibana-svc.yaml",
|
||||
"0640"),
|
||||
}, false, "efk", map[string]string{
|
||||
}, false, "efk", "", map[string]string{
|
||||
"Elasticsearch": "elasticsearch:v5.6.2@sha256:7e95b32a7a2aad0c0db5c881e4a1ce8b7e53236144ae9d9cfb5fbe5608af4ab2",
|
||||
"FluentdElasticsearch": "fluentd-elasticsearch:v2.0.2@sha256:d0480bbf2d0de2344036fa3f7034cf7b4b98025a89c71d7f1f1845ac0e7d5a97",
|
||||
"Alpine": "alpine:3.6@sha256:66790a2b79e1ea3e1dabac43990c54aca5d1ddf268d9a5a0285e4167c8b24475",
|
||||
|
@ -242,7 +244,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"ingress-dp.yaml",
|
||||
"0640"),
|
||||
}, false, "ingress", map[string]string{
|
||||
}, false, "ingress", "", map[string]string{
|
||||
"IngressController": "ingress-nginx/controller:v0.44.0@sha256:3dd0fac48073beaca2d67a78c746c7593f9c575168a17139a9955a82c63c4b9a",
|
||||
"KubeWebhookCertgenCreate": "docker.io/jettech/kube-webhook-certgen:v1.5.1@sha256:950833e19ade18cd389d647efb88992a7cc077abedef343fa59e012d376d79b7",
|
||||
"KubeWebhookCertgenPatch": "docker.io/jettech/kube-webhook-certgen:v1.5.1@sha256:950833e19ade18cd389d647efb88992a7cc077abedef343fa59e012d376d79b7",
|
||||
|
@ -255,7 +257,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"istio-operator.yaml",
|
||||
"0640"),
|
||||
}, false, "istio-provisioner", map[string]string{
|
||||
}, false, "istio-provisioner", "", map[string]string{
|
||||
"IstioOperator": "istio/operator:1.5.0@sha256:25a6398ed4996a5313767ceb63768d503c266f63506ad3074b30eef6b5b5167e",
|
||||
}, nil),
|
||||
"istio": NewAddon([]*BinAsset{
|
||||
|
@ -264,14 +266,14 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"istio-default-profile.yaml",
|
||||
"0640"),
|
||||
}, false, "istio", nil, nil),
|
||||
}, false, "istio", "", nil, nil),
|
||||
"kubevirt": NewAddon([]*BinAsset{
|
||||
MustBinAsset(addons.KubevirtAssets,
|
||||
"kubevirt/pod.yaml.tmpl",
|
||||
vmpath.GuestAddonsDir,
|
||||
"pod.yaml",
|
||||
"0640"),
|
||||
}, false, "kubevirt", map[string]string{
|
||||
}, false, "kubevirt", "", map[string]string{
|
||||
"Kubectl": "bitnami/kubectl:1.17@sha256:de642e973d3d0ef60e4d0a1f92286a9fdae245535c5990d4762bbe86fcf95887",
|
||||
}, nil),
|
||||
"metrics-server": NewAddon([]*BinAsset{
|
||||
|
@ -295,7 +297,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"metrics-server-service.yaml",
|
||||
"0640"),
|
||||
}, false, "metrics-server", map[string]string{
|
||||
}, false, "metrics-server", "kubernetes", map[string]string{
|
||||
"MetricsServer": "metrics-server/metrics-server:v0.4.2@sha256:dbc33d7d35d2a9cc5ab402005aa7a0d13be6192f3550c7d42cba8d2d5e3a5d62",
|
||||
}, map[string]string{
|
||||
"MetricsServer": "k8s.gcr.io",
|
||||
|
@ -311,7 +313,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"olm.yaml",
|
||||
"0640"),
|
||||
}, false, "olm", map[string]string{
|
||||
}, false, "olm", "", map[string]string{
|
||||
"OLM": "operator-framework/olm:v0.17.0@sha256:de396b540b82219812061d0d753440d5655250c621c753ed1dc67d6154741607",
|
||||
"UpstreamCommunityOperators": "operator-framework/upstream-community-operators:07bbc13@sha256:cc7b3fdaa1ccdea5866fcd171669dc0ed88d3477779d8ed32e3712c827e38cc0",
|
||||
}, map[string]string{
|
||||
|
@ -334,7 +336,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"registry-proxy.yaml",
|
||||
"0640"),
|
||||
}, false, "registry", map[string]string{
|
||||
}, false, "registry", "google", map[string]string{
|
||||
"Registry": "registry:2.7.1@sha256:d5459fcb27aecc752520df4b492b08358a1912fcdfa454f7d2101d4b09991daa",
|
||||
"KubeRegistryProxy": "google_containers/kube-registry-proxy:0.4@sha256:1040f25a5273de0d72c54865a8efd47e3292de9fb8e5353e3fa76736b854f2da",
|
||||
}, map[string]string{
|
||||
|
@ -346,7 +348,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"registry-creds-rc.yaml",
|
||||
"0640"),
|
||||
}, false, "registry-creds", map[string]string{
|
||||
}, false, "registry-creds", "", map[string]string{
|
||||
"RegistryCreds": "upmcenterprises/registry-creds:1.10@sha256:93a633d4f2b76a1c66bf19c664dbddc56093a543de6d54320f19f585ccd7d605",
|
||||
}, nil),
|
||||
"registry-aliases": NewAddon([]*BinAsset{
|
||||
|
@ -375,7 +377,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"patch-coredns-job.yaml",
|
||||
"0640"),
|
||||
}, false, "registry-aliases", map[string]string{
|
||||
}, false, "registry-aliases", "", map[string]string{
|
||||
"CoreDNSPatcher": "rhdevelopers/core-dns-patcher@sha256:9220ff32f690c3d889a52afb59ca6fcbbdbd99e5370550cc6fd249adea8ed0a9",
|
||||
"Alpine": "alpine:3.11@sha256:0bd0e9e03a022c3b0226667621da84fc9bf562a9056130424b5bfbd8bcb0397f",
|
||||
"Pause": "google_containers/pause:3.1@sha256:f78411e19d84a252e53bff71a4407a5686c46983a2c2eeed83929b888179acea",
|
||||
|
@ -389,7 +391,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"freshpod-rc.yaml",
|
||||
"0640"),
|
||||
}, false, "freshpod", map[string]string{
|
||||
}, false, "freshpod", "google", map[string]string{
|
||||
"FreshPod": "google-samples/freshpod:v0.0.1@sha256:b9efde5b509da3fd2959519c4147b653d0c5cefe8a00314e2888e35ecbcb46f9",
|
||||
}, map[string]string{
|
||||
"FreshPod": "gcr.io",
|
||||
|
@ -400,7 +402,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"nvidia-driver-installer.yaml",
|
||||
"0640"),
|
||||
}, false, "nvidia-driver-installer", map[string]string{
|
||||
}, false, "nvidia-driver-installer", "google", map[string]string{
|
||||
"NvidiaDriverInstaller": "minikube-nvidia-driver-installer:e2d9b43228decf5d6f7dce3f0a85d390f138fa01",
|
||||
"Pause": "pause:2.0@sha256:9ce5316f9752b8347484ab0f6778573af15524124d52b93230b9a0dcc987e73e",
|
||||
}, map[string]string{
|
||||
|
@ -413,7 +415,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"nvidia-gpu-device-plugin.yaml",
|
||||
"0640"),
|
||||
}, false, "nvidia-gpu-device-plugin", map[string]string{
|
||||
}, false, "nvidia-gpu-device-plugin", "", map[string]string{
|
||||
"NvidiaDevicePlugin": "nvidia/k8s-device-plugin:1.0.0-beta4@sha256:94d46bf513cbc43c4d77a364e4bbd409d32d89c8e686e12551cc3eb27c259b90",
|
||||
}, nil),
|
||||
"logviewer": NewAddon([]*BinAsset{
|
||||
|
@ -427,7 +429,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"logviewer-rbac.yaml",
|
||||
"0640"),
|
||||
}, false, "logviewer", map[string]string{
|
||||
}, false, "logviewer", "google", map[string]string{
|
||||
"LogViewer": "ivans3/minikube-log-viewer:latest@sha256:75854f45305cc47d17b04c6c588fa60777391761f951e3a34161ddf1f1b06405",
|
||||
}, nil),
|
||||
"gvisor": NewAddon([]*BinAsset{
|
||||
|
@ -446,7 +448,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestGvisorDir,
|
||||
constants.GvisorConfigTomlTargetName,
|
||||
"0640"),
|
||||
}, false, "gvisor", map[string]string{
|
||||
}, false, "gvisor", "google", map[string]string{
|
||||
"GvisorAddon": "k8s-minikube/gvisor-addon:3@sha256:23eb17d48a66fc2b09c31454fb54ecae520c3e9c9197ef17fcb398b4f31d505a",
|
||||
}, map[string]string{
|
||||
"GvisorAddon": "gcr.io",
|
||||
|
@ -467,7 +469,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"helm-tiller-svc.yaml",
|
||||
"0640"),
|
||||
}, false, "helm-tiller", map[string]string{
|
||||
}, false, "helm-tiller", "", map[string]string{
|
||||
"Tiller": "kubernetes-helm/tiller:v2.16.12@sha256:6003775d503546087266eda39418d221f9afb5ccfe35f637c32a1161619a3f9c",
|
||||
}, map[string]string{
|
||||
"Tiller": "gcr.io",
|
||||
|
@ -478,7 +480,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"ingress-dns-pod.yaml",
|
||||
"0640"),
|
||||
}, false, "ingress-dns", map[string]string{
|
||||
}, false, "ingress-dns", "", map[string]string{
|
||||
"IngressDNS": "cryptexlabs/minikube-ingress-dns:0.3.0@sha256:e252d2a4c704027342b303cc563e95d2e71d2a0f1404f55d676390e28d5093ab",
|
||||
}, nil),
|
||||
"metallb": NewAddon([]*BinAsset{
|
||||
|
@ -492,7 +494,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"metallb-config.yaml",
|
||||
"0640"),
|
||||
}, false, "metallb", map[string]string{
|
||||
}, false, "metallb", "", map[string]string{
|
||||
"Speaker": "metallb/speaker:v0.9.6@sha256:c66585a805bed1a3b829d8fb4a4aab9d87233497244ebff96f1b88f1e7f8f991",
|
||||
"Controller": "metallb/controller:v0.9.6@sha256:fbfdb9d3f55976b0ee38f3309d83a4ca703efcf15d6ca7889cd8189142286502",
|
||||
}, nil),
|
||||
|
@ -512,7 +514,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"ambassadorinstallation.yaml",
|
||||
"0640"),
|
||||
}, false, "ambassador", map[string]string{
|
||||
}, false, "ambassador", "", map[string]string{
|
||||
"AmbassadorOperator": "datawire/ambassador-operator:v1.2.3@sha256:492f33e0828a371aa23331d75c11c251b21499e31287f026269e3f6ec6da34ed",
|
||||
}, map[string]string{
|
||||
"AmbassadorOperator": "quay.io",
|
||||
|
@ -533,7 +535,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"gcp-auth-webhook.yaml",
|
||||
"0640"),
|
||||
}, false, "gcp-auth", map[string]string{
|
||||
}, false, "gcp-auth", "google", map[string]string{
|
||||
"KubeWebhookCertgen": "jettech/kube-webhook-certgen:v1.3.0@sha256:ff01fba91131ed260df3f3793009efbf9686f5a5ce78a85f81c386a4403f7689",
|
||||
"GCPAuthWebhook": "k8s-minikube/gcp-auth-webhook:v0.0.6@sha256:c407ad6ee97d8a0e8a21c713e2d9af66aaf73315e4a123874c00b786f962f3cd",
|
||||
}, map[string]string{
|
||||
|
@ -572,7 +574,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"volume-snapshot-controller-deployment.yaml",
|
||||
"0640"),
|
||||
}, false, "volumesnapshots", map[string]string{
|
||||
}, false, "volumesnapshots", "kubernetes", map[string]string{
|
||||
"SnapshotController": "sig-storage/snapshot-controller:v4.0.0@sha256:00fcc441ea9f72899c25eed61d602272a2a58c5f0014332bdcb5ac24acef08e4",
|
||||
}, map[string]string{
|
||||
"SnapshotController": "k8s.gcr.io",
|
||||
|
@ -643,7 +645,7 @@ var Addons = map[string]*Addon{
|
|||
vmpath.GuestAddonsDir,
|
||||
"csi-hostpath-storageclass.yaml",
|
||||
"0640"),
|
||||
}, false, "csi-hostpath-driver", map[string]string{
|
||||
}, false, "csi-hostpath-driver", "kubernetes", map[string]string{
|
||||
"Attacher": "sig-storage/csi-attacher:v3.1.0@sha256:50c3cfd458fc8e0bf3c8c521eac39172009382fc66dc5044a330d137c6ed0b09",
|
||||
"HostMonitorAgent": "sig-storage/csi-external-health-monitor-agent:v0.2.0@sha256:c20d4a4772599e68944452edfcecc944a1df28c19e94b942d526ca25a522ea02",
|
||||
"HostMonitorController": "sig-storage/csi-external-health-monitor-controller:v0.2.0@sha256:14988b598a180cc0282f3f4bc982371baf9a9c9b80878fb385f8ae8bd04ecf16",
|
||||
|
|
|
@ -143,6 +143,22 @@ func APIServerVersionMatch(client *kubernetes.Clientset, expected string) error
|
|||
return nil
|
||||
}
|
||||
|
||||
// WaitForAPIServerStatus waits for 'to' duration to get apiserver pod running or stopped
|
||||
// this functions is intended to use in situations where apiserver process can be recreated
|
||||
// by container runtime restart for example and there is a gap before it comes back
|
||||
func WaitForAPIServerStatus(cr command.Runner, to time.Duration, hostname string, port int) (state.State, error) {
|
||||
var st state.State
|
||||
err := wait.PollImmediate(200*time.Millisecond, to, func() (bool, error) {
|
||||
var err error
|
||||
st, err = APIServerStatus(cr, hostname, port)
|
||||
if st == state.Stopped {
|
||||
return false, nil
|
||||
}
|
||||
return true, err
|
||||
})
|
||||
return st, err
|
||||
}
|
||||
|
||||
// APIServerStatus returns apiserver status in libmachine style state.State
|
||||
func APIServerStatus(cr command.Runner, hostname string, port int) (state.State, error) {
|
||||
klog.Infof("Checking apiserver status ...")
|
||||
|
@ -207,7 +223,7 @@ func apiServerHealthz(hostname string, port int) (state.State, error) {
|
|||
return nil
|
||||
}
|
||||
|
||||
err = retry.Local(check, 5*time.Second)
|
||||
err = retry.Local(check, 15*time.Second)
|
||||
|
||||
// Don't propagate 'Stopped' upwards as an error message, as clients may interpret the err
|
||||
// as an inability to get status. We need it for retry.Local, however.
|
||||
|
|
|
@ -568,13 +568,13 @@ func (k *Bootstrapper) needsReconfigure(conf string, hostname string, port int,
|
|||
klog.Infof("needs reconfigure: configs differ:\n%s", rr.Output())
|
||||
return true
|
||||
}
|
||||
|
||||
st, err := kverify.APIServerStatus(k.c, hostname, port)
|
||||
// cruntime.Enable() may restart kube-apiserver but does not wait for it to return back
|
||||
apiStatusTimeout := 3000 * time.Millisecond
|
||||
st, err := kverify.WaitForAPIServerStatus(k.c, apiStatusTimeout, hostname, port)
|
||||
if err != nil {
|
||||
klog.Infof("needs reconfigure: apiserver error: %v", err)
|
||||
return true
|
||||
}
|
||||
|
||||
if st != state.Running {
|
||||
klog.Infof("needs reconfigure: apiserver in state %s", st)
|
||||
return true
|
||||
|
|
|
@ -47,12 +47,10 @@ func pause(cr cruntime.Manager, r command.Runner, namespaces []string) ([]string
|
|||
|
||||
// Disable the kubelet so it does not attempt to restart paused pods
|
||||
sm := sysinit.New(r)
|
||||
if err := sm.Disable("kubelet"); err != nil {
|
||||
return ids, errors.Wrap(err, "kubelet disable")
|
||||
}
|
||||
klog.Info("kubelet running: ", sm.Active("kubelet"))
|
||||
|
||||
if err := sm.Stop("kubelet"); err != nil {
|
||||
return ids, errors.Wrap(err, "kubelet stop")
|
||||
if err := sm.DisableNow("kubelet"); err != nil {
|
||||
return ids, errors.Wrap(err, "kubelet disable --now")
|
||||
}
|
||||
|
||||
ids, err := cr.ListContainers(cruntime.ListContainersOptions{State: cruntime.Running, Namespaces: namespaces})
|
||||
|
|
|
@ -114,6 +114,8 @@ const (
|
|||
|
||||
// TimeFormat is the format that should be used when outputting time
|
||||
TimeFormat = time.RFC1123
|
||||
// MaxResources is the value that can be passed into the memory and cpus flags to specify to use maximum resources
|
||||
MaxResources = "max"
|
||||
)
|
||||
|
||||
var (
|
||||
|
|
|
@ -49,7 +49,6 @@ const (
|
|||
containerdConfigTemplate = `root = "/var/lib/containerd"
|
||||
state = "/run/containerd"
|
||||
oom_score = 0
|
||||
|
||||
[grpc]
|
||||
address = "/run/containerd/containerd.sock"
|
||||
uid = 0
|
||||
|
@ -79,16 +78,21 @@ oom_score = 0
|
|||
enable_selinux = false
|
||||
sandbox_image = "{{ .PodInfraContainerImage }}"
|
||||
stats_collect_period = 10
|
||||
systemd_cgroup = {{ .SystemdCgroup }}
|
||||
enable_tls_streaming = false
|
||||
max_container_log_line_size = 16384
|
||||
|
||||
[plugins."io.containerd.grpc.v1.cri"]
|
||||
[plugins."io.containerd.grpc.v1.cri".containerd]
|
||||
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
|
||||
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
|
||||
runtime_type = "io.containerd.runc.v2"
|
||||
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
|
||||
SystemdCgroup = {{ .SystemdCgroup }}
|
||||
|
||||
[plugins.cri.containerd]
|
||||
snapshotter = "overlayfs"
|
||||
no_pivot = true
|
||||
[plugins.cri.containerd.default_runtime]
|
||||
runtime_type = "io.containerd.runtime.v1.linux"
|
||||
runtime_engine = ""
|
||||
runtime_root = ""
|
||||
runtime_type = "io.containerd.runc.v2"
|
||||
[plugins.cri.containerd.untrusted_workload_runtime]
|
||||
runtime_type = ""
|
||||
runtime_engine = ""
|
||||
|
@ -107,12 +111,6 @@ oom_score = 0
|
|||
{{ end -}}
|
||||
[plugins.diff-service]
|
||||
default = ["walking"]
|
||||
[plugins.linux]
|
||||
shim = "containerd-shim"
|
||||
runtime = "runc"
|
||||
runtime_root = ""
|
||||
no_shim = false
|
||||
shim_debug = false
|
||||
[plugins.scheduler]
|
||||
pause_threshold = 0.02
|
||||
deletion_threshold = 0
|
||||
|
|
|
@ -163,6 +163,30 @@ type ListImagesOptions struct {
|
|||
// ErrContainerRuntimeNotRunning is thrown when container runtime is not running
|
||||
var ErrContainerRuntimeNotRunning = errors.New("container runtime is not running")
|
||||
|
||||
// ErrServiceVersion is the error returned when disk image has incompatible version of service
|
||||
type ErrServiceVersion struct {
|
||||
// Service is the name of the incompatible service
|
||||
Service string
|
||||
// Installed is the installed version of Service
|
||||
Installed string
|
||||
// Required is the minimum required version of Service
|
||||
Required string
|
||||
}
|
||||
|
||||
// NewErrServiceVersion creates a new ErrServiceVersion
|
||||
func NewErrServiceVersion(svc, required, installed string) *ErrServiceVersion {
|
||||
return &ErrServiceVersion{
|
||||
Service: svc,
|
||||
Installed: installed,
|
||||
Required: required,
|
||||
}
|
||||
}
|
||||
|
||||
func (e ErrServiceVersion) Error() string {
|
||||
return fmt.Sprintf("service %q version is %v. Required: %v",
|
||||
e.Service, e.Installed, e.Required)
|
||||
}
|
||||
|
||||
// New returns an appropriately configured runtime
|
||||
func New(c Config) (Manager, error) {
|
||||
sm := sysinit.New(c.Runner)
|
||||
|
@ -243,3 +267,29 @@ func disableOthers(me Manager, cr CommandRunner) error {
|
|||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var requiredContainerdVersion = semver.MustParse("1.4.0")
|
||||
|
||||
// compatibleWithVersion checks if current version of "runtime" is compatible with version "v"
|
||||
func compatibleWithVersion(runtime, v string) error {
|
||||
if runtime == "containerd" {
|
||||
vv, err := semver.Make(v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if requiredContainerdVersion.GT(vv) {
|
||||
return NewErrServiceVersion(runtime, requiredContainerdVersion.String(), vv.String())
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// CheckCompatibility checks if the container runtime managed by "cr" is compatible with current minikube code
|
||||
// returns: NewErrServiceVersion if not
|
||||
func CheckCompatibility(cr Manager) error {
|
||||
v, err := cr.Version()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Failed to check container runtime version")
|
||||
}
|
||||
return compatibleWithVersion(cr.Name(), v)
|
||||
}
|
||||
|
|
|
@ -77,6 +77,15 @@ func IsAmd64M1Emulation() bool {
|
|||
return runtime.GOARCH == "amd64" && strings.HasPrefix(cpuid.CPU.BrandName, "VirtualApple")
|
||||
}
|
||||
|
||||
// EffectiveArch return architecture to use in minikube VM/container
|
||||
// may differ from host arch
|
||||
func EffectiveArch() string {
|
||||
if IsAmd64M1Emulation() {
|
||||
return "arm64"
|
||||
}
|
||||
return runtime.GOARCH
|
||||
}
|
||||
|
||||
// MinikubeInstalledViaSnap returns true if the minikube binary path includes "snap".
|
||||
func MinikubeInstalledViaSnap() bool {
|
||||
ex, err := os.Executable()
|
||||
|
|
|
@ -22,6 +22,8 @@ import (
|
|||
"path"
|
||||
"runtime"
|
||||
|
||||
"k8s.io/minikube/pkg/minikube/detect"
|
||||
|
||||
"github.com/blang/semver"
|
||||
"github.com/pkg/errors"
|
||||
"k8s.io/klog/v2"
|
||||
|
@ -70,7 +72,7 @@ func Binary(binary, version, osName, archName string) (string, error) {
|
|||
return "", errors.Wrapf(err, "download failed: %s", url)
|
||||
}
|
||||
|
||||
if osName == runtime.GOOS && archName == runtime.GOARCH {
|
||||
if osName == runtime.GOOS && archName == detect.EffectiveArch() {
|
||||
if err = os.Chmod(targetFilepath, 0755); err != nil {
|
||||
return "", errors.Wrapf(err, "chmod +x %s", targetFilepath)
|
||||
}
|
||||
|
|
|
@ -17,6 +17,7 @@ limitations under the License.
|
|||
package download
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
|
@ -168,17 +169,43 @@ func ImageToCache(img string) error {
|
|||
}
|
||||
}
|
||||
|
||||
func parseImage(img string) (*name.Tag, name.Reference, error) {
|
||||
digest, err := name.NewDigest(img)
|
||||
if err == nil {
|
||||
tag := digest.Tag()
|
||||
return &tag, digest, nil
|
||||
}
|
||||
|
||||
_, ok := err.(*name.ErrBadName)
|
||||
if !ok {
|
||||
return nil, nil, errors.Wrap(err, "new ref")
|
||||
}
|
||||
// ErrBadName means img contains no digest
|
||||
// It happens if its value is name:tag for example.
|
||||
// In this case we want to give it a second chance and try to parse it one more time using name.NewTag(img)
|
||||
tag, err := name.NewTag(img)
|
||||
if err != nil {
|
||||
return nil, nil, errors.Wrap(err, "failed to parse image reference")
|
||||
}
|
||||
return &tag, tag, nil
|
||||
}
|
||||
|
||||
// CacheToDaemon loads image from tarball in the local cache directory to the local docker daemon
|
||||
func CacheToDaemon(img string) error {
|
||||
p := imagePathInCache(img)
|
||||
|
||||
ref, err := name.NewDigest(img)
|
||||
tag, ref, err := parseImage(img)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "new ref")
|
||||
return err
|
||||
}
|
||||
// do not use cache if image is set in format <name>:latest
|
||||
if _, ok := ref.(name.Tag); ok {
|
||||
if tag.Name() == "latest" {
|
||||
return fmt.Errorf("can't cache 'latest' tag")
|
||||
}
|
||||
}
|
||||
|
||||
tag := ref.Tag()
|
||||
i, err := tarball.ImageFromPath(p, &tag)
|
||||
i, err := tarball.ImageFromPath(p, tag)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "tarball")
|
||||
}
|
||||
|
|
|
@ -25,10 +25,10 @@ import (
|
|||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
|
||||
"cloud.google.com/go/storage"
|
||||
"google.golang.org/api/option"
|
||||
"k8s.io/minikube/pkg/minikube/detect"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"github.com/spf13/viper"
|
||||
|
@ -70,7 +70,8 @@ func TarballName(k8sVersion, containerRuntime string) string {
|
|||
} else {
|
||||
storageDriver = "overlay2"
|
||||
}
|
||||
return fmt.Sprintf("preloaded-images-k8s-%s-%s-%s-%s-%s.tar.lz4", PreloadVersion, k8sVersion, containerRuntime, storageDriver, runtime.GOARCH)
|
||||
arch := detect.EffectiveArch()
|
||||
return fmt.Sprintf("preloaded-images-k8s-%s-%s-%s-%s-%s.tar.lz4", PreloadVersion, k8sVersion, containerRuntime, storageDriver, arch)
|
||||
}
|
||||
|
||||
// returns the name of the checksum file
|
||||
|
|
|
@ -18,7 +18,6 @@ package machine
|
|||
|
||||
import (
|
||||
"path"
|
||||
"runtime"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"golang.org/x/sync/errgroup"
|
||||
|
@ -26,6 +25,7 @@ import (
|
|||
"k8s.io/minikube/pkg/minikube/assets"
|
||||
"k8s.io/minikube/pkg/minikube/bootstrapper"
|
||||
"k8s.io/minikube/pkg/minikube/command"
|
||||
"k8s.io/minikube/pkg/minikube/detect"
|
||||
"k8s.io/minikube/pkg/minikube/download"
|
||||
)
|
||||
|
||||
|
@ -53,7 +53,7 @@ func CacheBinariesForBootstrapper(version string, clusterBootstrapper string, ex
|
|||
}
|
||||
bin := bin // https://golang.org/doc/faq#closures_and_goroutines
|
||||
g.Go(func() error {
|
||||
if _, err := download.Binary(bin, version, "linux", runtime.GOARCH); err != nil {
|
||||
if _, err := download.Binary(bin, version, "linux", detect.EffectiveArch()); err != nil {
|
||||
return errors.Wrapf(err, "caching binary %s", bin)
|
||||
}
|
||||
return nil
|
||||
|
|
|
@ -17,11 +17,13 @@ limitations under the License.
|
|||
package node
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"k8s.io/minikube/pkg/drivers/kic/oci"
|
||||
"k8s.io/minikube/pkg/minikube/bootstrapper/kubeadm"
|
||||
"k8s.io/minikube/pkg/minikube/cruntime"
|
||||
"k8s.io/minikube/pkg/minikube/exit"
|
||||
"k8s.io/minikube/pkg/minikube/reason"
|
||||
"k8s.io/minikube/pkg/minikube/style"
|
||||
|
@ -62,4 +64,14 @@ func ExitIfFatal(err error) {
|
|||
Advice: "Ensure that your Docker mountpoints do not have the 'noexec' flag set",
|
||||
}, "The kubeadm binary within the Docker container is not executable")
|
||||
}
|
||||
|
||||
if rtErr, ok := err.(*cruntime.ErrServiceVersion); ok {
|
||||
exit.Message(reason.Kind{
|
||||
ID: "PROVIDER_INVALID_VERSION",
|
||||
ExitCode: reason.ExGuestConfig,
|
||||
Style: style.Unsupported,
|
||||
Advice: "Try to start minikube with '--delete-on-failure=true' option",
|
||||
}, fmt.Sprintf("Your existing minikube instance has version %s of service %v which is too old. "+
|
||||
"Please try to start minikube with --delete-on-failure=true option", rtErr.Installed, rtErr.Service))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,6 +22,8 @@ import (
|
|||
"runtime"
|
||||
"strings"
|
||||
|
||||
"k8s.io/minikube/pkg/minikube/detect"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"github.com/spf13/viper"
|
||||
"golang.org/x/sync/errgroup"
|
||||
|
@ -97,7 +99,7 @@ func CacheKubectlBinary(k8sVersion string) (string, error) {
|
|||
binary = "kubectl.exe"
|
||||
}
|
||||
|
||||
return download.Binary(binary, k8sVersion, runtime.GOOS, runtime.GOARCH)
|
||||
return download.Binary(binary, k8sVersion, runtime.GOOS, detect.EffectiveArch())
|
||||
}
|
||||
|
||||
// doCacheBinaries caches Kubernetes binaries in the foreground
|
||||
|
|
|
@ -82,7 +82,7 @@ func Add(cc *config.ClusterConfig, n config.Node, delOnFail bool) error {
|
|||
|
||||
// drainNode drains then deletes (removes) node from cluster.
|
||||
func drainNode(cc config.ClusterConfig, name string) (*config.Node, error) {
|
||||
n, index, err := Retrieve(cc, name)
|
||||
n, _, err := Retrieve(cc, name)
|
||||
if err != nil {
|
||||
return n, errors.Wrap(err, "retrieve")
|
||||
}
|
||||
|
@ -130,8 +130,7 @@ func drainNode(cc config.ClusterConfig, name string) (*config.Node, error) {
|
|||
}
|
||||
klog.Infof("successfully deleted node %q", name)
|
||||
|
||||
cc.Nodes = append(cc.Nodes[:index], cc.Nodes[index+1:]...)
|
||||
return n, config.SaveProfile(viper.GetString(config.ProfileName), &cc)
|
||||
return n, nil
|
||||
}
|
||||
|
||||
// Delete calls drainNode to remove node from cluster and deletes the host.
|
||||
|
@ -152,7 +151,13 @@ func Delete(cc config.ClusterConfig, name string) (*config.Node, error) {
|
|||
return n, err
|
||||
}
|
||||
|
||||
return n, nil
|
||||
_, index, err := Retrieve(cc, name)
|
||||
if err != nil {
|
||||
return n, errors.Wrap(err, "retrieve")
|
||||
}
|
||||
|
||||
cc.Nodes = append(cc.Nodes[:index], cc.Nodes[index+1:]...)
|
||||
return n, config.SaveProfile(viper.GetString(config.ProfileName), &cc)
|
||||
}
|
||||
|
||||
// Retrieve finds the node by name in the given cluster
|
||||
|
|
|
@ -97,6 +97,12 @@ func Start(starter Starter, apiServer bool) (*kubeconfig.Settings, error) {
|
|||
|
||||
// configure the runtime (docker, containerd, crio)
|
||||
cr := configureRuntimes(starter.Runner, *starter.Cfg, sv)
|
||||
|
||||
// check if installed runtime is compatible with current minikube code
|
||||
if err = cruntime.CheckCompatibility(cr); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
showVersionInfo(starter.Node.KubernetesVersion, cr)
|
||||
|
||||
// Add "host.minikube.internal" DNS alias (intentionally non-fatal)
|
||||
|
@ -353,7 +359,6 @@ func configureRuntimes(runner cruntime.CommandRunner, cc config.ClusterConfig, k
|
|||
if err != nil {
|
||||
exit.Error(reason.RuntimeEnable, "Failed to start container runtime", err)
|
||||
}
|
||||
|
||||
return cr
|
||||
}
|
||||
|
||||
|
|
|
@ -117,9 +117,11 @@ func (s *OpenRC) Disable(svc string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
// DisableNow not implemented for openRC
|
||||
// DisableNow does Disable + Stop
|
||||
func (s *OpenRC) DisableNow(svc string) error {
|
||||
return fmt.Errorf("disable now is not implemented for OpenRC! PRs to fix are welcomed")
|
||||
// supposed to do disable + stop
|
||||
// disable does nothing for OpenRC, so just Stop here
|
||||
return s.Stop(svc)
|
||||
}
|
||||
|
||||
// Mask does nothing
|
||||
|
@ -132,9 +134,11 @@ func (s *OpenRC) Enable(svc string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
// EnableNow not implemented for openRC
|
||||
// EnableNow does Enable + Start
|
||||
func (s *OpenRC) EnableNow(svc string) error {
|
||||
return fmt.Errorf("enable now is not implemented for OpenRC! PRs to fix are welcomed")
|
||||
// supposed to do enable + start
|
||||
// enable does nothing for OpenRC, so just Start here
|
||||
return s.Start(svc)
|
||||
}
|
||||
|
||||
// Unmask does nothing
|
||||
|
|
|
@ -50,7 +50,10 @@ func (s *Systemd) Active(svc string) bool {
|
|||
|
||||
// Disable disables a service
|
||||
func (s *Systemd) Disable(svc string) error {
|
||||
_, err := s.r.RunCmd(exec.Command("sudo", "systemctl", "disable", svc))
|
||||
cmd := exec.Command("sudo", "systemctl", "disable", svc)
|
||||
// See https://github.com/kubernetes/minikube/issues/11615#issuecomment-861794258
|
||||
cmd.Env = append(cmd.Env, "SYSTEMCTL_SKIP_SYSV=1")
|
||||
_, err := s.r.RunCmd(cmd)
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
|
@ -17,6 +17,11 @@ limitations under the License.
|
|||
package translate
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"sort"
|
||||
"testing"
|
||||
|
||||
"golang.org/x/text/language"
|
||||
|
@ -97,3 +102,81 @@ func TestT(t *testing.T) {
|
|||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestTranslationFilesValid(t *testing.T) {
|
||||
languageFiles, err := filepath.Glob("../../../translations/*.json")
|
||||
if err != nil {
|
||||
t.Fatalf("failed to get translation files: %v", err)
|
||||
}
|
||||
for _, filename := range languageFiles {
|
||||
lang := filepath.Base(filename)
|
||||
t.Run(lang, func(t *testing.T) {
|
||||
contents, err := os.ReadFile(filename)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to read file %s: %v", filename, err)
|
||||
}
|
||||
|
||||
// check if JSON is valid
|
||||
if valid := json.Valid(contents); !valid {
|
||||
t.Fatalf("%s does not contain valid json", filename)
|
||||
}
|
||||
|
||||
// convert file into map
|
||||
var entries map[string]string
|
||||
if err := json.Unmarshal(contents, &entries); err != nil {
|
||||
t.Fatalf("could not unmarshal file %s: %v", filename, err)
|
||||
}
|
||||
|
||||
// for each line
|
||||
for k, v := range entries {
|
||||
// if no translation, skip
|
||||
if v == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
// get all variables (ex. {{.name}})
|
||||
keyVariables := distinctVariables(k)
|
||||
valueVariables := distinctVariables(v)
|
||||
|
||||
// check if number of original string and translated variables match
|
||||
if len(keyVariables) != len(valueVariables) {
|
||||
t.Errorf("line %q: %q has mismatching number of variables\noriginal string variables: %s; translated variables: %s", k, v, keyVariables, valueVariables)
|
||||
continue
|
||||
}
|
||||
|
||||
// for each variable in the original string
|
||||
for i, keyVar := range keyVariables {
|
||||
// check if translated string has same variable
|
||||
if keyVar != valueVariables[i] {
|
||||
t.Errorf("line %q: %q has mismatching variables\noriginal string variables: %s do not match translated variables: %s", k, v, keyVariables, valueVariables)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func distinctVariables(line string) []string {
|
||||
re := regexp.MustCompile(`{{\..+?}}`)
|
||||
|
||||
// get all the variables from the string (possiible duplicates)
|
||||
variables := re.FindAllString(line, -1)
|
||||
distinctMap := make(map[string]bool)
|
||||
|
||||
// add them to a map to get distinct list of variables
|
||||
for _, variable := range variables {
|
||||
distinctMap[variable] = true
|
||||
}
|
||||
distinct := []string{}
|
||||
|
||||
// convert map into slice
|
||||
for k := range distinctMap {
|
||||
distinct = append(distinct, k)
|
||||
}
|
||||
|
||||
// sort the slice to make the comparison easier
|
||||
sort.Strings(distinct)
|
||||
|
||||
return distinct
|
||||
}
|
||||
|
|
|
@ -77,11 +77,52 @@ type Interface struct {
|
|||
IfaceMAC string
|
||||
}
|
||||
|
||||
// lookupInInterfaces iterates over all local network interfaces
|
||||
// and tries to match "ip" with associated networks
|
||||
// returns (network parameters, ip network, nil) if found
|
||||
// (nil, nil, nil) it nof
|
||||
// (nil, nil, error) if any error happened
|
||||
func lookupInInterfaces(ip net.IP) (*Parameters, *net.IPNet, error) {
|
||||
// check local network interfaces
|
||||
ifaces, err := net.Interfaces()
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("failed listing network interfaces: %w", err)
|
||||
}
|
||||
|
||||
for _, iface := range ifaces {
|
||||
|
||||
ifAddrs, err := iface.Addrs()
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("failed listing addresses of network interface %+v: %w", iface, err)
|
||||
}
|
||||
|
||||
for _, ifAddr := range ifAddrs {
|
||||
ifip, lan, err := net.ParseCIDR(ifAddr.String())
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("failed parsing network interface address %+v: %w", ifAddr, err)
|
||||
}
|
||||
if lan.Contains(ip) {
|
||||
ip4 := ifip.To4().String()
|
||||
rt := Parameters{
|
||||
Interface: Interface{
|
||||
IfaceName: iface.Name,
|
||||
IfaceIPv4: ip4,
|
||||
IfaceMTU: iface.MTU,
|
||||
IfaceMAC: iface.HardwareAddr.String(),
|
||||
},
|
||||
Gateway: ip4,
|
||||
}
|
||||
return &rt, lan, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil, nil, nil
|
||||
}
|
||||
|
||||
// inspect initialises IPv4 network parameters struct from given address addr.
|
||||
// addr can be single address (like "192.168.17.42"), network address (like "192.168.17.0") or in CIDR form (like "192.168.17.42/24 or "192.168.17.0/24").
|
||||
// If addr belongs to network of local network interface, parameters will also contain info about that network interface.
|
||||
func inspect(addr string) (*Parameters, error) {
|
||||
n := &Parameters{}
|
||||
|
||||
// extract ip from addr
|
||||
ip, network, err := net.ParseCIDR(addr)
|
||||
|
@ -92,31 +133,15 @@ func inspect(addr string) (*Parameters, error) {
|
|||
}
|
||||
}
|
||||
|
||||
// check local network interfaces
|
||||
ifaces, err := net.Interfaces()
|
||||
n := &Parameters{}
|
||||
|
||||
ifParams, ifNet, err := lookupInInterfaces(ip)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed listing network interfaces: %w", err)
|
||||
return nil, err
|
||||
}
|
||||
for _, iface := range ifaces {
|
||||
ifAddrs, err := iface.Addrs()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed listing addresses of network interface %+v: %w", iface, err)
|
||||
}
|
||||
for _, ifAddr := range ifAddrs {
|
||||
ifip, lan, err := net.ParseCIDR(ifAddr.String())
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed parsing network interface address %+v: %w", ifAddr, err)
|
||||
}
|
||||
if lan.Contains(ip) {
|
||||
n.IfaceName = iface.Name
|
||||
n.IfaceIPv4 = ifip.To4().String()
|
||||
n.IfaceMTU = iface.MTU
|
||||
n.IfaceMAC = iface.HardwareAddr.String()
|
||||
n.Gateway = n.IfaceIPv4
|
||||
network = lan
|
||||
break
|
||||
}
|
||||
}
|
||||
if ifNet != nil {
|
||||
network = ifNet
|
||||
n = ifParams
|
||||
}
|
||||
|
||||
// couldn't determine network parameters from addr nor from network interfaces
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
title: "v1.21.0 Benchmark"
|
||||
linkTitle: "v1.21.0 Benchmark"
|
||||
weight: 1
|
||||
---
|
||||
|
||||
![time-to-k8s](/images/benchmarks/timeToK8s/v1.21.0.png)
|
|
@ -26,11 +26,11 @@ minikube start [flags]
|
|||
--apiserver-names strings A set of apiserver names which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine
|
||||
--apiserver-port int The apiserver listening port (default 8443)
|
||||
--auto-update-drivers If set, automatically updates drivers to the latest version. Defaults to true. (default true)
|
||||
--base-image string The base image to use for docker/podman drivers. Intended for local development. (default "gcr.io/k8s-minikube/kicbase:v0.0.23@sha256:baf6d94b2050bcbecd98994e265cf965a4f4768978620ccf5227a6dcb75ade45")
|
||||
--base-image string The base image to use for docker/podman drivers. Intended for local development. (default "gcr.io/k8s-minikube/kicbase:v0.0.24@sha256:ba324e0dc025040a8ea6b883d008ec4a43a47db106fb59ac7446982c20c2cdc5")
|
||||
--cache-images If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none. (default true)
|
||||
--cni string CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)
|
||||
--container-runtime string The container runtime to be used (docker, cri-o, containerd). (default "docker")
|
||||
--cpus int Number of CPUs allocated to Kubernetes. (default 2)
|
||||
--cpus string Number of CPUs allocated to Kubernetes. Use "max" to use the maximum number of CPUs. (default "2")
|
||||
--cri-socket string The cri socket path to be used.
|
||||
--delete-on-failure If set, delete the current cluster if start fails and try again. Defaults to false.
|
||||
--disable-driver-mounts Disables the filesystem mounts provided by the hypervisors
|
||||
|
@ -64,7 +64,7 @@ minikube start [flags]
|
|||
--insecure-registry strings Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.
|
||||
--install-addons If set, install addons. Defaults to true. (default true)
|
||||
--interactive Allow user prompts for more information (default true)
|
||||
--iso-url strings Locations to fetch the minikube ISO from. (default [https://storage.googleapis.com/minikube/iso/minikube-v1.21.0.iso,https://github.com/kubernetes/minikube/releases/download/v1.21.0/minikube-v1.21.0.iso,https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.21.0.iso])
|
||||
--iso-url strings Locations to fetch the minikube ISO from. (default [https://storage.googleapis.com/minikube/iso/minikube-v1.22.0-beta.0.iso,https://github.com/kubernetes/minikube/releases/download/v1.22.0-beta.0/minikube-v1.22.0-beta.0.iso,https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.22.0-beta.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.7, 'latest' for v1.22.0-alpha.2). Defaults to 'stable'.
|
||||
--kvm-gpu Enable experimental NVIDIA GPU support in minikube
|
||||
|
@ -73,7 +73,7 @@ minikube start [flags]
|
|||
--kvm-numa-count int Simulate numa node count in minikube, supported numa node count range is 1-8 (kvm2 driver only) (default 1)
|
||||
--kvm-qemu-uri string The KVM QEMU connection URI. (kvm2 driver only) (default "qemu:///system")
|
||||
--listen-address string IP Address to use to expose ports (docker and podman driver only)
|
||||
--memory string Amount of RAM to allocate to Kubernetes (format: <number>[<unit>], where unit = b, k, m or g).
|
||||
--memory string Amount of RAM to allocate to Kubernetes (format: <number>[<unit>], where unit = b, k, m or g). Use "max" to use the maximum amount of memory.
|
||||
--mount This will start the mount daemon and automatically mount files into minikube.
|
||||
--mount-string string The argument to pass the minikube mount command on start.
|
||||
--namespace string The named space to activate after start (default "default")
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
---
|
||||
title: "Integration Test Flake Rates"
|
||||
description: >
|
||||
Charts to visualize flake rates of all integration tests, split by environment
|
||||
---
|
||||
## Flake rate charts by Environment
|
||||
|
||||
|OS|Driver|ContainerRuntime|Link|
|
||||
|---|---|---|---|
|
||||
|Linux|docker|docker|[Docker_Linux](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=Docker_Linux)|
|
||||
|Linux|docker|containerd|[Docker_Linux_containerd](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=Docker_Linux_containerd)|
|
||||
|Linux|docker|crio|[Docker_Linux_crio](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=Docker_Linux_crio)|
|
||||
|Linux - arm64|docker|crio|[Docker_Linux_crio_arm64](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=Docker_Linux_crio_arm64)|
|
||||
|Linux - arm64|docker|docker|[Docker_Linux_docker_arm64](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=Docker_Linux_docker_arm64)|
|
||||
|Linux|kvm2|docker|[KVM_Linux](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=KVM_Linux)|
|
||||
|Linux|kvm2|containerd|[KVM_Linux_containerd](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=KVM_Linux_containerd)|
|
||||
|Linux|kvm2|crio|[KVM_Linux_crio](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=KVM_Linux_crio)|
|
||||
|Linux|virtualbox|docker|[VirtualBox_Linux](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=VirtualBox_Linux)|
|
||||
|Linux|none|docker|[none_Linux](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=none_Linux)|
|
||||
|MacOS|docker|docker|[Docker_macOS](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=Docker_macOS)|
|
||||
|MacOS|hyperkit|docker|[Hyperkit_macOS](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=Hyperkit_macOS)|
|
||||
|Windows|docker|docker|[Docker_Windows](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=Docker_Windows)|
|
|
@ -260,6 +260,9 @@ tests the minikube node stop command
|
|||
#### validateStartNodeAfterStop
|
||||
tests the minikube node start command on an existing stopped node
|
||||
|
||||
#### validateRestartKeepsNodes
|
||||
restarts minikube cluster and checks if the reported node list is unchanged
|
||||
|
||||
#### validateStopMultiNodeCluster
|
||||
runs minikube stop on a multinode cluster
|
||||
|
||||
|
|
|
@ -105,3 +105,9 @@ For the docker and podman driver, use `--listen-address` flag:
|
|||
minikube start --listen-address=0.0.0.0
|
||||
```
|
||||
|
||||
## How can I allocate maximum resources to minikube?
|
||||
|
||||
Setting the `memory` and `cpus` flags on the start command to `max` will use maximum available resources:
|
||||
```
|
||||
minikube start --memory=max --cpus=max
|
||||
```
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
|
@ -114,7 +114,7 @@ func validateContainerdSystemd(ctx context.Context, t *testing.T, profile string
|
|||
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") {
|
||||
if !strings.Contains(rr.Output(), "SystemdCgroup = true") {
|
||||
t.Fatalf("expected systemd cgroup driver, got: %v", rr.Output())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1468,59 +1468,6 @@ func validateSSHCmd(ctx context.Context, t *testing.T, profile string) {
|
|||
}
|
||||
}
|
||||
|
||||
// cpTestMinikubePath is where the test file will be located in the Minikube instance
|
||||
func cpTestMinikubePath() string {
|
||||
return "/home/docker/cp-test.txt"
|
||||
}
|
||||
|
||||
// cpTestLocalPath is where the test file located in host os
|
||||
func cpTestLocalPath() string {
|
||||
return filepath.Join(*testdataDir, "cp-test.txt")
|
||||
}
|
||||
|
||||
func testCpCmd(ctx context.Context, t *testing.T, profile string, node string) {
|
||||
srcPath := cpTestLocalPath()
|
||||
dstPath := cpTestMinikubePath()
|
||||
|
||||
cpArgv := []string{"-p", profile, "cp", srcPath}
|
||||
if node == "" {
|
||||
cpArgv = append(cpArgv, dstPath)
|
||||
} else {
|
||||
cpArgv = append(cpArgv, fmt.Sprintf("%s:%s", node, dstPath))
|
||||
}
|
||||
|
||||
rr, err := Run(t, exec.CommandContext(ctx, Target(), cpArgv...))
|
||||
if ctx.Err() == context.DeadlineExceeded {
|
||||
t.Errorf("failed to run command by deadline. exceeded timeout : %s", rr.Command())
|
||||
}
|
||||
if err != nil {
|
||||
t.Errorf("failed to run an cp command. args %q : %v", rr.Command(), err)
|
||||
}
|
||||
|
||||
sshArgv := []string{"-p", profile, "ssh"}
|
||||
if node != "" {
|
||||
sshArgv = append(sshArgv, "-n", node)
|
||||
}
|
||||
sshArgv = append(sshArgv, fmt.Sprintf("sudo cat %s", dstPath))
|
||||
|
||||
rr, err = Run(t, exec.CommandContext(ctx, Target(), sshArgv...))
|
||||
if ctx.Err() == context.DeadlineExceeded {
|
||||
t.Errorf("failed to run command by deadline. exceeded timeout : %s", rr.Command())
|
||||
}
|
||||
if err != nil {
|
||||
t.Errorf("failed to run an cp command. args %q : %v", rr.Command(), err)
|
||||
}
|
||||
|
||||
expected, err := ioutil.ReadFile(srcPath)
|
||||
if err != nil {
|
||||
t.Errorf("failed to read test file 'testdata/cp-test.txt' : %v", err)
|
||||
}
|
||||
|
||||
if diff := cmp.Diff(string(expected), rr.Stdout.String()); diff != "" {
|
||||
t.Errorf("/testdata/cp-test.txt content mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
}
|
||||
|
||||
// validateCpCmd asserts basic "cp" command functionality
|
||||
func validateCpCmd(ctx context.Context, t *testing.T, profile string) {
|
||||
if NoneDriver() {
|
||||
|
|
|
@ -29,12 +29,14 @@ import (
|
|||
"fmt"
|
||||
"io/ioutil"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/docker/machine/libmachine/state"
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/shirou/gopsutil/v3/process"
|
||||
core "k8s.io/api/core/v1"
|
||||
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
|
@ -501,3 +503,57 @@ func killProcessFamily(t *testing.T, pid int) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// cpTestMinikubePath is where the test file will be located in the Minikube instance
|
||||
func cpTestMinikubePath() string {
|
||||
return "/home/docker/cp-test.txt"
|
||||
}
|
||||
|
||||
// cpTestLocalPath is where the test file located in host os
|
||||
func cpTestLocalPath() string {
|
||||
return filepath.Join(*testdataDir, "cp-test.txt")
|
||||
}
|
||||
|
||||
// testCpCmd ensures copy functionality into minikube instance.
|
||||
func testCpCmd(ctx context.Context, t *testing.T, profile string, node string) {
|
||||
srcPath := cpTestLocalPath()
|
||||
dstPath := cpTestMinikubePath()
|
||||
|
||||
cpArgv := []string{"-p", profile, "cp", srcPath}
|
||||
if node == "" {
|
||||
cpArgv = append(cpArgv, dstPath)
|
||||
} else {
|
||||
cpArgv = append(cpArgv, fmt.Sprintf("%s:%s", node, dstPath))
|
||||
}
|
||||
|
||||
rr, err := Run(t, exec.CommandContext(ctx, Target(), cpArgv...))
|
||||
if ctx.Err() == context.DeadlineExceeded {
|
||||
t.Errorf("failed to run command by deadline. exceeded timeout : %s", rr.Command())
|
||||
}
|
||||
if err != nil {
|
||||
t.Errorf("failed to run an cp command. args %q : %v", rr.Command(), err)
|
||||
}
|
||||
|
||||
sshArgv := []string{"-p", profile, "ssh"}
|
||||
if node != "" {
|
||||
sshArgv = append(sshArgv, "-n", node)
|
||||
}
|
||||
sshArgv = append(sshArgv, fmt.Sprintf("sudo cat %s", dstPath))
|
||||
|
||||
rr, err = Run(t, exec.CommandContext(ctx, Target(), sshArgv...))
|
||||
if ctx.Err() == context.DeadlineExceeded {
|
||||
t.Errorf("failed to run command by deadline. exceeded timeout : %s", rr.Command())
|
||||
}
|
||||
if err != nil {
|
||||
t.Errorf("failed to run an cp command. args %q : %v", rr.Command(), err)
|
||||
}
|
||||
|
||||
expected, err := ioutil.ReadFile(srcPath)
|
||||
if err != nil {
|
||||
t.Errorf("failed to read test file 'testdata/cp-test.txt' : %v", err)
|
||||
}
|
||||
|
||||
if diff := cmp.Diff(string(expected), rr.Stdout.String()); diff != "" {
|
||||
t.Errorf("/testdata/cp-test.txt content mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -97,6 +97,11 @@ func setMaxParallelism() {
|
|||
// Each "minikube start" consumes up to 2 cores, though the average usage is somewhat lower
|
||||
limit := int(math.Floor(float64(maxp) / 1.75))
|
||||
|
||||
// Windows tests were failing from timeouts due to too much parallelism
|
||||
if runtime.GOOS == "windows" {
|
||||
limit /= 2
|
||||
}
|
||||
|
||||
fmt.Fprintf(os.Stderr, "Found %d cores, limiting parallelism with --test.parallel=%d\n", maxp, limit)
|
||||
if err := flag.Set("test.parallel", strconv.Itoa(limit)); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Unable to set test.parallel: %v\n", err)
|
||||
|
|
|
@ -55,6 +55,7 @@ func TestMultiNode(t *testing.T) {
|
|||
{"CopyFile", validateCopyFileWithMultiNode},
|
||||
{"StopNode", validateStopRunningNode},
|
||||
{"StartAfterStop", validateStartNodeAfterStop},
|
||||
{"RestartKeepsNodes", validateRestartKeepsNodes},
|
||||
{"DeleteNode", validateDeleteNodeFromMultiNode},
|
||||
{"StopMultiNode", validateStopMultiNodeCluster},
|
||||
{"RestartMultiNode", validateRestartMultiNodeCluster},
|
||||
|
@ -258,6 +259,36 @@ func validateStartNodeAfterStop(ctx context.Context, t *testing.T, profile strin
|
|||
}
|
||||
}
|
||||
|
||||
// validateRestartKeepsNodes restarts minikube cluster and checks if the reported node list is unchanged
|
||||
func validateRestartKeepsNodes(ctx context.Context, t *testing.T, profile string) {
|
||||
rr, err := Run(t, exec.CommandContext(ctx, Target(), "node", "list", "-p", profile))
|
||||
if err != nil {
|
||||
t.Errorf("failed to run node list. args %q : %v", rr.Command(), err)
|
||||
}
|
||||
|
||||
nodeList := rr.Stdout.String()
|
||||
|
||||
_, err = Run(t, exec.CommandContext(ctx, Target(), "stop", "-p", profile))
|
||||
if err != nil {
|
||||
t.Errorf("failed to run minikube stop. args %q : %v", rr.Command(), err)
|
||||
}
|
||||
|
||||
_, err = Run(t, exec.CommandContext(ctx, Target(), "start", "-p", profile, "--wait=true", "-v=8", "--alsologtostderr"))
|
||||
if err != nil {
|
||||
t.Errorf("failed to run minikube start. args %q : %v", rr.Command(), err)
|
||||
}
|
||||
|
||||
rr, err = Run(t, exec.CommandContext(ctx, Target(), "node", "list", "-p", profile))
|
||||
if err != nil {
|
||||
t.Errorf("failed to run node list. args %q : %v", rr.Command(), err)
|
||||
}
|
||||
|
||||
restartedNodeList := rr.Stdout.String()
|
||||
if nodeList != restartedNodeList {
|
||||
t.Fatalf("reported node list is not the same after restart. Before restart: %s\nAfter restart: %s", nodeList, restartedNodeList)
|
||||
}
|
||||
}
|
||||
|
||||
// validateStopMultiNodeCluster runs minikube stop on a multinode cluster
|
||||
func validateStopMultiNodeCluster(ctx context.Context, t *testing.T, profile string) {
|
||||
// Run minikube stop on the cluster
|
||||
|
|
|
@ -87,6 +87,11 @@ func TestRunningBinaryUpgrade(t *testing.T) {
|
|||
legacyVersion = "v1.9.0"
|
||||
}
|
||||
}
|
||||
// the version containerd in ISO was upgraded to 1.4.2
|
||||
// we need it to use runc.v2 plugin
|
||||
if ContainerRuntime() == "containerd" {
|
||||
legacyVersion = "v1.16.0"
|
||||
}
|
||||
|
||||
tf, err := installRelease(legacyVersion)
|
||||
if err != nil {
|
||||
|
@ -98,7 +103,7 @@ func TestRunningBinaryUpgrade(t *testing.T) {
|
|||
rr := &RunResult{}
|
||||
r := func() error {
|
||||
c := exec.CommandContext(ctx, tf.Name(), args...)
|
||||
legacyEnv := []string{}
|
||||
var 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
|
||||
|
@ -155,8 +160,16 @@ func TestStoppedBinaryUpgrade(t *testing.T) {
|
|||
if arm64Platform() {
|
||||
// first release with non-experimental arm64 KIC
|
||||
legacyVersion = "v1.17.0"
|
||||
} else {
|
||||
// v1.8.0 would be selected, but: https://github.com/kubernetes/minikube/issues/8740
|
||||
legacyVersion = "v1.9.0"
|
||||
}
|
||||
}
|
||||
if ContainerRuntime() == "containerd" {
|
||||
// the version containerd in ISO was upgraded to 1.4.2
|
||||
// we need it to use runc.v2 plugin
|
||||
legacyVersion = "v1.16.0"
|
||||
}
|
||||
|
||||
tf, err := installRelease(legacyVersion)
|
||||
if err != nil {
|
||||
|
@ -168,7 +181,7 @@ func TestStoppedBinaryUpgrade(t *testing.T) {
|
|||
rr := &RunResult{}
|
||||
r := func() error {
|
||||
c := exec.CommandContext(ctx, tf.Name(), args...)
|
||||
legacyEnv := []string{}
|
||||
var 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
|
||||
|
|
|
@ -51,7 +51,6 @@
|
|||
"Allow user prompts for more information": "",
|
||||
"Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. Set it to \\\"auto\\\" to let minikube decide one for you. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers": "Alternatives Bild-Repository zum Abrufen von Docker-Images. Dies ist hilfreich, wenn Sie nur eingeschränkten Zugriff auf gcr.io haben. Stellen Sie \\\"auto\\\" ein, dann wählt minikube eins für sie aus. Nutzer vom chinesischen Festland können einen lokalen gcr.io-Mirror wie registry.cn-hangzhou.aliyuncs.com/google_containers verwenden.",
|
||||
"Amount of RAM allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g)": "Größe des der minikube-VM zugewiesenen Arbeitsspeichers (Format: \u003cNummer\u003e [\u003cEinheit\u003e], wobei Einheit = b, k, m oder g)",
|
||||
"Amount of RAM to allocate to Kubernetes (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "",
|
||||
"Amount of time to wait for a service in seconds": "",
|
||||
"Amount of time to wait for service in seconds": "",
|
||||
"Another hypervisor, such as VirtualBox, is conflicting with KVM. Please stop the other hypervisor, or use --driver to switch to it.": "",
|
||||
|
@ -252,7 +251,7 @@
|
|||
"Failed to save config {{.profile}}": "",
|
||||
"Failed to save dir": "",
|
||||
"Failed to save stdin": "",
|
||||
"Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}": "NO_PROXY Env konnte nicht festgelegt werden. Benutzen Sie `export NO_PROXY = $ NO_PROXY, {{. Ip}}",
|
||||
"Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}": "NO_PROXY Env konnte nicht festgelegt werden. Benutzen Sie `export NO_PROXY = $ NO_PROXY, {{.ip}}",
|
||||
"Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}`.": "",
|
||||
"Failed to setup certs": "",
|
||||
"Failed to start container runtime": "",
|
||||
|
@ -260,7 +259,6 @@
|
|||
"Failed to stop node {{.name}}": "",
|
||||
"Failed to update cluster": "",
|
||||
"Failed to update config": "",
|
||||
"Failed to verify '{{.driver_name}} info' will try again ...": "",
|
||||
"Failed unmount: {{.error}}": "",
|
||||
"File permissions used for the mount": "",
|
||||
"Filter to use only VM Drivers": "",
|
||||
|
@ -395,7 +393,6 @@
|
|||
"None of the known repositories is accessible. Consider specifying an alternative image repository with --image-repository flag": "Keines der bekannten Repositories ist zugänglich. Erwägen Sie, ein alternatives Image-Repository mit der Kennzeichnung --image-repository anzugeben",
|
||||
"Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "",
|
||||
"Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "",
|
||||
"Number of CPUs allocated to Kubernetes.": "",
|
||||
"Number of CPUs allocated to the minikube VM": "Anzahl der CPUs, die der minikube-VM zugeordnet sind",
|
||||
"Number of lines back to go within the log": "",
|
||||
"OS release is {{.pretty_name}}": "",
|
||||
|
@ -576,7 +573,7 @@
|
|||
"Target directory {{.path}} must be an absolute path": "",
|
||||
"Target {{.path}} can not be empty": "",
|
||||
"Test docs have been saved at - {{.path}}": "",
|
||||
"The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo minikube --vm-driver={{.driver_name}}": "Der Treiber \"{{.driver_name}}\" benötigt Root-Rechte. Führen Sie minikube aus mit 'sudo minikube --vm-driver = {{. Driver_name}}.",
|
||||
"The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo minikube --vm-driver={{.driver_name}}": "Der Treiber \"{{.driver_name}}\" benötigt Root-Rechte. Führen Sie minikube aus mit 'sudo minikube --vm-driver = {{.driver_name}}.",
|
||||
"The \"{{.driver_name}}\" driver should not be used with root privileges.": "",
|
||||
"The \"{{.name}}\" cluster has been deleted.": "Der Cluster \"{{.name}}\" wurde gelöscht.",
|
||||
"The \"{{.name}}\" cluster has been deleted.__1": "Der Cluster \"{{.name}}\" wurde gelöscht.",
|
||||
|
@ -700,6 +697,7 @@
|
|||
"Unable to find control plane": "",
|
||||
"Unable to generate docs": "",
|
||||
"Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "",
|
||||
"Unable to get CPU info: {{.err}}": "",
|
||||
"Unable to get bootstrapper: {{.error}}": "Bootstrapper kann nicht abgerufen werden: {{.error}}",
|
||||
"Unable to get command runner": "",
|
||||
"Unable to get control plane status: {{.error}}": "",
|
||||
|
@ -714,7 +712,7 @@
|
|||
"Unable to load config: {{.error}}": "Konfig kann nicht geladen werden: {{.error}}",
|
||||
"Unable to load host": "",
|
||||
"Unable to load profile: {{.error}}": "",
|
||||
"Unable to parse \"{{.kubernetes_version}}\": {{.error}}": "\"{{.Kubernetes_version}}\" kann nicht geparst werden: {{.error}}",
|
||||
"Unable to parse \"{{.kubernetes_version}}\": {{.error}}": "\"{{.kubernetes_version}}\" kann nicht geparst werden: {{.error}}",
|
||||
"Unable to parse default Kubernetes version from constants: {{.error}}": "",
|
||||
"Unable to parse memory '{{.memory}}': {{.error}}": "",
|
||||
"Unable to parse oldest Kubernetes version from constants: {{.error}}": "",
|
||||
|
@ -792,7 +790,7 @@
|
|||
"With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "",
|
||||
"You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "",
|
||||
"You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}). Please see {{.documentation_url}} for more details": "Sie scheinen einen Proxy zu verwenden, aber Ihre NO_PROXY-Umgebung enthält keine minikube-IP ({{.ip_address}}). Weitere Informationen finden Sie unter {{.documentation_url}}",
|
||||
"You are trying to run amd64 binary on M1 system. Please use darwin/arm64 binary instead (Download at {{.url}}.)": "",
|
||||
"You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)": "",
|
||||
"You are trying to run windows .exe binary inside WSL, for better integration please use Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "",
|
||||
"You can delete them using the following command(s): ": "",
|
||||
"You can force an unsupported Kubernetes version via the --force flag": "",
|
||||
|
@ -817,7 +815,7 @@
|
|||
"addon '{{.name}}' is not a valid addon packaged with minikube.\nTo see the list of available addons run:\nminikube addons list": "",
|
||||
"addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "",
|
||||
"auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.": "",
|
||||
"auto-pause currently is only supported on docker runtime and amd64. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "",
|
||||
"auto-pause currently is only supported on docker runtime. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "",
|
||||
"bash completion failed": "",
|
||||
"bash completion.": "",
|
||||
"call with cleanup=true to remove old tunnels": "",
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
"\"{{.context}}\" context has been updated to point to {{.hostname}}:{{.port}}": "El contexto \"{{.context}}\" ha sido actualizado para apuntar a {{.hostname}}:{{.port}}",
|
||||
"\"{{.machineName}}\" does not exist, nothing to stop": "\"{{.machineName}}\" no existe, nada para detener.",
|
||||
"\"{{.name}}\" profile does not exist": "El perfil \"{{.name}}\" no existe.",
|
||||
"\"{{.name}}\" profile does not exist, trying anyways.": "El perfil \"{.name}\" no existe, intentando de todas formas.",
|
||||
"\"{{.name}}\" profile does not exist, trying anyways.": "El perfil \"{{.name}}\" no existe, intentando de todas formas.",
|
||||
"'none' driver does not support 'minikube docker-env' command": "El controlador 'none' no soporta el comando 'minikube docker-env'.",
|
||||
"'none' driver does not support 'minikube mount' command": "El driver 'none' no soporta el comando 'minikube mount'.",
|
||||
"'none' driver does not support 'minikube podman-env' command": "El controlador 'none' no soporta el comando 'minikube podman-env'.",
|
||||
|
@ -40,7 +40,7 @@
|
|||
"Add machine IP to NO_PROXY environment variable": "Agregar una IP de máquina a la variable de entorno NO_PROXY",
|
||||
"Add, delete, or push a local image into minikube": "Agrega, elimina, o empuja una imagen local dentro de minikube, haciendo (add, delete, push) respectivamente.",
|
||||
"Add, remove, or list additional nodes": "Usa (add, remove, list) para agregar, eliminar o listar nodos adicionales.",
|
||||
"Adding node {{.name}} to cluster {{.cluster}}": "Agregando el nodo {{.name}} al cluster.",
|
||||
"Adding node {{.name}} to cluster {{.cluster}}": "Agregando el nodo {{.name}} al cluster {{.cluster}}.",
|
||||
"Additional help topics": "Temas de ayuda adicionales",
|
||||
"Additional mount options, such as cache=fscache": "Opciones de montaje adicionales, por ejemplo cache=fscache",
|
||||
"Adds a node to the given cluster config, and starts it.": "Agrega un nodo a la configuración de cluster dada e iniciarlo.",
|
||||
|
@ -52,7 +52,6 @@
|
|||
"Allow user prompts for more information": "Permitir que el usuario solicite más información",
|
||||
"Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. Set it to \\\"auto\\\" to let minikube decide one for you. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers": "Repositorio de imágenes alternativo del que extraer imágenes de Docker. Puedes usarlo cuando tengas acceso limitado a gcr.io. Si quieres que minikube elija uno por ti, solo tienes que definir el valor como \"auto\". Los usuarios de China continental pueden utilizar réplicas locales de gcr.io, como registry.cn-hangzhou.aliyuncs.com/google_containers",
|
||||
"Amount of RAM allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g)": "Cantidad de RAM asignada a la VM de minikube (formato: \u003cnúmero\u003e[\u003cunidad\u003e], donde unidad = b, k, m o g)",
|
||||
"Amount of RAM to allocate to Kubernetes (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "",
|
||||
"Amount of time to wait for a service in seconds": "Cantidad de tiempo para esperar por un servicio en segundos",
|
||||
"Amount of time to wait for service in seconds": "Cantidad de tiempo para esperar un servicio en segundos",
|
||||
"Another hypervisor, such as VirtualBox, is conflicting with KVM. Please stop the other hypervisor, or use --driver to switch to it.": "Otro hipervisor, por ejemplo VirtualBox, está en conflicto con KVM. Por favor detén el otro hipervisor, o usa --driver para cambiarlo.",
|
||||
|
@ -265,7 +264,6 @@
|
|||
"Failed to stop node {{.name}}": "",
|
||||
"Failed to update cluster": "",
|
||||
"Failed to update config": "",
|
||||
"Failed to verify '{{.driver_name}} info' will try again ...": "",
|
||||
"Failed unmount: {{.error}}": "",
|
||||
"File permissions used for the mount": "",
|
||||
"Filter to use only VM Drivers": "",
|
||||
|
@ -400,7 +398,6 @@
|
|||
"None of the known repositories is accessible. Consider specifying an alternative image repository with --image-repository flag": "No se puede acceder a ninguno de los repositorios conocidos. Plantéate indicar un repositorio de imágenes alternativo con la marca --image-repository.",
|
||||
"Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "",
|
||||
"Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "",
|
||||
"Number of CPUs allocated to Kubernetes.": "",
|
||||
"Number of CPUs allocated to the minikube VM": "Número de CPU asignadas a la VM de minikube",
|
||||
"Number of lines back to go within the log": "",
|
||||
"OS release is {{.pretty_name}}": "",
|
||||
|
@ -705,6 +702,7 @@
|
|||
"Unable to find control plane": "",
|
||||
"Unable to generate docs": "",
|
||||
"Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "",
|
||||
"Unable to get CPU info: {{.err}}": "",
|
||||
"Unable to get bootstrapper: {{.error}}": "No se ha podido obtener el programa previo: {{.error}}",
|
||||
"Unable to get command runner": "",
|
||||
"Unable to get control plane status: {{.error}}": "",
|
||||
|
@ -797,7 +795,7 @@
|
|||
"With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "",
|
||||
"You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "",
|
||||
"You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}). Please see {{.documentation_url}} for more details": "Parece que estás usando un proxy, pero tu entorno NO_PROXY no incluye la dirección IP de minikube ({{.ip_address}}). Consulta {{.documentation_url}} para obtener más información",
|
||||
"You are trying to run amd64 binary on M1 system. Please use darwin/arm64 binary instead (Download at {{.url}}.)": "",
|
||||
"You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)": "",
|
||||
"You are trying to run windows .exe binary inside WSL, for better integration please use Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "",
|
||||
"You can delete them using the following command(s): ": "",
|
||||
"You can force an unsupported Kubernetes version via the --force flag": "",
|
||||
|
@ -822,7 +820,7 @@
|
|||
"addon '{{.name}}' is not a valid addon packaged with minikube.\nTo see the list of available addons run:\nminikube addons list": "",
|
||||
"addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "",
|
||||
"auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.": "",
|
||||
"auto-pause currently is only supported on docker runtime and amd64. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "",
|
||||
"auto-pause currently is only supported on docker runtime. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "",
|
||||
"bash completion failed": "",
|
||||
"bash completion.": "",
|
||||
"call with cleanup=true to remove old tunnels": "",
|
||||
|
|
|
@ -13,13 +13,13 @@
|
|||
"- Docs https://docs.docker.com/docker-for-windows/#resources": "- Docs https://docs.docker.com/docker-for-windows/#resources",
|
||||
"- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.": "- Assurez-vous que votre démon {{.driver_name}} a accès à suffisamment de ressources CPU/mémoire.",
|
||||
"- Prune unused {{.driver_name}} images, volumes and abandoned containers.": "- Nettoyer les images {{.driver_name}} non utilisées, les volumes et les conteneurs abandonnés.",
|
||||
"- Prune unused {{.driver_name}} images, volumes, networks and abandoned containers.\n\n\t\t\t\t{{.driver_name}} system prune --volumes": "- Nettoyer les images {{.driver_name}} non utilisées, les volumes, les réseaux et les conteneurs abandonnées.",
|
||||
"- Prune unused {{.driver_name}} images, volumes, networks and abandoned containers.\n\n\t\t\t\t{{.driver_name}} system prune --volumes": "- Nettoyer les images {{.driver_name}} non utilisées, les volumes, les réseaux et les conteneurs abandonnées.\n\n\t\t\t\t{{.driver_name}} system prune --volumes",
|
||||
"- Restart your {{.driver_name}} service": "- Redémarrer votre service {{.driver_name}}",
|
||||
"- {{.logPath}}": "",
|
||||
"- {{.logPath}}": "- {{.logPath}}",
|
||||
"--kvm-numa-count range is 1-8": "la tranche de --kvm-numa-count est 1 à 8",
|
||||
"--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "le drapeau --network est valide uniquement avec les pilotes docker/podman et KVM, il va être ignoré",
|
||||
"\u003ctarget file absolute path\u003e must be an absolute Path. Relative Path is not allowed (example: \"/home/docker/copied.txt\")": "\u003ctarget file absolute path\u003e doit être un chemin absolu. Les chemins relatifs ne sont pas autorisés (exemple: \"/home/docker/copied.txt\")",
|
||||
"==\u003e Audit \u003c==": "",
|
||||
"==\u003e Audit \u003c==": "==\u003e Audit \u003c==",
|
||||
"==\u003e Last Start \u003c==": "==\u003e Dernier démarrage \u003c==",
|
||||
"A VPN or firewall is interfering with HTTP access to the minikube VM. Alternatively, try a different VM driver: https://minikube.sigs.k8s.io/docs/start/": "Un VPN ou un pare-feu interfère avec l'accès HTTP à la machine virtuelle minikube. Vous pouvez également essayer un autre pilote de machine virtuelle : https://minikube.sigs.k8s.io/docs/start/",
|
||||
"A firewall is blocking Docker the minikube VM from reaching the image repository. You may need to select --image-repository, or use a proxy.": "Un pare-feu empêche le Docker de la machine virtuelle minikube d'atteindre le dépôt d'images. Vous devriez peut-être sélectionner --image-repository, ou utiliser un proxy.",
|
||||
|
@ -66,7 +66,7 @@
|
|||
"Because you are using a Docker driver on {{.operating_system}}, the terminal needs to be open to run it.": "Comme vous utilisez un pilote Docker sur {{.operating_system}}, le terminal doit être ouvert pour l'exécuter.",
|
||||
"Bind Address: {{.Address}}": "Adresse de liaison : {{.Address}}",
|
||||
"Booting up control plane ...": "Démarrage du plan de contrôle ...",
|
||||
"Both driver={{.driver}} and vm-driver={{.vmd}} have been set.\n\n Since vm-driver is deprecated, minikube will default to driver={{.driver}}.\n\n If vm-driver is set in the global config, please run \"minikube config unset vm-driver\" to resolve this warning.\n\t\t\t": "",
|
||||
"Both driver={{.driver}} and vm-driver={{.vmd}} have been set.\n\n Since vm-driver is deprecated, minikube will default to driver={{.driver}}.\n\n If vm-driver is set in the global config, please run \"minikube config unset vm-driver\" to resolve this warning.\n\t\t\t": "Driver={{.driver}} et vm-driver={{.vmd}} ont été définis.\n\n Étant donné que vm-driver est obsolète, minikube utilisera par défaut driver={{.driver}}.\n \n Si vm-driver est défini dans la configuration globale, veuillez exécuter \"minikube config unset vm-driver\" pour résoudre cet avertissement.\n\t\t\t",
|
||||
"Bridge CNI is incompatible with multi-node clusters, use a different CNI": "Le pont CNI est incompatible avec les clusters multi-nœuds, utilisez un autre CNI",
|
||||
"Build a container image in minikube": "Construire une image de conteneur dans minikube",
|
||||
"Build a container image, using the container runtime.": "Construire une image de conteneur à l'aide de l'environnement d'exécution du conteneur.",
|
||||
|
@ -76,7 +76,7 @@
|
|||
"Cannot find directory {{.path}} for copy": "Impossible de trouver le répertoire {{.path}} pour la copie",
|
||||
"Cannot find directory {{.path}} for mount": "Impossible de trouver le répertoire {{.path}} pour le montage",
|
||||
"Cannot use both --output and --format options": "Impossible d'utiliser à la fois les options --output et --format",
|
||||
"Check if you have unnecessary pods running by running 'kubectl get po -A'": "Vérifiez si vous avez des pods inutiles en cours d'exécution en exécutant 'kubectl get po -A'",
|
||||
"Check if you have unnecessary pods running by running 'kubectl get po -A": "Vérifiez si vous avez des pods inutiles en cours d'exécution en exécutant 'kubectl get po -A'",
|
||||
"Check output of 'journalctl -xeu kubelet', try passing --extra-config=kubelet.cgroup-driver=systemd to minikube start": "Vérifiez la sortie de 'journalctl -xeu kubelet', essayez de passer --extra-config=kubelet.cgroup-driver=systemd au démarrage de minikube",
|
||||
"Check that libvirt is setup properly": "Vérifiez que libvirt est correctement configuré",
|
||||
"Check that minikube is running and that you have specified the correct namespace (-n flag) if required.": "Vérifiez que minikube est en cours d'exécution et que vous avez spécifié le bon espace de noms (indicateur -n) si nécessaire",
|
||||
|
@ -145,7 +145,7 @@
|
|||
"Docker has less than 2 CPUs available, but Kubernetes requires at least 2 to be available": "Docker a moins de 2 processeurs disponibles, mais Kubernetes a besoin d'au moins 2 pour être disponible",
|
||||
"Docker inside the VM is unavailable. Try running 'minikube delete' to reset the VM.": "Docker à l'intérieur de la VM n'est pas disponible. Essayez d'exécuter « minikube delete » pour réinitialiser la machine virtuelle.",
|
||||
"Docs have been saved at - {{.path}}": "Les documents ont été enregistrés à - {{.path}}",
|
||||
"Documentation: {{.url}}": "",
|
||||
"Documentation: {{.url}}": "Documentation: {{.url}}",
|
||||
"Done! kubectl is now configured to use \"{{.name}}\"": "Terminé ! kubectl est maintenant configuré pour utiliser \"{{.name}}\".",
|
||||
"Done! kubectl is now configured to use \"{{.name}}\" cluster and \"{{.ns}}\" namespace by default": "Terminé ! kubectl est maintenant configuré pour utiliser \"{{.name}}\" cluster et espace de noms \"{{.ns}}\" par défaut.",
|
||||
"Download complete!": "Téléchargement terminé !",
|
||||
|
@ -398,7 +398,6 @@
|
|||
"None of the known repositories is accessible. Consider specifying an alternative image repository with --image-repository flag": "Aucun dépôt connu n'est accessible. Pensez à spécifier un autre dépôt d'images à l'aide de l'indicateur \"--image-repository\".",
|
||||
"Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "Vous avez remarqué que vous avez un docker-env activé sur le pilote {{.driver_name}} dans ce terminal :",
|
||||
"Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "Vous avez remarqué que vous avez un pilote podman-env activé sur {{.driver_name}} dans ce terminal :",
|
||||
"Number of CPUs allocated to Kubernetes.": "Nombre de processeurs alloués à Kubernetes.",
|
||||
"Number of CPUs allocated to the minikube VM": "Nombre de processeurs alloués à la VM minikube.",
|
||||
"Number of lines back to go within the log": "Nombre de lignes à remonter dans le journal",
|
||||
"OS release is {{.pretty_name}}": "La version du système d'exploitation est {{.pretty_name}}",
|
||||
|
@ -421,7 +420,7 @@
|
|||
"Paused {{.count}} containers": "{{.count}} conteneurs suspendus",
|
||||
"Paused {{.count}} containers in: {{.namespaces}}": "{{.count}} conteneurs suspendus dans : {{.namespaces}}",
|
||||
"Pausing node {{.name}} ... ": "Suspendre le nœud {{.name}} ...",
|
||||
"Permissions: {{.octalMode}} ({{.writtenMode}})": "Autorisations : {{.octalMode}} ({{.writeMode}})",
|
||||
"Permissions: {{.octalMode}} ({{.writtenMode}})": "Autorisations : {{.octalMode}} ({{.writtenMode}})",
|
||||
"Please attach the following file to the GitHub issue:": "Veuillez joindre le fichier suivant au problème GitHub :",
|
||||
"Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "Veuillez créer un cluster avec une plus grande taille de disque : `minikube start --disk SIZE_MB`",
|
||||
"Please either authenticate to the registry or use --base-image flag to use a different registry.": "Veuillez vous authentifier auprès du registre ou utiliser l'indicateur --base-image pour utiliser un registre différent.",
|
||||
|
@ -470,8 +469,8 @@
|
|||
"Registry mirrors to pass to the Docker daemon": "Miroirs de dépôt à transmettre au daemon Docker.",
|
||||
"Reinstall VirtualBox and reboot. Alternatively, try the kvm2 driver: https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/": "Réinstallez VirtualBox et redémarrez. Sinon, essayez le pilote kvm2 : https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/",
|
||||
"Reinstall VirtualBox and verify that it is not blocked: System Preferences -\u003e Security \u0026 Privacy -\u003e General -\u003e Some system software was blocked from loading": "Réinstallez VirtualBox et vérifiez qu'il n'est pas bloqué : Préférences Système -\u003e Sécurité \u0026 Confidentialité -\u003e Général -\u003e Le chargement de certains logiciels système a été bloqué",
|
||||
"Related issue: {{.url}}": "Problème connexe : {{.url}}",
|
||||
"Related issues:": "Problème connexe : {{.url}}",
|
||||
"Related issue: {{.url}}": "Problème connexe: {{.url}}",
|
||||
"Related issues:": "Problème connexe:",
|
||||
"Relaunching Kubernetes using {{.bootstrapper}} ...": "Redémarrage de Kubernetes à l'aide de {{.bootstrapper}}…",
|
||||
"Remove one or more images": "Supprimer une ou plusieurs images",
|
||||
"Remove the invalid --docker-opt or --insecure-registry flag if one was provided": "Supprimez l'indicateur --docker-opt ou --insecure-registry non valide s'il a été fourni",
|
||||
|
@ -620,8 +619,8 @@
|
|||
"The control plane node must be running for this command": "Le nœud du plan de contrôle doit être en cours d'exécution pour cette commande",
|
||||
"The cri socket path to be used": "Chemin d'accès au socket CRI à utiliser.",
|
||||
"The cri socket path to be used.": "Le chemin de socket cri à utiliser.",
|
||||
"The docker-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "",
|
||||
"The docker-env command is only compatible with the \"docker\" runtime, but this cluster was configured to use the \"{{.runtime}}\" runtime.": "La commande docker-env est incompatible avec les clusters multi-nœuds. Utilisez le module 'registry' : https://minikube.sigs.k8s.io/docs/handbook/registry/",
|
||||
"The docker-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "La commande docker-env est incompatible avec les clusters multi-nœuds. Utilisez le module 'registry' : https://minikube.sigs.k8s.io/docs/handbook/registry/",
|
||||
"The docker-env command is only compatible with the \"docker\" runtime, but this cluster was configured to use the \"{{.runtime}}\" runtime.": "La commande docker-env n'est compatible qu'avec le runtime \"docker\", mais ce cluster a été configuré pour utiliser le runtime \"{{.runtime}}\".",
|
||||
"The driver '{{.driver}}' is not supported on {{.os}}/{{.arch}}": "Le pilote \"{{.driver}}\" n'est pas compatible avec {{.os}}/{{.arch}}.",
|
||||
"The existing \"{{.name}}\" cluster was created using the \"{{.old}}\" driver, which is incompatible with requested \"{{.new}}\" driver.": "Le cluster \"{{.name}}\" existant a été créé à l'aide du pilote \"{{.old}}\", qui est incompatible avec le pilote \"{{.new}}\" demandé.",
|
||||
"The existing node configuration appears to be corrupt. Run 'minikube delete'": "La configuration de nœud existante semble être corrompue. Exécutez 'minikube delete'",
|
||||
|
@ -703,6 +702,7 @@
|
|||
"Unable to find control plane": "Impossible de trouver le plan de contrôle",
|
||||
"Unable to generate docs": "Impossible de générer des documents",
|
||||
"Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "Impossible de générer la documentation. Veuillez vous assurer que le chemin spécifié est un répertoire, existe \u0026 vous avez la permission d'y écrire.",
|
||||
"Unable to get CPU info: {{.err}}": "",
|
||||
"Unable to get bootstrapper: {{.error}}": "Impossible d'obtenir l'amorceur : {{.error}}",
|
||||
"Unable to get command runner": "Impossible d'obtenir le lanceur de commandes",
|
||||
"Unable to get control plane status: {{.error}}": "Impossible d'obtenir l'état du plan de contrôle : {{.error}}",
|
||||
|
@ -713,7 +713,7 @@
|
|||
"Unable to kill mount process: {{.error}}": "Impossible d'arrêter le processus de montage : {{.error}}",
|
||||
"Unable to list profiles: {{.error}}": "Impossible de répertorier les profils : {{.error}}",
|
||||
"Unable to load cached images from config file.": "Impossible de charger les images mises en cache depuis le fichier de configuration.",
|
||||
"Unable to load cached images: {{.error}}": "",
|
||||
"Unable to load cached images: {{.error}}": "Impossible de charger les images mises en cache : {{.error}}",
|
||||
"Unable to load config: {{.error}}": "Impossible de charger la configuration : {{.error}}",
|
||||
"Unable to load host": "Impossible de charger l'hôte",
|
||||
"Unable to load profile: {{.error}}": "Impossible de charger le profil : {{.error}}",
|
||||
|
@ -798,7 +798,7 @@
|
|||
"With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "Avec --network-plugin=cni, vous devrez fournir votre propre CNI. Voir --cni flag comme alternative conviviale",
|
||||
"You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "Vous semblez utiliser un proxy, mais votre environnement NO_PROXY n'inclut pas l'IP minikube ({{.ip_address}}).",
|
||||
"You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}). Please see {{.documentation_url}} for more details": "Il semble que vous utilisiez un proxy, mais votre environment NO_PROXY n'inclut pas l'adresse IP ({{.ip_address}}) de minikube. Consultez la documentation à l'adresse {{.documentation_url}} pour en savoir plus.",
|
||||
"You are trying to run amd64 binary on M1 system. Please use darwin/arm64 binary instead (Download at {{.url}}.)": "Vous essayez d'exécuter le binaire amd64 sur le système M1. Veuillez utiliser le binaire darwin/arm64 à la place (télécharger sur {{.url}}.)",
|
||||
"You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)": "Vous essayez d'exécuter le binaire amd64 sur le système M1. Veuillez utiliser le binaire darwin/arm64 à la place (télécharger sur {{.url}}.)",
|
||||
"You are trying to run windows .exe binary inside WSL, for better integration please use Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "Vous essayez d'exécuter le binaire Windows .exe dans WSL. Pour une meilleure intégration, veuillez utiliser le binaire Linux à la place (Télécharger sur https://minikube.sigs.k8s.io/docs/start/.). Sinon, si vous voulez toujours le faire, vous pouvez le faire en utilisant --force",
|
||||
"You can delete them using the following command(s): ": "Vous pouvez les supprimer à l'aide de la ou des commandes suivantes :",
|
||||
"You can force an unsupported Kubernetes version via the --force flag": "Vous pouvez forcer une version Kubernetes non prise en charge via l'indicateur --force",
|
||||
|
@ -823,7 +823,7 @@
|
|||
"addon '{{.name}}' is not a valid addon packaged with minikube.\nTo see the list of available addons run:\nminikube addons list": "Le module '{{.name}}' n'est pas un module valide fourni avec minikube.\nPour voir la liste des modules disponibles, exécutez :\nminikube addons list",
|
||||
"addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "addons modifie les fichiers de modules minikube à l'aide de sous-commandes telles que \"minikube addons enable dashboard\"",
|
||||
"auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.": "Le module auto-pause est une fonctionnalité alpha et encore en développement précoce. Veuillez signaler les problèmes pour nous aider à l'améliorer.",
|
||||
"auto-pause currently is only supported on docker runtime and amd64. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "la pause automatique n'est actuellement prise en charge que sur le runtime docker et amd64. Suivez les progrès des autres ici : https://github.com/kubernetes/minikube/issues/10601",
|
||||
"auto-pause currently is only supported on docker runtime. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "la pause automatique n'est actuellement prise en charge que sur le runtime docker. Suivez les progrès des autres ici : https://github.com/kubernetes/minikube/issues/10601",
|
||||
"bash completion failed": "échec de la complétion bash",
|
||||
"bash completion.": "complétion bash",
|
||||
"call with cleanup=true to remove old tunnels": "appelez avec cleanup=true pour supprimer les anciens tunnels",
|
||||
|
@ -871,7 +871,7 @@
|
|||
"minikube is missing files relating to your guest environment. This can be fixed by running 'minikube delete'": "minikube manque des fichiers relatifs à votre environnement invité. Cela peut être corrigé en exécutant 'minikube delete'",
|
||||
"minikube is not meant for production use. You are opening non-local traffic": "minikube n'est pas destiné à une utilisation en production. Vous ouvrez du trafic non local",
|
||||
"minikube is unable to access the Google Container Registry. You may need to configure it to use a HTTP proxy.": "minikube ne peut pas accéder à Google Container Registry. Vous devrez peut-être le configurer pour utiliser un proxy HTTP.",
|
||||
"minikube is unable to connect to the VM: {{.error}}\n\n\tThis is likely due to one of two reasons:\n\n\t- VPN or firewall interference\n\t- {{.hypervisor}} network configuration issue\n\n\tSuggested workarounds:\n\n\t- Disable your local VPN or firewall software\n\t- Configure your local VPN or firewall to allow access to {{.ip}}\n\t- Restart or reinstall {{.hypervisor}}\n\t- Use an alternative --vm-driver\n\t- Use --force to override this connectivity check\n\t": "minikube ne parvient pas à se connecter à la VM : {{.error}}\n\n\tCela est probablement dû à l'une des deux raisons suivantes :\n\n\t- Interférence VPN ou pare-feu\n\t- {{.hypervisor }} problème de configuration réseau\n\n\tSolutions suggérées :\n\n\t- Désactivez votre logiciel VPN ou pare-feu local\n\t- Configurez votre VPN ou pare-feu local pour autoriser l'accès à {{.ip}}\n \t- Redémarrez ou réinstallez {{.hypervisor}}\n\t- Utilisez un autre --vm-driver\n\t- Utilisez --force pour annuler cette vérification de connectivité\n\t",
|
||||
"minikube is unable to connect to the VM: {{.error}}\n\n\tThis is likely due to one of two reasons:\n\n\t- VPN or firewall interference\n\t- {{.hypervisor}} network configuration issue\n\n\tSuggested workarounds:\n\n\t- Disable your local VPN or firewall software\n\t- Configure your local VPN or firewall to allow access to {{.ip}}\n\t- Restart or reinstall {{.hypervisor}}\n\t- Use an alternative --vm-driver\n\t- Use --force to override this connectivity check\n\t": "minikube ne parvient pas à se connecter à la VM : {{.error}}\n\n\tCela est probablement dû à l'une des deux raisons suivantes :\n\n\t- Interférence VPN ou pare-feu\n\t- {{.hypervisor}} problème de configuration réseau\n\n\tSolutions suggérées :\n\n\t- Désactivez votre logiciel VPN ou pare-feu local\n\t- Configurez votre VPN ou pare-feu local pour autoriser l'accès à {{.ip}}\n \t- Redémarrez ou réinstallez {{.hypervisor}}\n\t- Utilisez un autre --vm-driver\n\t- Utilisez --force pour annuler cette vérification de connectivité\n\t",
|
||||
"minikube profile was successfully set to {{.profile_name}}": "Le profil de minikube a été défini avec succès sur {{.profile_name}}",
|
||||
"minikube provisions and manages local Kubernetes clusters optimized for development workflows.": "minikube provisionne et gère des clusters Kubernetes locaux optimisés pour les workflows de développement.",
|
||||
"minikube quickly sets up a local Kubernetes cluster": "minikube configure rapidement un cluster Kubernetes local",
|
||||
|
@ -943,10 +943,10 @@
|
|||
"{{.name}} was successfully configured": "{{.name}} a été configuré avec succès",
|
||||
"{{.n}} is nearly out of disk space, which may cause deployments to fail! ({{.p}}% of capacity)": "{{.n}} manque presque d'espace disque, ce qui peut entraîner l'échec des déploiements ! ({{.p}} % de la capacité)",
|
||||
"{{.n}} is out of disk space! (/var is at {{.p}}% of capacity)": "{{.n}} n'a plus d'espace disque ! (/var est à {{.p}} % de capacité)",
|
||||
"{{.ocibin}} is taking an unsually long time to respond, consider restarting {{.ocibin}}": "{{.oxibin}} prend un temps anormalement long pour répondre, pensez à redémarrer {{.osibin}}",
|
||||
"{{.ocibin}} is taking an unsually long time to respond, consider restarting {{.ocibin}}": "{{.ocibin}} prend un temps anormalement long pour répondre, pensez à redémarrer {{.ocibin}}",
|
||||
"{{.path}} is version {{.client_version}}, which may have incompatibilites with Kubernetes {{.cluster_version}}.": "{{.path}} est la version {{.client_version}}, qui peut comporter des incompatibilités avec Kubernetes {{.cluster_version}}.",
|
||||
"{{.prefix}}minikube {{.version}} on {{.platform}}": "{{.prefix}}minikube {{.version}} sur {{.platform}}",
|
||||
"{{.profile}} profile is not valid: {{.err}}": "Le profil {{.profile}} n'est pas valide : {{.error}}",
|
||||
"{{.profile}} profile is not valid: {{.err}}": "Le profil {{.profile}} n'est pas valide : {{.err}}",
|
||||
"{{.type}} is not yet a supported filesystem. We will try anyways!": "{{.type}} n'est pas encore un système de fichiers pris en charge. Nous essaierons quand même !",
|
||||
"{{.url}} is not accessible: {{.error}}": "{{.url}} n'est pas accessible : {{.error}}"
|
||||
}
|
|
@ -185,7 +185,7 @@
|
|||
"Error getting cluster bootstrapper": "クラスタのブートストラッパを取得中にエラーが発生しました",
|
||||
"Error getting cluster config": "クラスタの設定を取得中にエラーが発生しました",
|
||||
"Error getting host": "ホストを取得中にエラーが発生しました",
|
||||
"Error getting port binding for '{{.driver_name}} driver: {{.error}}": "「{{.driver_name}}」ドライバー用のポートをバインディング中にエラーが発生しました",
|
||||
"Error getting port binding for '{{.driver_name}} driver: {{.error}}": "「{{.driver_name}}」ドライバー用のポートをバインディング中にエラーが発生しました: {{.error}}",
|
||||
"Error getting primary control plane": "コントロールプレーンを取得中にエラーが発生しました",
|
||||
"Error getting service with namespace: {{.namespace}} and labels {{.labelName}}:{{.addonName}}: {{.error}}": "",
|
||||
"Error getting ssh client": "SSH クライアントを取得中にエラーが発生しました",
|
||||
|
@ -222,7 +222,7 @@
|
|||
"Failed to configure metallb IP {{.profile}}": "",
|
||||
"Failed to create file": "",
|
||||
"Failed to create runtime": "",
|
||||
"Failed to delete cluster {{.name}}, proceeding with retry anyway.": "クラスタを削除できませんでしたが、処理を続行します。",
|
||||
"Failed to delete cluster {{.name}}, proceeding with retry anyway.": "クラスタ {{.name}} を削除できませんでしたが、処理を続行します。",
|
||||
"Failed to delete cluster {{.name}}.": "",
|
||||
"Failed to delete cluster: {{.error}}": "",
|
||||
"Failed to delete cluster: {{.error}}__1": "クラスタを削除できませんでした。{{.error}}",
|
||||
|
@ -252,7 +252,6 @@
|
|||
"Failed to stop node {{.name}}": "",
|
||||
"Failed to update cluster": "",
|
||||
"Failed to update config": "",
|
||||
"Failed to verify '{{.driver_name}} info' will try again ...": "",
|
||||
"Failed unmount: {{.error}}": "",
|
||||
"File permissions used for the mount": "",
|
||||
"Filter to use only VM Drivers": "",
|
||||
|
@ -384,13 +383,12 @@
|
|||
"Node operations": "ノードの運用",
|
||||
"Node {{.name}} failed to start, deleting and trying again.": "",
|
||||
"Node {{.name}} was successfully deleted.": "{{.name}} ノードは削除されました。",
|
||||
"Node {{.nodeName}} does not exist.": "{{.name}} ノードは存在しません。",
|
||||
"Node {{.nodeName}} does not exist.": "{{.nodeName}} ノードは存在しません。",
|
||||
"None of the known repositories are accessible. Consider specifying an alternative image repository with --image-repository flag": "",
|
||||
"None of the known repositories in your location are accessible. Using {{.image_repository_name}} as fallback.": "使用しているロケーション内で既知のいずれのリポジトリにもアクセスできません。フォールバックとして {{.image_repository_name}} を使用します",
|
||||
"None of the known repositories is accessible. Consider specifying an alternative image repository with --image-repository flag": "既知のいずれのリポジトリにもアクセスできません。--image-repository フラグとともに代替のイメージ リポジトリを指定することを検討してください",
|
||||
"Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "",
|
||||
"Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "",
|
||||
"Number of CPUs allocated to Kubernetes.": "",
|
||||
"Number of CPUs allocated to the minikube VM": "minikube VM に割り当てられた CPU の数",
|
||||
"Number of lines back to go within the log": "",
|
||||
"OS release is {{.pretty_name}}": "OS は {{.pretty_name}} です。",
|
||||
|
@ -699,6 +697,7 @@
|
|||
"Unable to find control plane": "",
|
||||
"Unable to generate docs": "",
|
||||
"Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "",
|
||||
"Unable to get CPU info: {{.err}}": "",
|
||||
"Unable to get bootstrapper: {{.error}}": "ブートストラッパを取得できません。{{.error}}",
|
||||
"Unable to get command runner": "",
|
||||
"Unable to get control plane status: {{.error}}": "",
|
||||
|
@ -794,7 +793,7 @@
|
|||
"With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "",
|
||||
"You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "",
|
||||
"You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}). Please see {{.documentation_url}} for more details": "プロキシを使用しようとしていますが、現在の NO_PROXY 環境に minikube IP({{.ip_address}})は含まれていません。詳細については、{{.documentation_url}} をご覧ください",
|
||||
"You are trying to run amd64 binary on M1 system. Please use darwin/arm64 binary instead (Download at {{.url}}.)": "",
|
||||
"You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)": "",
|
||||
"You are trying to run windows .exe binary inside WSL, for better integration please use Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "",
|
||||
"You can also use 'minikube kubectl -- get pods' to invoke a matching version": "「 minikube kubectl -- get pods 」で、一致するバージョンを表示することができます",
|
||||
"You can delete them using the following command(s):": "以下のコマンドで削除することができます",
|
||||
|
@ -823,7 +822,7 @@
|
|||
"addon '{{.name}}' is not a valid addon packaged with minikube.\nTo see the list of available addons run:\nminikube addons list": "「 {{.name}} 」アドオンは minikube では有効なアドオンではありません。\n利用可能なアドオンの一覧を表示するためには、以下のコマンドを実行してください。 \nminikube addons list",
|
||||
"addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "addons では以下のようにサブコマンドを使用することで、 minikube のアドオンのファイルを編集することができます。 \"minikube addons enable dashboard\"",
|
||||
"auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.": "",
|
||||
"auto-pause currently is only supported on docker runtime and amd64. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "",
|
||||
"auto-pause currently is only supported on docker runtime. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "",
|
||||
"bash completion failed": "bash の補完が失敗しました",
|
||||
"bash completion.": "",
|
||||
"call with cleanup=true to remove old tunnels": "cleanup=true で呼び出すことで、古い tunnel を削除することができます",
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
"- Delete and recreate minikube cluster\n\t\tminikube delete\n\t\tminikube start --driver={{.driver_name}}": "minikube 클러스터를 삭제하고 재생성합니다.\n\t\tminikube를 삭제합니다.\n\t\tminikube start --driver={{.driver_name}}",
|
||||
"- Docs https://docs.docker.com/docker-for-mac/#resources": "- 문서: https://docs.docker.com/docker-for-mac/#resources",
|
||||
"- Docs https://docs.docker.com/docker-for-windows/#resources": "- 문서: https://docs.docker.com/docker-for-windows/#resources",
|
||||
"- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.": "- {{.driver_name} 데몬이 충분한 CPU/메모리 리소스에 액세스할 수 있는지 확인합니다.",
|
||||
"- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.": "- {{.driver_name}} 데몬이 충분한 CPU/메모리 리소스에 액세스할 수 있는지 확인합니다.",
|
||||
"- Prune unused {{.driver_name}} images, volumes, networks and abandoned containers.\n\n\t\t\t\t{{.driver_name}} system prune --volumes": "",
|
||||
"- Restart your {{.driver_name}} service": "{{.driver_name}} 서비스를 다시 시작하세요",
|
||||
"- {{.logPath}}": "",
|
||||
|
@ -55,7 +55,6 @@
|
|||
"Allow user prompts for more information": "많은 정보를 위해 사용자 프롬프트를 허가합니다",
|
||||
"Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. Set it to \\\"auto\\\" to let minikube decide one for you. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers": "",
|
||||
"Amount of RAM allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "minikube 가상 머신에 할당할 RAM 의 용량 (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g)",
|
||||
"Amount of RAM to allocate to Kubernetes (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "",
|
||||
"Amount of time to wait for a service in seconds": "",
|
||||
"Amount of time to wait for service in seconds": "",
|
||||
"Another hypervisor, such as VirtualBox, is conflicting with KVM. Please stop the other hypervisor, or use --driver to switch to it.": "VirtualBox 와 같은 또 다른 하이퍼바이저가 KVM 과 충돌이 발생합니다. 다른 하이퍼바이저를 중단하거나 --driver 로 변경하세요",
|
||||
|
@ -77,7 +76,7 @@
|
|||
"CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)": "",
|
||||
"Cache image from docker daemon": "도커 데몬의 캐시 이미지",
|
||||
"Cache image from remote registry": "원격 레지스트리의 캐시 이미지",
|
||||
"Cannot find directory {{.path}} for copy": "복사하기 위한 디렉토리 {{.path} 를 찾을 수 없습니다.",
|
||||
"Cannot find directory {{.path}} for copy": "복사하기 위한 디렉토리 {{.path}} 를 찾을 수 없습니다.",
|
||||
"Cannot find directory {{.path}} for mount": "마운트하기 위한 디렉토리 {{.path}} 를 찾을 수 없습니다",
|
||||
"Cannot use both --output and --format options": "--output 과 --format 옵션을 함께 사용할 수 없습니다",
|
||||
"Check if you have unnecessary pods running by running 'kubectl get po -A": "",
|
||||
|
@ -114,7 +113,7 @@
|
|||
"Could not process errors from failed deletion": "",
|
||||
"Could not resolve IP address": "",
|
||||
"Country code of the image mirror to be used. Leave empty to use the global one. For Chinese mainland users, set it to cn.": "",
|
||||
"Creating Kubernetes in {{.driver_name}} {{.machine_type}} with (CPUs={{.number_of_cpus}}) ({{.number_of_host_cpus}} available), Memory={{.memory_size}}MB ({{.host_memory_size}}MB available) ...": "{{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) 에 쿠버네티스를 설치하는 중 ...",
|
||||
"Creating Kubernetes in {{.driver_name}} {{.machine_type}} with (CPUs={{.number_of_cpus}}) ({{.number_of_host_cpus}} available), Memory={{.memory_size}}MB ({{.host_memory_size}}MB available) ...": "{{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}} ({{.number_of_host_cpus}}MB 유효한), Memory={{.memory_size}}MB ({{.host_memory_size}}MB 유효한) ...",
|
||||
"Creating mount {{.name}} ...": "",
|
||||
"Creating {{.driver_name}} VM (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "{{.driver_name}} VM (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) 를 생성하는 중 ...",
|
||||
"Creating {{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB) ...": "",
|
||||
|
@ -156,7 +155,7 @@
|
|||
"Done! kubectl is now configured to use \"{{.name}}\"": "끝났습니다! 이제 kubectl 이 \"{{.name}}\" 를 사용할 수 있도록 설정되었습니다",
|
||||
"Done! kubectl is now configured to use \"{{.name}}\" cluster and \"{{.ns}}\" namespace by default": "끝났습니다! kubectl이 \"{{.name}}\" 클러스터와 \"{{.ns}}\" 네임스페이스를 기본적으로 사용하도록 구성되었습니다.",
|
||||
"Download complete!": "다운로드가 성공하였습니다!",
|
||||
"Downloading Kubernetes {{.version}} preload ...": "쿠버네티스 {{.version} 을 다운로드 중 ...",
|
||||
"Downloading Kubernetes {{.version}} preload ...": "쿠버네티스 {{.version}} 을 다운로드 중 ...",
|
||||
"Downloading VM boot image ...": "가상 머신 부트 이미지 다운로드 중 ...",
|
||||
"Downloading driver {{.driver}}:": "드라이버 {{.driver}} 다운로드 중 :",
|
||||
"Downloading {{.name}} {{.version}}": "{{.name}} {{.version}} 다운로드 중",
|
||||
|
@ -283,7 +282,6 @@
|
|||
"Failed to stop node {{.name}}": "노드 {{.name}} 중지에 실패하였습니다",
|
||||
"Failed to update cluster": "클러스터를 수정하는 데 실패하였습니다",
|
||||
"Failed to update config": "컨피그를 수정하는 데 실패하였습니다",
|
||||
"Failed to verify '{{.driver_name}} info' will try again ...": "",
|
||||
"Failed unmount: {{.error}}": "마운트 해제에 실패하였습니다: {{.error}}",
|
||||
"File permissions used for the mount": "",
|
||||
"Filter to use only VM Drivers": "",
|
||||
|
@ -417,7 +415,6 @@
|
|||
"None of the known repositories in your location are accessible. Using {{.image_repository_name}} as fallback.": "",
|
||||
"Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "",
|
||||
"Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "",
|
||||
"Number of CPUs allocated to Kubernetes.": "",
|
||||
"Number of lines back to go within the log": "",
|
||||
"OS release is {{.pretty_name}}": "",
|
||||
"One of 'yaml' or 'json'.": "",
|
||||
|
@ -705,6 +702,7 @@
|
|||
"Unable to find control plane": "",
|
||||
"Unable to generate docs": "문서를 생성할 수 없습니다",
|
||||
"Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "",
|
||||
"Unable to get CPU info: {{.err}}": "",
|
||||
"Unable to get VM IP address": "가상 머신 IP 주소를 조회할 수 없습니다",
|
||||
"Unable to get command runner": "",
|
||||
"Unable to get control plane status: {{.error}}": "",
|
||||
|
@ -797,7 +795,7 @@
|
|||
"Whether to use external switch over Default Switch if virtual switch not explicitly specified. (hyperv driver only)": "",
|
||||
"With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "",
|
||||
"You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "",
|
||||
"You are trying to run amd64 binary on M1 system. Please use darwin/arm64 binary instead (Download at {{.url}}.)": "",
|
||||
"You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)": "",
|
||||
"You are trying to run windows .exe binary inside WSL, for better integration please use Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "",
|
||||
"You can also use 'minikube kubectl -- get pods' to invoke a matching version": "맞는 버전의 kubectl 을 사용하기 위해서는 다음과 같이 사용 가능합니다. minikube kubectl -- get pods'",
|
||||
"You can delete them using the following command(s):": "다음 명령어(들)을 사용하여 제거할 수 있습니다",
|
||||
|
@ -825,7 +823,7 @@
|
|||
"addon '{{.name}}' is not a valid addon packaged with minikube.\nTo see the list of available addons run:\nminikube addons list": "",
|
||||
"addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "",
|
||||
"auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.": "",
|
||||
"auto-pause currently is only supported on docker runtime and amd64. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "",
|
||||
"auto-pause currently is only supported on docker runtime. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "",
|
||||
"bash completion failed": "bash 자동 완성이 실패하였습니다",
|
||||
"bash completion.": "",
|
||||
"call with cleanup=true to remove old tunnels": "",
|
||||
|
@ -949,9 +947,9 @@
|
|||
"{{.name}} cluster does not exist": "{{.name}} 클러스터가 존재하지 않습니다",
|
||||
"{{.name}} doesn't have images.": "{{.name}} 이미지가 없습니다.",
|
||||
"{{.name}} has following images:": "{{.name}}에는 다음과 같은 이미지가 있습니다.",
|
||||
"{{.name}} has no available configuration options": "{{.driver}} 이 사용 가능한 환경 정보 옵션이 없습니다",
|
||||
"{{.name}} is already running": "{{.driver}} 이 이미 실행 중입니다",
|
||||
"{{.name}} was successfully configured": "{{.driver}} 이 성공적으로 설정되었습니다",
|
||||
"{{.name}} has no available configuration options": "{{.name}} 이 사용 가능한 환경 정보 옵션이 없습니다",
|
||||
"{{.name}} is already running": "{{.name}} 이 이미 실행 중입니다",
|
||||
"{{.name}} was successfully configured": "{{.name}} 이 성공적으로 설정되었습니다",
|
||||
"{{.n}} is nearly out of disk space, which may cause deployments to fail! ({{.p}}% of capacity)": "",
|
||||
"{{.n}} is out of disk space! (/var is at {{.p}}% of capacity)": "",
|
||||
"{{.ocibin}} is taking an unsually long time to respond, consider restarting {{.ocibin}}": "",
|
||||
|
|
|
@ -53,7 +53,6 @@
|
|||
"Allow user prompts for more information": "",
|
||||
"Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. Set it to \\\"auto\\\" to let minikube decide one for you. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers": "",
|
||||
"Amount of RAM allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g)": "Ilość zarezerwowanej pamięci RAM dla maszyny wirtualnej minikube (format: \u003cnumber\u003e[\u003cunit\u003e], gdzie jednostka to = b, k, m lub g)",
|
||||
"Amount of RAM to allocate to Kubernetes (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "",
|
||||
"Amount of time to wait for a service in seconds": "Czas oczekiwania na serwis w sekundach",
|
||||
"Amount of time to wait for service in seconds": "Czas oczekiwania na serwis w sekundach",
|
||||
"Another hypervisor, such as VirtualBox, is conflicting with KVM. Please stop the other hypervisor, or use --driver to switch to it.": "Inny hiperwizor, taki jak Virtualbox, powoduje konflikty z KVM. Zatrzymaj innego hiperwizora lub użyj flagi --driver żeby go zmienić.",
|
||||
|
@ -270,7 +269,6 @@
|
|||
"Failed to stop node {{.name}}": "",
|
||||
"Failed to update cluster": "Aktualizacja klastra nie powiodła się",
|
||||
"Failed to update config": "Aktualizacja konfiguracji nie powiodła się",
|
||||
"Failed to verify '{{.driver_name}} info' will try again ...": "",
|
||||
"Failed unmount: {{.error}}": "",
|
||||
"File permissions used for the mount": "",
|
||||
"Filter to use only VM Drivers": "",
|
||||
|
@ -459,7 +457,7 @@
|
|||
"Print just the version number.": "Wyświetl tylko numer wersji",
|
||||
"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 {{.entry}}:": "Wykryto problem w {{.entry}}",
|
||||
"Problems detected in {{.name}}:": "Wykryto problem w {{.name}}:",
|
||||
"Profile \"{{.cluster}}\" not found. Run \"minikube profile list\" to view all profiles.": "",
|
||||
"Profile gets or sets the current minikube profile": "Pobiera lub ustawia aktywny profil minikube",
|
||||
|
@ -549,7 +547,7 @@
|
|||
"Show only log entries which point to known problems": "Pokaż logi które wskazują na znane problemy",
|
||||
"Show only the most recent journal entries, and continuously print new entries as they are appended to the journal.": "",
|
||||
"Simulate numa node count in minikube, supported numa node count range is 1-8 (kvm2 driver only)": "",
|
||||
"Skipped switching kubectl context for {{.profile_name}} because --keep-context was set.": "Zignorowano zmianę kontekstu kubectl ponieważ --keep-context zostało przekazane",
|
||||
"Skipped switching kubectl context for {{.profile_name}} because --keep-context was set.": "Zignorowano zmianę kontekstu kubectl dla {{.profile_name}} ponieważ --keep-context zostało przekazane",
|
||||
"Some dashboard features require the metrics-server addon. To enable all features please run:\n\n\tminikube{{.profileArg}} addons enable metrics-server\t\n\n": "",
|
||||
"Sorry, Kubernetes {{.k8sVersion}} requires conntrack to be installed in root's path": "",
|
||||
"Sorry, completion support is not yet implemented for {{.name}}": "",
|
||||
|
@ -716,6 +714,7 @@
|
|||
"Unable to find control plane": "",
|
||||
"Unable to generate docs": "",
|
||||
"Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "",
|
||||
"Unable to get CPU info: {{.err}}": "",
|
||||
"Unable to get command runner": "",
|
||||
"Unable to get control plane status: {{.error}}": "",
|
||||
"Unable to get current user": "",
|
||||
|
@ -807,7 +806,7 @@
|
|||
"Whether to use external switch over Default Switch if virtual switch not explicitly specified. (hyperv driver only)": "",
|
||||
"With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "",
|
||||
"You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "",
|
||||
"You are trying to run amd64 binary on M1 system. Please use darwin/arm64 binary instead (Download at {{.url}}.)": "",
|
||||
"You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)": "",
|
||||
"You are trying to run windows .exe binary inside WSL, for better integration please use Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "",
|
||||
"You can delete them using the following command(s): ": "",
|
||||
"You can force an unsupported Kubernetes version via the --force flag": "",
|
||||
|
@ -832,7 +831,7 @@
|
|||
"addon '{{.name}}' is not a valid addon packaged with minikube.\nTo see the list of available addons run:\nminikube addons list": "",
|
||||
"addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "",
|
||||
"auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.": "",
|
||||
"auto-pause currently is only supported on docker runtime and amd64. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "",
|
||||
"auto-pause currently is only supported on docker runtime. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "",
|
||||
"bash completion failed": "",
|
||||
"bash completion.": "",
|
||||
"call with cleanup=true to remove old tunnels": "",
|
||||
|
@ -869,7 +868,7 @@
|
|||
"invalid kubernetes version": "Nieprawidłowa wersja Kubernetesa",
|
||||
"keep the kube-context active after cluster is stopped. Defaults to false.": "",
|
||||
"kubeadm detected a TCP port conflict with another process: probably another local Kubernetes installation. Run lsof -p\u003cport\u003e to find the process and kill it": "",
|
||||
"kubectl and minikube configuration will be stored in {{.home_folder}}": "konfiguracja minikube i kubectl będzie przechowywana w katalogu {{.home_dir}}",
|
||||
"kubectl and minikube configuration will be stored in {{.home_folder}}": "konfiguracja minikube i kubectl będzie przechowywana w katalogu {{.home_folder}}",
|
||||
"kubectl not found in PATH, but is required for the dashboard. Installation guide: https://kubernetes.io/docs/tasks/tools/install-kubectl/": "kubectl nie zostało odnalezione w zmiennej środowiskowej ${PATH}. Instrukcja instalacji: https://kubernetes.io/docs/tasks/tools/install-kubectl/",
|
||||
"kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'": "",
|
||||
"kubectl proxy": "",
|
||||
|
|
|
@ -47,7 +47,6 @@
|
|||
"All existing scheduled stops cancelled": "",
|
||||
"Allow user prompts for more information": "",
|
||||
"Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. Set it to \\\"auto\\\" to let minikube decide one for you. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers": "",
|
||||
"Amount of RAM to allocate to Kubernetes (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "",
|
||||
"Amount of time to wait for a service in seconds": "",
|
||||
"Amount of time to wait for service in seconds": "",
|
||||
"Another hypervisor, such as VirtualBox, is conflicting with KVM. Please stop the other hypervisor, or use --driver to switch to it.": "",
|
||||
|
@ -244,7 +243,6 @@
|
|||
"Failed to stop node {{.name}}": "",
|
||||
"Failed to update cluster": "",
|
||||
"Failed to update config": "",
|
||||
"Failed to verify '{{.driver_name}} info' will try again ...": "",
|
||||
"Failed unmount: {{.error}}": "",
|
||||
"File permissions used for the mount": "",
|
||||
"Filter to use only VM Drivers": "",
|
||||
|
@ -371,7 +369,6 @@
|
|||
"None of the known repositories in your location are accessible. Using {{.image_repository_name}} as fallback.": "",
|
||||
"Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "",
|
||||
"Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "",
|
||||
"Number of CPUs allocated to Kubernetes.": "",
|
||||
"Number of lines back to go within the log": "",
|
||||
"OS release is {{.pretty_name}}": "",
|
||||
"One of 'yaml' or 'json'.": "",
|
||||
|
@ -652,6 +649,7 @@
|
|||
"Unable to find control plane": "",
|
||||
"Unable to generate docs": "",
|
||||
"Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "",
|
||||
"Unable to get CPU info: {{.err}}": "",
|
||||
"Unable to get command runner": "",
|
||||
"Unable to get control plane status: {{.error}}": "",
|
||||
"Unable to get current user": "",
|
||||
|
@ -737,7 +735,7 @@
|
|||
"Whether to use external switch over Default Switch if virtual switch not explicitly specified. (hyperv driver only)": "",
|
||||
"With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "",
|
||||
"You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "",
|
||||
"You are trying to run amd64 binary on M1 system. Please use darwin/arm64 binary instead (Download at {{.url}}.)": "",
|
||||
"You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)": "",
|
||||
"You are trying to run windows .exe binary inside WSL, for better integration please use Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "",
|
||||
"You can delete them using the following command(s): ": "",
|
||||
"You can force an unsupported Kubernetes version via the --force flag": "",
|
||||
|
@ -762,7 +760,7 @@
|
|||
"addon '{{.name}}' is not a valid addon packaged with minikube.\nTo see the list of available addons run:\nminikube addons list": "",
|
||||
"addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "",
|
||||
"auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.": "",
|
||||
"auto-pause currently is only supported on docker runtime and amd64. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "",
|
||||
"auto-pause currently is only supported on docker runtime. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "",
|
||||
"bash completion failed": "",
|
||||
"bash completion.": "",
|
||||
"call with cleanup=true to remove old tunnels": "",
|
||||
|
|
|
@ -333,7 +333,6 @@
|
|||
"Failed to stop node {{.name}}": "",
|
||||
"Failed to update cluster": "更新 cluster 失败",
|
||||
"Failed to update config": "更新 config 失败",
|
||||
"Failed to verify '{{.driver_name}} info' will try again ...": "",
|
||||
"Failed unmount: {{.error}}": "unmount 失败:{{.error}}",
|
||||
"File permissions used for the mount": "用于 mount 的文件权限",
|
||||
"Filter to use only VM Drivers": "",
|
||||
|
@ -480,7 +479,6 @@
|
|||
"None of the known repositories is accessible. Consider specifying an alternative image repository with --image-repository flag": "已知存储库都无法访问。请考虑使用 --image-repository 标志指定备选镜像存储库",
|
||||
"Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "",
|
||||
"Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "",
|
||||
"Number of CPUs allocated to Kubernetes.": "",
|
||||
"Number of CPUs allocated to the minikube VM": "分配给 minikube 虚拟机的 CPU 的数量",
|
||||
"Number of lines back to go within the log": "",
|
||||
"OS release is {{.pretty_name}}": "",
|
||||
|
@ -807,6 +805,7 @@
|
|||
"Unable to find control plane": "",
|
||||
"Unable to generate docs": "",
|
||||
"Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "",
|
||||
"Unable to get CPU info: {{.err}}": "",
|
||||
"Unable to get bootstrapper: {{.error}}": "无法获取引导程序:{{.error}}",
|
||||
"Unable to get command runner": "",
|
||||
"Unable to get control plane status: {{.error}}": "",
|
||||
|
@ -912,7 +911,7 @@
|
|||
"With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "",
|
||||
"You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "",
|
||||
"You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}). Please see {{.documentation_url}} for more details": "您似乎正在使用代理,但您的 NO_PROXY 环境不包含 minikube IP ({{.ip_address}})。如需了解详情,请参阅 {{.documentation_url}}",
|
||||
"You are trying to run amd64 binary on M1 system. Please use darwin/arm64 binary instead (Download at {{.url}}.)": "",
|
||||
"You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)": "",
|
||||
"You are trying to run windows .exe binary inside WSL, for better integration please use Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "",
|
||||
"You can delete them using the following command(s): ": "",
|
||||
"You can force an unsupported Kubernetes version via the --force flag": "",
|
||||
|
@ -938,7 +937,7 @@
|
|||
"addon enable failed": "启用插件失败",
|
||||
"addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "插件使用诸如 \"minikube addons enable dashboard\" 的子命令修改 minikube 的插件文件",
|
||||
"auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.": "",
|
||||
"auto-pause currently is only supported on docker runtime and amd64. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "",
|
||||
"auto-pause currently is only supported on docker runtime. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "",
|
||||
"bash completion failed": "",
|
||||
"bash completion.": "",
|
||||
"call with cleanup=true to remove old tunnels": "",
|
||||
|
|
Loading…
Reference in New Issue