Merge branch 'master' of github.com:kubernetes/minikube into kic-add-static-ip

pull/8764/head
Priya Wadhwa 2020-08-12 14:03:43 -07:00
commit 52953bac93
23 changed files with 497 additions and 131 deletions

149
.github/workflows/iso.yml vendored Normal file
View File

@ -0,0 +1,149 @@
name: ISO
on:
pull_request:
paths:
- "deploy/iso/**"
env:
GOPROXY: https://proxy.golang.org
jobs:
build_test_iso:
runs-on: [self-hosted, debian9, gcp]
steps:
- name: Clean up workspace
shell: bash
run: |
pwd
ls -lah
rm -rf out
ls -lah
df -h
- uses: actions/checkout@v2
- uses: actions/setup-go@v2
with:
go-version: '1.14.6'
stable: true
- name: Download Dependencies
run: go mod download
- name: Install KVM
run: |
sudo apt-get update
sudo apt-get install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
- name: Install ISO build tools
run: |
sudo apt-get update \
&& sudo apt-get install -y apt dpkg apt-utils ca-certificates \
&& sudo apt-get upgrade -y \
&& sudo apt-get install -y \
build-essential \
git \
wget \
cpio \
python \
unzip \
bc \
gcc-multilib \
automake \
libtool \
gnupg2 \
p7zip-full \
locales \
rsync \
dumb-init \
libpcre3-dev
sudo localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
- name: Build Binaries
run: |
make linux
make e2e-linux-amd64
cp -r test/integration/testdata ./out
whoami
echo github ref $GITHUB_REF
echo workflow $GITHUB_WORKFLOW
echo home $HOME
echo event name $GITHUB_EVENT_NAME
echo workspace $GITHUB_WORKSPACE
echo "end of debug stuff"
echo $(which jq)
# iso needs golang 1.11.3
- uses: actions/setup-go@v2
with:
go-version: '1.11.13'
stable: true
- name: Build ISO
run: |
whoami
make minikube_iso &> ./out/iso.log
make checksum
- uses: actions/setup-go@v2
with:
go-version: '1.14.6'
stable: true
- name: Install kubectl
shell: bash
run: |
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.18.0/bin/linux/amd64/kubectl
sudo install kubectl /usr/local/bin/kubectl
kubectl version --client=true
- name: Install gopogh
shell: bash
run: |
curl -LO https://github.com/medyagh/gopogh/releases/download/v0.2.4/gopogh-linux-amd64
sudo install gopogh-linux-amd64 /usr/local/bin/gopogh
sudo apt-get install -y jq
- name: Run Integration Test
continue-on-error: false
# bash {0} to allow test to continue to next step. in case of
shell: bash {0}
run: |
cd out
ls -lah
mkdir -p report
mkdir -p testhome
chmod a+x e2e-*
chmod a+x minikube-*
START_TIME=$(date -u +%s)
KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome ./e2e-linux-amd64 -minikube-start-args="--vm-driver=kvm2 --iso-url=file://$(pwd)/minikube.iso" -test.v -binary=./minikube-linux-amd64 2>&1 | tee ./report/testout.txt
END_TIME=$(date -u +%s)
TIME_ELAPSED=$(($END_TIME-$START_TIME))
min=$((${TIME_ELAPSED}/60))
sec=$((${TIME_ELAPSED}%60))
TIME_ELAPSED="${min} min $sec seconds "
echo ::set-env name=TIME_ELAPSED::${TIME_ELAPSED}
- name: Generate HTML Report
shell: bash
run: |
cd out
export PATH=${PATH}:`go env GOPATH`/bin
go tool test2json -t < ./report/testout.txt > ./report/testout.json || true
STAT=$(gopogh -in ./report/testout.json -out ./report/testout.html -name "${JOB_NAME} ${GITHUB_REF}" -repo "${GITHUB_REPOSITORY}" -details "${GITHUB_SHA}") || true
echo status: ${STAT}
FailNum=$(echo $STAT | jq '.NumberOfFail')
TestsNum=$(echo $STAT | jq '.NumberOfTests')
GOPOGH_RESULT="${JOB_NAME} : completed with ${FailNum} / ${TestsNum} failures in ${TIME_ELAPSED}"
echo ::set-env name=GOPOGH_RESULT::${GOPOGH_RESULT}
echo ::set-env name=STAT::${STAT}
- uses: actions/upload-artifact@v1
with:
name: iso_functional_test_kvm2_ubuntu
path: out/report
- uses: actions/upload-artifact@v1
with:
name: iso log
path: out/iso.log
- name: The End Result iso_functional_test_kvm2_ubuntu
shell: bash
run: |
echo ${GOPOGH_RESULT}
numFail=$(echo $STAT | jq '.NumberOfFail')
numPass=$(echo $STAT | jq '.NumberOfPass')
echo "*******************${numPass} Passes :) *******************"
echo $STAT | jq '.PassedTests' || true
echo "*******************************************************"
echo "---------------- ${numFail} Failures :( ----------------------------"
echo $STAT | jq '.FailedTests' || true
echo "-------------------------------------------------------"
numPass=$(echo $STAT | jq '.NumberOfPass')
if [ "$numFail" -gt 0 ];then echo "*** $numFail Failed ***";exit 2;fi
if [ "$numPass" -eq 0 ];then echo "*** 0 Passed! ***";exit 2;fi
if [ "$numPass" -lt 32 ];then echo "*** Failed to pass at least 32 ! ***";exit 2;fi
if [ "$numPass" -eq 0 ];then echo "*** Passed! ***";exit 0;fi

View File

@ -336,6 +336,8 @@ jobs:
echo "------------------------"
docker volume ls
echo "------------------------"
docker system info --format '{{json .}}'
echo "------------------------"
- uses: actions/setup-go@v2
with:
go-version: '1.14.6'
@ -359,7 +361,7 @@ jobs:
$env:KUBECONFIG="${pwd}\testhome\kubeconfig"
$env:MINIKUBE_HOME="${pwd}\testhome"
$ErrorActionPreference = "SilentlyContinue"
.\e2e-windows-amd64.exe --minikube-start-args="--driver=docker" --test.timeout=10m --timeout-multiplier=1 --test.v --test.run=TestFunctional --binary=./minikube-windows-amd64.exe | Tee-Object -FilePath ".\report\testout.txt"
.\e2e-windows-amd64.exe --minikube-start-args="--driver=docker" --test.timeout=15m --timeout-multiplier=1 --test.v --test.run=TestFunctional --binary=./minikube-windows-amd64.exe | Tee-Object -FilePath ".\report\testout.txt"
$END_TIME=(GET-DATE)
echo $END_TIME
$DURATION=(NEW-TIMESPAN -Start $START_TIME -End $END_TIME)
@ -495,7 +497,7 @@ jobs:
$env:KUBECONFIG="${pwd}\testhome\kubeconfig"
$env:MINIKUBE_HOME="${pwd}\testhome"
$ErrorActionPreference = "SilentlyContinue"
.\e2e-windows-amd64.exe --minikube-start-args="--driver=hyperv" --test.timeout=13m --timeout-multiplier=1.5 --test.v --test.run=TestFunctional --binary=./minikube-windows-amd64.exe | Tee-Object -FilePath ".\report\testout.txt"
.\e2e-windows-amd64.exe --minikube-start-args="--driver=hyperv" --test.timeout=20m --timeout-multiplier=1.5 --test.v --test.run=TestFunctional --binary=./minikube-windows-amd64.exe | Tee-Object -FilePath ".\report\testout.txt"
$END_TIME=(GET-DATE)
echo $END_TIME
$DURATION=(NEW-TIMESPAN -Start $START_TIME -End $END_TIME)
@ -792,7 +794,7 @@ jobs:
cp minikube-darwin-amd64 minikube
chmod a+x minikube*
START_TIME=$(date -u +%s)
KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome ./e2e-darwin-amd64 -minikube-start-args=--vm-driver=virtualbox -test.run "(TestAddons|TestCertOptions|TestSkaffold)" -test.timeout=15m -test.v -timeout-multiplier=3 -binary=./minikube-darwin-amd64 2>&1 | tee ./report/testout.txt
KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome ./e2e-darwin-amd64 -minikube-start-args=--vm-driver=virtualbox -test.run "(TestAddons|TestCertOptions|TestSkaffold)" -test.timeout=20m -test.v -timeout-multiplier=1.5 -binary=./minikube-darwin-amd64 2>&1 | tee ./report/testout.txt
END_TIME=$(date -u +%s)
TIME_ELAPSED=$(($END_TIME-$START_TIME))
min=$((${TIME_ELAPSED}/60))
@ -978,7 +980,7 @@ jobs:
chmod a+x e2e-*
chmod a+x minikube-*
START_TIME=$(date -u +%s)
KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome ./e2e-darwin-amd64 -minikube-start-args=--driver=virtualbox -test.run "TestMultiNode" -test.timeout=15m -test.v -timeout-multiplier=1.5 -binary=./minikube-darwin-amd64 2>&1 | tee ./report/testout.txt
KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome ./e2e-darwin-amd64 -minikube-start-args=--driver=virtualbox -test.run "TestMultiNode" -test.timeout=17m -test.v -timeout-multiplier=1.5 -binary=./minikube-darwin-amd64 2>&1 | tee ./report/testout.txt
END_TIME=$(date -u +%s)
TIME_ELAPSED=$(($END_TIME-$START_TIME))
min=$((${TIME_ELAPSED}/60))

View File

@ -334,6 +334,8 @@ jobs:
echo "------------------------"
docker volume ls
echo "------------------------"
docker system info --format '{{json .}}'
echo "------------------------"
- uses: actions/setup-go@v2
with:
go-version: '1.14.6'
@ -357,7 +359,7 @@ jobs:
$env:KUBECONFIG="${pwd}\testhome\kubeconfig"
$env:MINIKUBE_HOME="${pwd}\testhome"
$ErrorActionPreference = "SilentlyContinue"
.\e2e-windows-amd64.exe --minikube-start-args="--driver=docker" --test.timeout=10m --timeout-multiplier=1 --test.v --test.run=TestFunctional --binary=./minikube-windows-amd64.exe | Tee-Object -FilePath ".\report\testout.txt"
.\e2e-windows-amd64.exe --minikube-start-args="--driver=docker" --test.timeout=15m --timeout-multiplier=1 --test.v --test.run=TestFunctional --binary=./minikube-windows-amd64.exe | Tee-Object -FilePath ".\report\testout.txt"
$END_TIME=(GET-DATE)
echo $END_TIME
$DURATION=(NEW-TIMESPAN -Start $START_TIME -End $END_TIME)
@ -493,7 +495,7 @@ jobs:
$env:KUBECONFIG="${pwd}\testhome\kubeconfig"
$env:MINIKUBE_HOME="${pwd}\testhome"
$ErrorActionPreference = "SilentlyContinue"
.\e2e-windows-amd64.exe --minikube-start-args="--driver=hyperv" --test.timeout=13m --timeout-multiplier=1.5 --test.v --test.run=TestFunctional --binary=./minikube-windows-amd64.exe | Tee-Object -FilePath ".\report\testout.txt"
.\e2e-windows-amd64.exe --minikube-start-args="--driver=hyperv" --test.timeout=20m --timeout-multiplier=1.5 --test.v --test.run=TestFunctional --binary=./minikube-windows-amd64.exe | Tee-Object -FilePath ".\report\testout.txt"
$END_TIME=(GET-DATE)
echo $END_TIME
$DURATION=(NEW-TIMESPAN -Start $START_TIME -End $END_TIME)
@ -790,7 +792,7 @@ jobs:
cp minikube-darwin-amd64 minikube
chmod a+x minikube*
START_TIME=$(date -u +%s)
KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome ./e2e-darwin-amd64 -minikube-start-args=--vm-driver=virtualbox -test.run "(TestAddons|TestCertOptions|TestSkaffold)" -test.timeout=15m -test.v -timeout-multiplier=3 -binary=./minikube-darwin-amd64 2>&1 | tee ./report/testout.txt
KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome ./e2e-darwin-amd64 -minikube-start-args=--vm-driver=virtualbox -test.run "(TestAddons|TestCertOptions|TestSkaffold)" -test.timeout=20m -test.v -timeout-multiplier=1.5 -binary=./minikube-darwin-amd64 2>&1 | tee ./report/testout.txt
END_TIME=$(date -u +%s)
TIME_ELAPSED=$(($END_TIME-$START_TIME))
min=$((${TIME_ELAPSED}/60))
@ -976,7 +978,7 @@ jobs:
chmod a+x e2e-*
chmod a+x minikube-*
START_TIME=$(date -u +%s)
KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome ./e2e-darwin-amd64 -minikube-start-args=--driver=virtualbox -test.run "TestMultiNode" -test.timeout=15m -test.v -timeout-multiplier=1.5 -binary=./minikube-darwin-amd64 2>&1 | tee ./report/testout.txt
KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome ./e2e-darwin-amd64 -minikube-start-args=--driver=virtualbox -test.run "TestMultiNode" -test.timeout=17m -test.v -timeout-multiplier=1.5 -binary=./minikube-darwin-amd64 2>&1 | tee ./report/testout.txt
END_TIME=$(date -u +%s)
TIME_ELAPSED=$(($END_TIME-$START_TIME))
min=$((${TIME_ELAPSED}/60))

View File

@ -135,6 +135,9 @@ func runStart(cmd *cobra.Command, args []string) {
}
displayEnviron(os.Environ())
if viper.GetBool(force) {
out.WarningT("minikube skips various validations when --force is supplied; this may lead to unexpected behavior")
}
// if --registry-mirror specified when run minikube start,
// take arg precedence over MINIKUBE_REGISTRY_MIRROR
@ -662,7 +665,7 @@ func validateDriver(ds registry.DriverState, existing *config.ClusterConfig) {
}
out.ErrLn("")
if !st.Installed && !viper.GetBool(force) {
if !st.Installed {
if existing != nil {
if old := hostDriver(existing); name == old {
exit.WithCodeT(exit.Unavailable, "{{.driver}} does not appear to be installed, but is specified by an existing profile. Please run 'minikube delete' or install {{.driver}}", out.V{"driver": name})
@ -670,10 +673,7 @@ func validateDriver(ds registry.DriverState, existing *config.ClusterConfig) {
}
exit.WithCodeT(exit.Unavailable, "{{.driver}} does not appear to be installed", out.V{"driver": name})
}
if !viper.GetBool(force) {
exit.WithCodeT(exit.Unavailable, "Failed to validate '{{.driver}}' driver", out.V{"driver": name})
}
exitIfNotForced(exit.Unavailable, "Failed to validate '{{.driver}}' driver", out.V{"driver": name})
}
}
@ -765,10 +765,18 @@ func validateUser(drvName string) {
// memoryLimits returns the amount of memory allocated to the system and hypervisor , the return value is in MB
func memoryLimits(drvName string) (int, int, error) {
info, err := machine.CachedHostInfo()
if err != nil {
return -1, -1, err
info, cpuErr, memErr, diskErr := machine.CachedHostInfo()
if cpuErr != nil {
glog.Warningf("could not get system cpu info while verifying memory limits, which might be okay: %v", cpuErr)
}
if diskErr != nil {
glog.Warningf("could not get system disk info while verifying memory limits, which might be okay: %v", diskErr)
}
if memErr != nil {
return -1, -1, memErr
}
sysLimit := int(info.Memory)
containerLimit := 0
@ -827,9 +835,11 @@ func validateMemoryHardLimit(drvName string) {
if err != nil {
glog.Warningf("Unable to query memory limits: %v", err)
out.WarningT("Failed to verify system memory limits.")
return
}
if s < 2200 {
out.WarningT("Your system has only {{.memory_amount}}MB memory. This might not work minimum required is 2000MB.", out.V{"memory_amount": s})
return
}
if driver.IsDockerDesktop(drvName) {
// in Docker Desktop if you allocate 2 GB the docker info shows: Total Memory: 1.945GiB which becomes 1991 when we calculate the MBs
@ -856,11 +866,10 @@ func validateMemorySize(req int, drvName string) {
// a more sane alternative to their high memory 80%
minAdvised := 0.50 * float64(sysLimit)
if req < minUsableMem && !viper.GetBool(force) {
exit.WithCodeT(exit.Config, "Requested memory allocation {{.requested}}MB is less than the usable minimum of {{.minimum}}MB",
out.V{"requested": req, "mininum": minUsableMem})
if req < minUsableMem {
exitIfNotForced(exit.Config, "Requested memory allocation {{.requested}}MB is less than the usable minimum of {{.minimum_memory}}MB", out.V{"requested": req, "minimum_memory": minUsableMem})
}
if req < minRecommendedMem && !viper.GetBool(force) {
if req < minRecommendedMem {
out.WarningT("Requested memory allocation ({{.requested}}MB) is less than the recommended minimum {{.recommended}}MB. Kubernetes may crash unexpectedly.",
out.V{"requested": req, "recommended": minRecommendedMem})
}
@ -873,24 +882,21 @@ func validateMemorySize(req int, drvName string) {
`, out.V{"container_limit": containerLimit, "system_limit": sysLimit})
}
if req > sysLimit && !viper.GetBool(force) {
out.T(out.Tip, "To suppress memory validations you can use --force flag.")
exit.WithCodeT(exit.Config, `Requested memory allocation {{.requested}}MB is more than your system limit {{.system_limit}}MB. Try specifying a lower memory:
miniube start --memory={{.min_advised}}mb
`,
out.V{"requested": req, "system_limit": sysLimit, "max_advised": int32(maxAdvised), "min_advised": minAdvised})
if req > sysLimit {
message := `Requested memory allocation {{.requested}}MB is more than your system limit {{.system_limit}}MB. Try specifying a lower memory:
miniube start --memory={{.min_advised}}mb
`
exitIfNotForced(exit.Config, message, out.V{"requested": req, "system_limit": sysLimit, "max_advised": int32(maxAdvised), "min_advised": minAdvised})
}
if float64(req) > maxAdvised && !viper.GetBool(force) {
if float64(req) > maxAdvised {
out.WarningT(`You are allocating {{.requested}}MB to memory and your system only has {{.system_limit}}MB. You might face issues. try specifying a lower memory:
miniube start --memory={{.min_advised}}mb
`, out.V{"requested": req, "system_limit": sysLimit, "min_advised": minAdvised})
out.T(out.Tip, "To suppress and ignore this warning you can use --force flag.")
}
}
@ -909,8 +915,8 @@ func validateCPUCount(drvName string) {
} else {
cpuCount = viper.GetInt(cpus)
}
if cpuCount < minimumCPUS && !viper.GetBool(force) {
exit.UsageT("Requested cpu count {{.requested_cpus}} is less than the minimum allowed of {{.minimum_cpus}}", out.V{"requested_cpus": cpuCount, "minimum_cpus": minimumCPUS})
if cpuCount < minimumCPUS {
exitIfNotForced(exit.BadUsage, "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)) {
@ -932,22 +938,22 @@ func validateCPUCount(drvName string) {
`)
}
out.T(out.Documentation, "https://docs.docker.com/config/containers/resource_constraints/")
exit.UsageT("Ensure your {{.driver_name}} system has enough CPUs. The minimum allowed is 2 CPUs.", out.V{"driver_name": driver.FullName(viper.GetString("driver"))})
exitIfNotForced(exit.BadUsage, "Ensure your {{.driver_name}} system has enough CPUs. The minimum allowed is 2 CPUs.", out.V{"driver_name": driver.FullName(viper.GetString("driver"))})
}
}
}
// validateFlags validates the supplied flags against known bad combinations
func validateFlags(cmd *cobra.Command, drvName string) {
if cmd.Flags().Changed(humanReadableDiskSize) {
diskSizeMB, err := util.CalculateSizeInMB(viper.GetString(humanReadableDiskSize))
if err != nil {
exit.WithCodeT(exit.Config, "Validation unable to parse disk size '{{.diskSize}}': {{.error}}", out.V{"diskSize": viper.GetString(humanReadableDiskSize), "error": err})
exitIfNotForced(exit.Config, "Validation unable to parse disk size '{{.diskSize}}': {{.error}}", out.V{"diskSize": viper.GetString(humanReadableDiskSize), "error": err})
}
if diskSizeMB < minimumDiskSize && !viper.GetBool(force) {
exit.WithCodeT(exit.Config, "Requested disk size {{.requested_size}} is less than minimum of {{.minimum_size}}", out.V{"requested_size": diskSizeMB, "minimum_size": minimumDiskSize})
if diskSizeMB < minimumDiskSize {
exitIfNotForced(exit.Config, "Requested disk size {{.requested_size}} is less than minimum of {{.minimum_size}}", out.V{"requested_size": diskSizeMB, "minimum_size": minimumDiskSize})
}
}
@ -965,7 +971,7 @@ func validateFlags(cmd *cobra.Command, drvName string) {
}
req, err := util.CalculateSizeInMB(viper.GetString(memory))
if err != nil {
exit.WithCodeT(exit.Config, "Unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": viper.GetString(memory), "error": err})
exitIfNotForced(exit.Config, "Unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": viper.GetString(memory), "error": err})
}
validateMemorySize(req, drvName)
}
@ -1143,11 +1149,10 @@ func validateKubernetesVersion(old *config.ClusterConfig) {
if nvs.LT(oldestVersion) {
out.WarningT("Specified Kubernetes version {{.specified}} is less than the oldest supported version: {{.oldest}}", out.V{"specified": nvs, "oldest": constants.OldestKubernetesVersion})
if viper.GetBool(force) {
out.WarningT("Kubernetes {{.version}} is not supported by this release of minikube", out.V{"version": nvs})
} else {
exit.WithCodeT(exit.Data, "Sorry, Kubernetes {{.version}} is not supported by this release of minikube. To use this version anyway, use the `--force` flag.", out.V{"version": nvs})
if !viper.GetBool(force) {
out.WarningT("You can force an unsupported Kubernetes version via the --force flag")
}
exitIfNotForced(exit.Data, "Kubernetes {{.version}} is not supported by this release of minikube", out.V{"version": nvs})
}
if old == nil || old.KubernetesConfig.KubernetesVersion == "" {
@ -1210,3 +1215,10 @@ func getKubernetesVersion(old *config.ClusterConfig) string {
return version.VersionPrefix + nvs.String()
}
func exitIfNotForced(code int, message string, v out.V) {
if !viper.GetBool(force) {
exit.WithCodeT(code, message, v)
}
out.WarningT(message, v)
}

View File

@ -114,7 +114,6 @@ func initMinikubeFlags() {
// e.g. iso-url => $ENVPREFIX_ISO_URL
viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
viper.AutomaticEnv()
startCmd.Flags().Bool(force, false, "Force minikube to perform possibly dangerous operations")
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")
@ -137,7 +136,7 @@ func initMinikubeFlags() {
startCmd.Flags().Bool(enableDefaultCNI, false, "DEPRECATED: Replaced by --cni=bridge")
startCmd.Flags().String(cniFlag, "", "CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)")
startCmd.Flags().StringSlice(waitComponents, kverify.DefaultWaitList, fmt.Sprintf("comma separated list of Kubernetes components to verify and wait for after starting a cluster. defaults to %q, available options: %q . other acceptable values are 'all' or 'none', 'true' and 'false'", strings.Join(kverify.DefaultWaitList, ","), strings.Join(kverify.AllComponentsList, ",")))
startCmd.Flags().Duration(waitTimeout, 6*time.Minute, "max time to wait per Kubernetes core services to be healthy.")
startCmd.Flags().Duration(waitTimeout, 6*time.Minute, "max time to wait per Kubernetes or host to be healthy.")
startCmd.Flags().Bool(nativeSSH, true, "Use native Golang SSH client (default true). Set to 'false' to use the command line 'ssh' command when accessing the docker machine. Useful for the machine drivers when they will not start with 'Waiting for SSH'.")
startCmd.Flags().Bool(autoUpdate, true, "If set, automatically updates drivers to the latest version. Defaults to true.")
startCmd.Flags().Bool(installAddons, true, "If set, install addons. Defaults to true.")
@ -223,12 +222,12 @@ func generateClusterConfig(cmd *cobra.Command, existing *config.ClusterConfig, k
glog.Info("no existing cluster config was found, will generate one from the flags ")
sysLimit, containerLimit, err := memoryLimits(drvName)
if err != nil {
glog.Warningf("Unable to query memory limits: %v", err)
glog.Warningf("Unable to query memory limits: %+v", err)
}
mem := suggestMemoryAllocation(sysLimit, containerLimit, viper.GetInt(nodes))
if cmd.Flags().Changed(memory) {
mem, err = pkgutil.CalculateSizeInMB(viper.GetString(memory))
mem, err := pkgutil.CalculateSizeInMB(viper.GetString(memory))
if err != nil {
exit.WithCodeT(exit.Config, "Generate unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": viper.GetString(memory), "error": err})
}
@ -309,6 +308,7 @@ func generateClusterConfig(cmd *cobra.Command, existing *config.ClusterConfig, k
HostDNSResolver: viper.GetBool(hostDNSResolver),
HostOnlyNicType: viper.GetString(hostOnlyNicType),
NatNicType: viper.GetString(natNicType),
StartHostTimeout: viper.GetDuration(waitTimeout),
KubernetesConfig: config.KubernetesConfig{
KubernetesVersion: k8sVersion,
ClusterName: ClusterFlagValue(),

View File

@ -1,3 +1,4 @@
PODMAN_DUMMY = DUMMY
PODMAN_VERSION = v1.9.3
PODMAN_COMMIT = 5d44534fff6877b1cb15b760242279ae6293154c
PODMAN_SITE = https://github.com/containers/podman/archive

3
go.mod
View File

@ -72,7 +72,6 @@ require (
github.com/zchee/go-vmnet v0.0.0-20161021174912-97ebf9174097
golang.org/x/build v0.0.0-20190927031335-2835ba2e683f
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 // indirect
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a
golang.org/x/sys v0.0.0-20200523222454-059865788121
@ -94,7 +93,7 @@ require (
replace (
git.apache.org/thrift.git => github.com/apache/thrift v0.0.0-20180902110319-2566ecd5d999
github.com/docker/docker => github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7
github.com/docker/machine => github.com/machine-drivers/machine v0.7.1-0.20200323212942-41eb826190d8
github.com/docker/machine => github.com/machine-drivers/machine v0.7.1-0.20200810185219-7d42fed1b770
github.com/google/go-containerregistry => github.com/afbjorklund/go-containerregistry v0.0.0-20200602203322-347d93793dc9
github.com/hashicorp/go-getter => github.com/afbjorklund/go-getter v1.4.1-0.20190910175809-eb9f6c26742c
github.com/samalba/dockerclient => github.com/sayboras/dockerclient v1.0.0

4
go.sum
View File

@ -684,8 +684,8 @@ github.com/lucas-clemente/quic-go v0.10.2/go.mod h1:hvaRS9IHjFLMq76puFJeWNfmn+H7
github.com/lucas-clemente/quic-go-certificates v0.0.0-20160823095156-d2f86524cced/go.mod h1:NCcRLrOTZbzhZvixZLlERbJtDtYsmMw8Jc4vS8Z0g58=
github.com/machine-drivers/docker-machine-driver-vmware v0.1.1 h1:+E1IKKk+6kaQrCPg6edJZ/zISZijuZTPnzy6RE4C/Ho=
github.com/machine-drivers/docker-machine-driver-vmware v0.1.1/go.mod h1:ej014C83EmSnxJeJ8PtVb8OLJ91PJKO1Q8Y7sM5CK0o=
github.com/machine-drivers/machine v0.7.1-0.20200323212942-41eb826190d8 h1:CIddS19fAKG4rUkZAotX0WPQtx/v/SdLhhDU3MVhLy0=
github.com/machine-drivers/machine v0.7.1-0.20200323212942-41eb826190d8/go.mod h1:79Uwa2hGd5S39LDJt58s8JZcIhGEK6pkq9bsuTbFWbk=
github.com/machine-drivers/machine v0.7.1-0.20200810185219-7d42fed1b770 h1:jc5SzpD28ZqDb+PoA4FxOwkl+slv593qJjrMVM35JFQ=
github.com/machine-drivers/machine v0.7.1-0.20200810185219-7d42fed1b770/go.mod h1:79Uwa2hGd5S39LDJt58s8JZcIhGEK6pkq9bsuTbFWbk=
github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=

View File

@ -42,6 +42,9 @@ func CachedDaemonInfo(ociBin string) (SysInfo, error) {
cachedSysInfo = &si
cachedSysInfoErr = &err
}
if cachedSysInfoErr == nil {
return *cachedSysInfo, nil
}
return *cachedSysInfo, *cachedSysInfoErr
}
@ -224,30 +227,39 @@ type podmanSysInfo struct {
} `json:"store"`
}
var dockerInfoGetter = func() (string, error) {
rr, err := runCmd(exec.Command(Docker, "system", "info", "--format", "{{json .}}"))
return rr.Stdout.String(), err
}
// dockerSystemInfo returns docker system info --format '{{json .}}'
func dockerSystemInfo() (dockerSysInfo, error) {
var ds dockerSysInfo
rr, err := runCmd(exec.Command(Docker, "system", "info", "--format", "{{json .}}"))
rawJSON, err := dockerInfoGetter()
if err != nil {
return ds, errors.Wrap(err, "get docker system info")
return ds, errors.Wrap(err, "docker system info")
}
if err := json.Unmarshal([]byte(strings.TrimSpace(rr.Stdout.String())), &ds); err != nil {
if err := json.Unmarshal([]byte(strings.TrimSpace(rawJSON)), &ds); err != nil {
return ds, errors.Wrapf(err, "unmarshal docker system info")
}
return ds, nil
}
var podmanInfoGetter = func() (string, error) {
rr, err := runCmd(exec.Command(Podman, "system", "info", "--format", "json"))
return rr.Stdout.String(), err
}
// podmanSysInfo returns podman system info --format '{{json .}}'
func podmanSystemInfo() (podmanSysInfo, error) {
var ps podmanSysInfo
rr, err := runCmd(exec.Command(Podman, "system", "info", "--format", "json"))
rawJSON, err := podmanInfoGetter()
if err != nil {
return ps, errors.Wrap(err, "get podman system info")
return ps, errors.Wrap(err, "podman system info")
}
if err := json.Unmarshal([]byte(strings.TrimSpace(rr.Stdout.String())), &ps); err != nil {
if err := json.Unmarshal([]byte(strings.TrimSpace(rawJSON)), &ps); err != nil {
return ps, errors.Wrapf(err, "unmarshal podman system info")
}
return ps, nil

View File

@ -0,0 +1,157 @@
/*
Copyright 2019 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.
*/
package oci
import (
"testing"
)
var daemonResponseMock string
var daemonInfoGetterMock = func() (string, error) {
return daemonResponseMock, nil
}
func TestDockerSystemInfo(t *testing.T) {
testCases := []struct {
Name string // test case bane
OciBin string // Docker or Podman
RawJSON string // raw response from json
ShouldError bool
CPUs int
Memory int64
OS string
}{
{
Name: "linux_docker",
OciBin: "docker",
RawJSON: `{"ID":"7PYP:53DU:MLWX:EDQG:YG2Y:UJLB:J7SD:4SAI:XF2Y:N2MR:MU53:DR3N","Containers":3,"ContainersRunning":1,"ContainersPaused":0,"ContainersStopped":2,"Images":76,"Driver":"overlay2","DriverStatus":[["Backing Filesystem","extfs"],["Supports d_type","true"],["Native Overlay Diff","true"]],"SystemStatus":null,"Plugins":{"Volume":["local"],"Network":["bridge","host","macvlan","null","overlay"],"Authorization":null,"Log":["awslogs","fluentd","gcplogs","gelf","journald","json-file","local","logentries","splunk","syslog"]},"MemoryLimit":true,"SwapLimit":false,"KernelMemory":true,"KernelMemoryTCP":false,"CpuCfsPeriod":true,"CpuCfsQuota":true,"CPUShares":true,"CPUSet":true,"PidsLimit":false,"IPv4Forwarding":true,"BridgeNfIptables":true,"BridgeNfIp6tables":true,"Debug":false,"NFd":27,"OomKillDisable":true,"NGoroutines":48,"SystemTime":"2020-08-11T18:16:17.494440681Z","LoggingDriver":"json-file","CgroupDriver":"cgroupfs","NEventsListener":0,"KernelVersion":"4.9.0-8-amd64","OperatingSystem":"Debian GNU/Linux 9 (stretch)","OSType":"linux","Architecture":"x86_64","IndexServerAddress":"https://index.docker.io/v1/","RegistryConfig":{"AllowNondistributableArtifactsCIDRs":[],"AllowNondistributableArtifactsHostnames":[],"InsecureRegistryCIDRs":["127.0.0.0/8"],"IndexConfigs":{"docker.io":{"Name":"docker.io","Mirrors":[],"Secure":true,"Official":true}},"Mirrors":[]},"NCPU":16,"MemTotal":63336071168,"GenericResources":null,"DockerRootDir":"/var/lib/docker","HttpProxy":"","HttpsProxy":"","NoProxy":"","Name":"image-builder-cloud-shell-v20200811-102837","Labels":[],"ExperimentalBuild":false,"ServerVersion":"18.09.0","ClusterStore":"","ClusterAdvertise":"","Runtimes":{"runc":{"path":"runc"}},"DefaultRuntime":"runc","Swarm":{"NodeID":"","NodeAddr":"","LocalNodeState":"inactive","ControlAvailable":false,"Error":"","RemoteManagers":null},"LiveRestoreEnabled":false,"Isolation":"","InitBinary":"docker-init","ContainerdCommit":{"ID":"7ad184331fa3e55e52b890ea95e65ba581ae3429","Expected":"7ad184331fa3e55e52b890ea95e65ba581ae3429"},"RuncCommit":{"ID":"dc9208a3303feef5b3839f4323d9beb36df0a9dd","Expected":"dc9208a3303feef5b3839f4323d9beb36df0a9dd"},"InitCommit":{"ID":"fec3683","Expected":"fec3683"},"SecurityOptions":["name=seccomp,profile=default"],"ProductLicense":"Community Engine","Warnings":["WARNING: No swap limit support"],"ClientInfo":{"Debug":false,"Plugins":[],"Warnings":null}}`,
ShouldError: false,
CPUs: 16,
Memory: 63336071168,
OS: "linux",
},
{
Name: "macos_docker",
OciBin: "docker",
RawJSON: `{"ID":"T54Z:I56K:XRG5:BTMK:BI72:IMI3:QBBF:H2PD:DGAF:EQLJ:7JFZ:PF54","Containers":5,"ContainersRunning":1,"ContainersPaused":0,"ContainersStopped":4,"Images":84,"Driver":"overlay2","DriverStatus":[["Backing Filesystem","extfs"],["Supports d_type","true"],["Native Overlay Diff","true"]],"SystemStatus":null,"Plugins":{"Volume":["local"],"Network":["bridge","host","ipvlan","macvlan","null","overlay"],"Authorization":null,"Log":["awslogs","fluentd","gcplogs","gelf","journald","json-file","local","logentries","splunk","syslog"]},"MemoryLimit":true,"SwapLimit":true,"KernelMemory":true,"KernelMemoryTCP":true,"CpuCfsPeriod":true,"CpuCfsQuota":true,"CPUShares":true,"CPUSet":true,"PidsLimit":true,"IPv4Forwarding":true,"BridgeNfIptables":true,"BridgeNfIp6tables":true,"Debug":true,"NFd":46,"OomKillDisable":true,"NGoroutines":56,"SystemTime":"2020-08-11T19:33:23.8936297Z","LoggingDriver":"json-file","CgroupDriver":"cgroupfs","NEventsListener":3,"KernelVersion":"4.19.76-linuxkit","OperatingSystem":"Docker Desktop","OSType":"linux","Architecture":"x86_64","IndexServerAddress":"https://index.docker.io/v1/","RegistryConfig":{"AllowNondistributableArtifactsCIDRs":[],"AllowNondistributableArtifactsHostnames":[],"InsecureRegistryCIDRs":["127.0.0.0/8"],"IndexConfigs":{"docker.io":{"Name":"docker.io","Mirrors":[],"Secure":true,"Official":true}},"Mirrors":[]},"NCPU":4,"MemTotal":3142250496,"GenericResources":null,"DockerRootDir":"/var/lib/docker","HttpProxy":"gateway.docker.internal:3128","HttpsProxy":"gateway.docker.internal:3129","NoProxy":"","Name":"docker-desktop","Labels":[],"ExperimentalBuild":false,"ServerVersion":"19.03.12","ClusterStore":"","ClusterAdvertise":"","Runtimes":{"runc":{"path":"runc"}},"DefaultRuntime":"runc","Swarm":{"NodeID":"","NodeAddr":"","LocalNodeState":"inactive","ControlAvailable":false,"Error":"","RemoteManagers":null},"LiveRestoreEnabled":false,"Isolation":"","InitBinary":"docker-init","ContainerdCommit":{"ID":"7ad184331fa3e55e52b890ea95e65ba581ae3429","Expected":"7ad184331fa3e55e52b890ea95e65ba581ae3429"},"RuncCommit":{"ID":"dc9208a3303feef5b3839f4323d9beb36df0a9dd","Expected":"dc9208a3303feef5b3839f4323d9beb36df0a9dd"},"InitCommit":{"ID":"fec3683","Expected":"fec3683"},"SecurityOptions":["name=seccomp,profile=default"],"ProductLicense":"Community Engine","Warnings":null,"ClientInfo":{"Debug":false,"Plugins":[],"Warnings":null}}
`,
ShouldError: false,
CPUs: 4,
Memory: 3142250496,
OS: "linux",
},
{
Name: "windows_docker",
OciBin: "docker",
RawJSON: `{"ID":"CVVH:7ZIB:S5EO:L6VO:MGZ3:TRLS:JGIS:4ZI2:27Z7:MQAQ:YSLT:HEHB","Containers":0,"ContainersRunning":0,"ContainersPaused":0,"ContainersStopped":0,"Images":3,"Driver":"overlay2","DriverStatus":[["Backing Filesystem","extfs"],["Supports d_type","true"],["Native Overlay Diff","true"]],"SystemStatus":null,"Plugins":{"Volume":["local"],"Network":["bridge","host","ipvlan","macvlan","null","overlay"],"Authorization":null,"Log":["awslogs","fluentd","gcplogs","gelf","journald","json-file","local","logentries","splunk","syslog"]},"MemoryLimit":true,"SwapLimit":true,"KernelMemory":true,"KernelMemoryTCP":true,"CpuCfsPeriod":true,"CpuCfsQuota":true,"CPUShares":true,"CPUSet":true,"PidsLimit":true,"IPv4Forwarding":true,"BridgeNfIptables":true,"BridgeNfIp6tables":true,"Debug":true,"NFd":35,"OomKillDisable":true,"NGoroutines":45,"SystemTime":"2020-08-11T19:39:26.083212722Z","LoggingDriver":"json-file","CgroupDriver":"cgroupfs","NEventsListener":1,"KernelVersion":"4.19.76-linuxkit","OperatingSystem":"Docker Desktop","OSType":"linux","Architecture":"x86_64","IndexServerAddress":"https://index.docker.io/v1/","RegistryConfig":{"AllowNondistributableArtifactsCIDRs":[],"AllowNondistributableArtifactsHostnames":[],"InsecureRegistryCIDRs":["127.0.0.0/8"],"IndexConfigs":{"docker.io":{"Name":"docker.io","Mirrors":[],"Secure":true,"Official":true}},"Mirrors":[]},"NCPU":4,"MemTotal":10454695936,"GenericResources":null,"DockerRootDir":"/var/lib/docker","HttpProxy":"","HttpsProxy":"","NoProxy":"","Name":"docker-desktop","Labels":[],"ExperimentalBuild":false,"ServerVersion":"19.03.12","ClusterStore":"","ClusterAdvertise":"","Runtimes":{"runc":{"path":"runc"}},"DefaultRuntime":"runc","Swarm":{"NodeID":"","NodeAddr":"","LocalNodeState":"inactive","ControlAvailable":false,"Error":"","RemoteManagers":null},"LiveRestoreEnabled":false,"Isolation":"","InitBinary":"docker-init","ContainerdCommit":{"ID":"7ad184331fa3e55e52b890ea95e65ba581ae3429","Expected":"7ad184331fa3e55e52b890ea95e65ba581ae3429"},"RuncCommit":{"ID":"dc9208a3303feef5b3839f4323d9beb36df0a9dd","Expected":"dc9208a3303feef5b3839f4323d9beb36df0a9dd"},"InitCommit":{"ID":"fec3683","Expected":"fec3683"},"SecurityOptions":["name=seccomp,profile=default"],"ProductLicense":"Community Engine","Warnings":null,"ClientInfo":{"Debug":false,"Plugins":[],"Warnings":null}}
`,
ShouldError: false,
CPUs: 4,
Memory: 10454695936,
OS: "linux",
}, {
Name: "podman_1.8_linux",
OciBin: "podman",
RawJSON: `{
"host": {
"BuildahVersion": "1.13.1",
"CgroupVersion": "v1",
"Conmon": {
"package": "conmon: /usr/libexec/podman/conmon",
"path": "/usr/libexec/podman/conmon",
"version": "conmon version 2.0.10, commit: unknown"
},
"Distribution": {
"distribution": "debian",
"version": "10"
},
"MemFree": 4907147264,
"MemTotal": 7839653888,
"OCIRuntime": {
"name": "runc",
"package": "runc: /usr/sbin/runc",
"path": "/usr/sbin/runc",
"version": "runc version 1.0.0~rc6+dfsg1\ncommit: 1.0.0~rc6+dfsg1-3 spec: 1.0.1"
},
"SwapFree": 0,
"SwapTotal": 0,
"arch": "amd64",
"cpus": 2,
"eventlogger": "journald",
"hostname": "podman-exp-temp",
"kernel": "4.19.0-8-cloud-amd64",
"os": "linux",
"rootless": false,
"uptime": "2690h 47m 23.31s (Approximately 112.08 days)"
},
"registries": {
"search": [
"docker.io",
"quay.io"
]
},
"store": {
"ConfigFile": "/etc/containers/storage.conf",
"ContainerStore": {
"number": 1
},
"GraphDriverName": "overlay",
"GraphOptions": {},
"GraphRoot": "/var/lib/containers/storage",
"GraphStatus": {
"Backing Filesystem": "extfs",
"Native Overlay Diff": "true",
"Supports d_type": "true",
"Using metacopy": "false"
},
"ImageStore": {
"number": 2
},
"RunRoot": "/var/run/containers/storage",
"VolumePath": "/var/lib/containers/storage/volumes"
}
}
`, CPUs: 2,
Memory: 7839653888,
OS: "linux"},
}
for _, tc := range testCases {
t.Run(tc.Name, func(t *testing.T) {
daemonResponseMock = tc.RawJSON
// setting up mock funcs
dockerInfoGetter = daemonInfoGetterMock
podmanInfoGetter = daemonInfoGetterMock
s, err := DaemonInfo(tc.OciBin)
if err != nil && !tc.ShouldError {
t.Errorf("Expected not to have error but got %v", err)
}
if s.CPUs != tc.CPUs {
t.Errorf("Expected CPUs to be %d but got %d", tc.CPUs, s.CPUs)
}
if s.TotalMemory != tc.Memory {
t.Errorf("Expected Memory to be %d but got %d", tc.Memory, s.TotalMemory)
}
if s.OSType != tc.OS {
t.Errorf("Expected OS type to be %q but got %q", tc.OS, s.OSType)
}
})
}
}

View File

@ -18,6 +18,7 @@ package config
import (
"net"
"time"
"github.com/blang/semver"
)
@ -68,6 +69,7 @@ type ClusterConfig struct {
Nodes []Node
Addons map[string]bool
VerifyComponents map[string]bool // map of components to verify and wait for after start.
StartHostTimeout time.Duration
}
// KubernetesConfig contains the parameters used to configure the VM Kubernetes.

View File

@ -17,6 +17,7 @@ limitations under the License.
package driver
import (
"fmt"
"net"
"k8s.io/minikube/pkg/drivers/kic/oci"
@ -30,6 +31,9 @@ func ControlPlaneEndpoint(cc *config.ClusterConfig, cp *config.Node, driverName
port, err := oci.ForwardedPort(cc.Driver, cc.Name, cp.Port)
hostname := oci.DefaultBindIPV4
ip := net.ParseIP(hostname)
if ip == nil {
return hostname, ip, port, fmt.Errorf("failed to parse ip for %q", hostname)
}
// https://github.com/kubernetes/minikube/issues/3878
if cc.KubernetesConfig.APIServerName != constants.APIServerName {
@ -43,5 +47,9 @@ func ControlPlaneEndpoint(cc *config.ClusterConfig, cp *config.Node, driverName
if cc.KubernetesConfig.APIServerName != constants.APIServerName {
hostname = cc.KubernetesConfig.APIServerName
}
return hostname, net.ParseIP(cp.IP), cp.Port, nil
ip := net.ParseIP(cp.IP)
if ip == nil {
return hostname, ip, cp.Port, fmt.Errorf("failed to parse ip for %q", cp.IP)
}
return hostname, ip, cp.Port, nil
}

View File

@ -42,29 +42,27 @@ func megs(bytes uint64) int64 {
}
// CachedHostInfo returns system information such as memory,CPU, DiskSize
func CachedHostInfo() (*HostInfo, error) {
i, err := cachedCPUInfo()
if err != nil {
glog.Warningf("Unable to get CPU info: %v", err)
return nil, err
func CachedHostInfo() (*HostInfo, error, error, error) {
var cpuErr, memErr, diskErr error
i, cpuErr := cachedCPUInfo()
if cpuErr != nil {
glog.Warningf("Unable to get CPU info: %v", cpuErr)
}
v, err := cachedSysMemLimit()
if err != nil {
glog.Warningf("Unable to get mem info: %v", err)
return nil, err
v, memErr := cachedSysMemLimit()
if memErr != nil {
glog.Warningf("Unable to get mem info: %v", memErr)
}
d, err := cachedDiskInfo()
if err != nil {
glog.Warningf("Unable to get disk info: %v", err)
return nil, err
d, diskErr := cachedDiskInfo()
if diskErr != nil {
glog.Warningf("Unable to get disk info: %v", diskErr)
}
var info HostInfo
info.CPUs = len(i)
info.Memory = megs(v.Total)
info.DiskSize = megs(d.Total)
return &info, nil
return &info, cpuErr, memErr, diskErr
}
// showLocalOsRelease shows systemd information about the current linux distribution, on the local host
@ -111,20 +109,26 @@ func cachedSysMemLimit() (*mem.VirtualMemoryStat, error) {
cachedSystemMemoryLimit = v
cachedSystemMemoryErr = &err
}
if cachedSystemMemoryErr == nil {
return cachedSystemMemoryLimit, nil
}
return cachedSystemMemoryLimit, *cachedSystemMemoryErr
}
var cachedDisk *disk.UsageStat
var cachedDiskInfoeErr *error
var cachedDiskInfoErr *error
// cachedDiskInfo will return a cached disk usage info
func cachedDiskInfo() (disk.UsageStat, error) {
if cachedDisk == nil {
d, err := disk.Usage("/")
cachedDisk = d
cachedDiskInfoeErr = &err
cachedDiskInfoErr = &err
}
return *cachedDisk, *cachedDiskInfoeErr
if cachedDiskInfoErr == nil {
return *cachedDisk, nil
}
return *cachedDisk, *cachedDiskInfoErr
}
var cachedCPU *[]cpu.InfoStat
@ -136,9 +140,9 @@ func cachedCPUInfo() ([]cpu.InfoStat, error) {
i, err := cpu.Info()
cachedCPU = &i
cachedCPUErr = &err
if err != nil {
return nil, *cachedCPUErr
}
}
if cachedCPUErr == nil {
return *cachedCPU, nil
}
return *cachedCPU, *cachedCPUErr
}

View File

@ -157,7 +157,10 @@ func createHost(api libmachine.API, cfg *config.ClusterConfig, n *config.Node) (
cstart := time.Now()
glog.Infof("libmachine.API.Create for %q (driver=%q)", cfg.Name, cfg.Driver)
if err := timedCreateHost(h, api, 4*time.Minute); err != nil {
if cfg.StartHostTimeout == 0 {
cfg.StartHostTimeout = 6 * time.Minute
}
if err := timedCreateHost(h, api, cfg.StartHostTimeout); err != nil {
return nil, errors.Wrap(err, "creating host")
}
glog.Infof("duration metric: libmachine.API.Create for %q took %s", cfg.Name, time.Since(cstart))
@ -251,8 +254,8 @@ func acquireMachinesLock(name string) (mutex.Releaser, error) {
func showHostInfo(cfg config.ClusterConfig) {
machineType := driver.MachineType(cfg.Driver)
if driver.BareMetal(cfg.Driver) {
info, err := CachedHostInfo()
if err == nil {
info, cpuErr, memErr, DiskErr := CachedHostInfo()
if cpuErr == nil && memErr == nil && DiskErr == nil {
register.Reg.SetStep(register.RunningLocalhost)
out.T(out.StartingNone, "Running on localhost (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...", out.V{"number_of_cpus": info.CPUs, "memory_size": info.Memory, "disk_size": info.DiskSize})
}

View File

@ -101,6 +101,9 @@ func String(format string, a ...interface{}) {
glog.Warningf("[unset outFile]: %s", fmt.Sprintf(format, a...))
return
}
glog.Infof(format, a...)
_, err := fmt.Fprintf(outFile, format, a...)
if err != nil {
glog.Errorf("Fprintf failed: %v", err)
@ -144,6 +147,9 @@ func Err(format string, a ...interface{}) {
glog.Errorf("[unset errFile]: %s", fmt.Sprintf(format, a...))
return
}
glog.Warningf(format, a...)
_, err := fmt.Fprintf(errFile, format, a...)
if err != nil {
glog.Errorf("Fprint failed: %v", err)

View File

@ -44,6 +44,9 @@ func cmdOut(args ...string) (string, error) {
err := cmd.Run()
glog.Infof("[stdout =====>] : %s", stdout.String())
glog.Infof("[stderr =====>] : %s", stderr.String())
if err != nil {
glog.Infof("[err =====>] : %v", err)
}
return stdout.String(), err
}

View File

@ -91,7 +91,7 @@ minikube start [flags]
--vm Filter to use only VM Drivers
--vm-driver driver DEPRECATED, use driver instead.
--wait strings comma separated list of Kubernetes components to verify and wait for after starting a cluster. defaults to "apiserver,system_pods", available options: "apiserver,system_pods,default_sa,apps_running,node_ready" . other acceptable values are 'all' or 'none', 'true' and 'false' (default [apiserver,system_pods])
--wait-timeout duration max time to wait per Kubernetes core services to be healthy. (default 6m0s)
--wait-timeout duration max time to wait per Kubernetes or host to be healthy. (default 6m0s)
```
### Options inherited from parent commands

View File

@ -4,7 +4,7 @@ This is an experimental driver. Please use it only for experimental reasons unti
## Usage
It's recommended to run minikube with the podman driver and [CRI-O container runtime](https://https://cri-o.io/):
It's recommended to run minikube with the podman driver and [CRI-O container runtime](https://cri-o.io/):
```shell
minikube start --driver=podman --container-runtime=cri-o

View File

@ -165,7 +165,10 @@ func TestDownloadOnlyKic(t *testing.T) {
args := []string{"start", "--download-only", "-p", profile, "--force", "--alsologtostderr"}
args = append(args, StartArgs()...)
if _, err := Run(t, exec.CommandContext(ctx, Target(), args...)); err != nil {
cmd := exec.CommandContext(ctx, Target(), args...)
// make sure this works even if docker daemon isn't running
cmd.Env = append(os.Environ(), "DOCKER_HOST=/does/not/exist")
if _, err := Run(t, cmd); err != nil {
t.Errorf("start with download only failed %q : %v", args, err)
}

View File

@ -40,7 +40,10 @@ func TestAddons(t *testing.T) {
ctx, cancel := context.WithTimeout(context.Background(), Minutes(40))
defer Cleanup(t, profile, cancel)
args := append([]string{"start", "-p", profile, "--wait=false", "--memory=2600", "--alsologtostderr", "--addons=ingress", "--addons=registry", "--addons=metrics-server", "--addons=helm-tiller", "--addons=olm"}, StartArgs()...)
args := append([]string{"start", "-p", profile, "--wait=false", "--memory=2600", "--alsologtostderr", "--addons=registry", "--addons=metrics-server", "--addons=helm-tiller", "--addons=olm"}, StartArgs()...)
if !NoneDriver() { // none doesn't support ingress
args = append(args, "--addons=ingress")
}
rr, err := Run(t, exec.CommandContext(ctx, Target(), args...))
if err != nil {
t.Fatalf("%s failed: %v", rr.Command(), err)

View File

@ -126,7 +126,7 @@ func createPVTestPod(ctx context.Context, t *testing.T, profile string) {
t.Fatalf("kubectl apply pvc.yaml failed: args %q: %v", rr.Command(), err)
}
// wait for pod to be running
if _, err := PodWait(ctx, t, profile, "default", "test=storage-provisioner", Minutes(1)); err != nil {
if _, err := PodWait(ctx, t, profile, "default", "test=storage-provisioner", Minutes(3)); err != nil {
t.Fatalf("failed waiting for pod: %v", err)
}
}

View File

@ -211,7 +211,7 @@ func validateStartWithProxy(ctx context.Context, t *testing.T, profile string) {
// Use more memory so that we may reliably fit MySQL and nginx
// changing api server so later in soft start we verify it didn't change
startArgs := append([]string{"start", "-p", profile, "--memory=2800", fmt.Sprintf("--apiserver-port=%d", apiPortTest), "--wait=true"}, StartArgs()...)
startArgs := append([]string{"start", "-p", profile, "--memory=4000", fmt.Sprintf("--apiserver-port=%d", apiPortTest), "--wait=true"}, StartArgs()...)
c := exec.CommandContext(ctx, Target(), startArgs...)
env := os.Environ()
env = append(env, fmt.Sprintf("HTTP_PROXY=%s", srv.Addr))
@ -247,7 +247,7 @@ func validateSoftStart(ctx context.Context, t *testing.T, profile string) {
t.Errorf("expected cluster config node port before soft start to be %d but got %d", apiPortTest, beforeCfg.Config.KubernetesConfig.NodePort)
}
softStartArgs := []string{"start", "-p", profile}
softStartArgs := []string{"start", "-p", profile, "--alsologtostderr", "-v=8"}
c := exec.CommandContext(ctx, Target(), softStartArgs...)
rr, err := Run(t, c)
if err != nil {

View File

@ -7,7 +7,7 @@
"'none' driver does not support 'minikube mount' command": "「none」ドライバーは「minikube mount」コマンドをサポートしていません",
"'none' driver does not support 'minikube podman-env' command": "「none」ドライバーは「minikube podman-env」コマンドをサポートしていません",
"'none' driver does not support 'minikube ssh' command": "「none」ドライバーは「minikube ssh」コマンドをサポートしていません",
"'{{.driver}}' driver reported a issue that could affect the performance.": "{{.driver}}」ドライバーがパフォーマンスに影響しうる問題を報告しました。",
"'{{.driver}}' driver reported a issue that could affect the performance.": "{{.driver}}」ドライバーがパフォーマンスに影響しうる問題を報告しました。",
"'{{.driver}}' driver reported an issue: {{.error}}": "「{{.driver}}」ドライバーがエラーを報告しました: {{.error}}",
"- Delete and recreate minikube cluster\n\t\tminikube delete\n\t\tminikube start --driver={{.driver_name}}": "",
"- Docs https://docs.docker.com/docker-for-mac/#resources": "",
@ -31,8 +31,8 @@
"Additional help topics": "追加のトピック",
"Additional mount options, such as cache=fscache": "cache=fscache などの追加のマウントオプション",
"Adds a node to the given cluster config, and starts it.": "ノードをクラスタの設定に追加して、起動します",
"Adds a node to the given cluster.": "ノードをクラスタに追加します",
"Advanced Commands:": "高度なコマンド",
"Adds a node to the given cluster.": "ノードをクラスタに追加します",
"Advanced Commands:": "高度なコマンド:",
"Aliases": "エイリアス",
"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": "Docker イメージの pull 元の代替イメージ リポジトリ。これは、gcr.io へのアクセスが制限されている場合に使用できます。これを \\\"auto\\\" に設定すると、minikube によって自動的に指定されるようになります。中国本土のユーザーの場合、registry.cn-hangzhou.aliyuncs.com/google_containers などのローカル gcr.io ミラーを使用できます",
@ -43,8 +43,8 @@
"Another program is using a file required by minikube. If you are using Hyper-V, try stopping the minikube VM from within the Hyper-V manager": "",
"Automatically selected the {{.driver}} driver": "{{.driver}}ドライバーが自動的に選択されました",
"Automatically selected the {{.driver}} driver. Other choices: {{.alternates}}": "{{.driver}}ドライバーが自動的に選択されました。他の選択肢: {{.alternates}}",
"Available Commands": "利用可能なコマンド",
"Basic Commands:": "基本的なコマンド",
"Available Commands:": "利用可能なコマンド:",
"Basic Commands:": "基本的なコマンド:",
"Because you are using a Docker driver on {{.operating_system}}, the terminal needs to be open to run it.": "Dockerドライバーを{{.operating_system}}上で動かしているため、実行するにはターミナルを開く必要があります。",
"Bind Address: {{.Address}}": "アドレスをバインドします: {{.Address}}",
"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.": "",
@ -59,17 +59,17 @@
"Check that your --kubernetes-version has a leading 'v'. For example: 'v1.1.14'": "",
"Check your firewall rules for interference, and run 'virt-host-validate' to check for KVM configuration issues. If you are running minikube within a VM, consider using --driver=none": "",
"Choose a smaller value for --memory, such as 2000": "",
"Configuration and Management Commands:": "",
"Configuration and Management Commands:": "設定及び管理コマンド:",
"Configure a default route on this Linux host, or use another --driver that does not require it": "",
"Configure an external network switch following the official documentation, then add `--hyperv-virtual-switch=\u003cswitch-name\u003e` to `minikube start`": "",
"Configure environment to use minikube's Docker daemon": "",
"Configure environment to use minikube's Podman service": "",
"Configure environment to use minikube's Docker daemon": "minikube の Docker デーモンを使うように環境を設定します",
"Configure environment to use minikube's Podman service": "minikube の Podman サービスを使うように環境を設定します",
"Configures the addon w/ADDON_NAME within minikube (example: minikube addons configure registry-creds). For a list of available addons use: minikube addons list": "",
"Configuring local host environment ...": "",
"Configuring {{.name}} (Container Networking Interface) ...": "",
"Confirm that you have a working internet connection and that your VM has not run out of resources by using: 'minikube logs'": "",
"Confirm that you have supplied the correct value to --hyperv-virtual-switch using the 'Get-VMSwitch' command": "",
"Connect to LoadBalancer services": "",
"Connect to LoadBalancer services": "LoadBalancer サービスに接続します",
"Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB`": "",
"Consider increasing Docker Desktop's memory size.": "",
"Could not determine a Google Cloud project, which might be ok.": "",
@ -120,7 +120,7 @@
"Enable addons. see `minikube addons list` for a list of valid addon names.": "",
"Enable experimental NVIDIA GPU support in minikube": "minikube での試験運用版 NVIDIA GPU の対応を有効にします",
"Enable host resolver for NAT DNS requests (virtualbox driver only)": "NAT DNS リクエスト用のホストリゾルバを有効にしますvirtualbox ドライバのみ)",
"Enable or disable a minikube addon": "",
"Enable or disable a minikube addon": "minikube のアドオンを有効化または無効化します",
"Enable proxy for NAT DNS requests (virtualbox driver only)": "NAT DNS リクエスト用のプロキシを有効にしますvirtualbox ドライバのみ)",
"Enabled addons: {{.addons}}": "有効なアドオン: {{.addons}}",
"Enables the addon w/ADDON_NAME within minikube (example: minikube addons enable dashboard). For a list of available addons use: minikube addons list": "",
@ -210,12 +210,12 @@
"Format to print stdout in. Options include: [text,json]": "",
"Found network options:": "ネットワーク オプションが見つかりました",
"Found {{.number}} invalid profile(s) !": "",
"Generate command completion for a shell": "",
"Generate command completion for a shell": "シェルのコマンド補完コードを生成します",
"Generate unable to parse disk size '{{.diskSize}}': {{.error}}": "",
"Generate unable to parse memory '{{.memory}}': {{.error}}": "",
"Get or list the current profiles (clusters)": "",
"Get or list the current profiles (clusters)": "現在指定しているクラスタプロファイルを取得、またはリストアップします",
"Gets the logs of the running instance, used for debugging minikube, not user code.": "",
"Gets the status of a local Kubernetes cluster": "",
"Gets the status of a local Kubernetes cluster": "ローカル Kubernetes クラスタの状態を取得します",
"Gets the status of a local Kubernetes cluster.\n\tExit status contains the status of minikube's VM, cluster and Kubernetes encoded on it's bits in this order from right to left.\n\tEg: 7 meaning: 1 (for minikube NOK) + 2 (for cluster NOK) + 4 (for Kubernetes NOK)": "",
"Gets the value of PROPERTY_NAME from the minikube config file": "",
"Global Flags": "グローバルなフラグ",
@ -244,7 +244,7 @@
"If you are running minikube within a VM, consider using --driver=none:": "",
"If you are still interested to make {{.driver_name}} driver work. The following suggestions might help you get passed this issue:": "",
"If you don't want your credentials mounted into a specific pod, add a label with the `gcp-auth-skip-secret` key to your pod configuration.": "",
"Images Commands:": "イメージ用コマンド",
"Images Commands:": "イメージ用コマンド:",
"In order to use the fall back image, you need to log in to the github packages registry": "",
"Increase Docker for Desktop memory to at least 2.5GB or more:\n\t\t\t\n\tDocker for Desktop \u003e Settings \u003e Resources \u003e Memory": "",
"Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.": "",
@ -275,22 +275,22 @@
"Location of the minikube iso": "minikube iso のロケーション",
"Locations to fetch the minikube ISO from.": "",
"Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'.": "",
"Log into the minikube environment (for debugging)": "",
"Log into the minikube environment (for debugging)": "minikube の環境にログインします(デバッグ用)",
"Message Size: {{.size}}": "メッセージのサイズ: {{.size}}",
"Modify minikube config": "minikube の設定を修正しています",
"Modify minikube's kubernetes addons": "minikube の Kubernetes アドオンを修正しています",
"Modify persistent configuration values": "",
"Modify persistent configuration values": "永続的な設定値を変更します",
"Most users should use the newer 'docker' driver instead, which does not require root!": "",
"Mount type: {{.name}}": "マウントタイプ: {{.name}}",
"Mounting host path {{.sourcePath}} into VM as {{.destinationPath}} ...": "",
"Mounts the specified directory into minikube": "",
"Mounts the specified directory into minikube": "minikube に指定されたディレクトリをマウントします",
"Mounts the specified directory into minikube.": "",
"Multi-node clusters are currently experimental and might exhibit unintended behavior.": "",
"Multiple errors deleting profiles": "プロフィールを削除中に複数のエラーが発生しました",
"Multiple minikube profiles were found -": "複数の minikube のプロフィールが見つかりました",
"NIC Type used for host only network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only)": "",
"NOTE: This process must stay alive for the mount to be accessible ...": "",
"Networking and Connectivity Commands:": "",
"Networking and Connectivity Commands:": "ネットワーキング及び接続性コマンド:",
"No changes required for the \"{{.context}}\" context": "",
"No minikube profile was found. You can create one using `minikube start`.": "",
"Node \"{{.node_name}}\" stopped.": "「{{.node_name}}」ノードが停止しました。",
@ -322,8 +322,8 @@
"Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash-completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion": "",
"Pause": "",
"Paused {{.count}} containers": "",
"Paused {{.count}} containers in: {{.namespaces}}": "",
"Pausing node {{.name}} ...": "",
"Paused {{.count}} containers in: {{.namespaces}}": "次のnamespaceに存在する {{.count}} 個のコンテナを停止しました: {{.namespaces}}",
"Pausing node {{.name}} ...": "ノード {{.name}} を一時停止しています ...",
"Permissions: {{.octalMode}} ({{.writtenMode}})": "",
"Please change Docker settings to use Linux containers instead of Windows containers.": "",
"Please consider changing your Docker Desktop's resources.": "",
@ -346,9 +346,9 @@
"Populates the specified folder with documentation in markdown about minikube": "",
"Powering off \"{{.profile_name}}\" via SSH ...": "SSH 経由で「{{.profile_name}}」の電源をオフにしています...",
"Preparing Kubernetes {{.k8sVersion}} on {{.runtime}} {{.runtimeVersion}} ...": "{{.runtime}} {{.runtimeVersion}} で Kubernetes {{.k8sVersion}} を準備しています...",
"Print current and latest version number": "",
"Print current and latest version number": "使用中および最新の minikube バージョン番号を表示します",
"Print just the version number.": "",
"Print the version of minikube": "",
"Print the version of minikube": "使用中の minikube バージョン番号を表示します",
"Print the version of minikube.": "",
"Problems detected in {{.entry}}:": "",
"Problems detected in {{.name}}:": "",
@ -368,7 +368,7 @@
"Related issues:": "",
"Relaunching Kubernetes using {{.bootstrapper}} ...": "{{.bootstrapper}} を使用して Kubernetes を再起動しています...",
"Remove the incompatible --docker-opt flag if one was provided": "",
"Removed all traces of the \"{{.name}}\" cluster.": "クラスタ \"{{.name}}\" の全てのトレースを削除しました。",
"Removed all traces of the \"{{.name}}\" cluster.": "クラスタ \"{{.name}}\" の全てのトレースを削除しました。",
"Removing {{.directory}} ...": "{{.directory}} を削除しています...",
"Requested cpu count {{.requested_cpus}} is less than the minimum allowed of {{.minimum_cpus}}": "",
"Requested disk size {{.requested_size}} is less than minimum of {{.minimum_size}}": "リクエストされたディスクサイズ {{.requested_size}} が最小値 {{.minimum_size}} 未満です",
@ -379,22 +379,22 @@
"Requested memory allocation {{.requested}}MB is more than your system limit {{.system_limit}}MB. Try specifying a lower memory:\n\n\tminiube start --memory={{.min_advised}}mb": "",
"Restart Docker": "",
"Restart Docker, Ensure docker is running and then run: 'minikube delete' and then 'minikube start' again": "",
"Restarting existing {{.driver_name}} {{.machine_type}} for \"{{.cluster}}\" ...": "既存の{{.driver_name}} {{.machine_type}}を\"{{.cluster}}\"のために再起動しています...",
"Restarting existing {{.driver_name}} {{.machine_type}} for \"{{.cluster}}\" ...": "既存の {{.driver_name}} {{.machine_type}} \"{{.cluster}}\" のために再起動しています...",
"Restarting the {{.name}} service may improve performance.": "",
"Retrieve the ssh identity key path of the specified cluster": "",
"Retrieve the ssh identity key path of the specified cluster": "指定されたクラスタの SSH 鍵のパスを取得します",
"Retrieve the ssh identity key path of the specified cluster.": "",
"Retrieves the IP address of the running cluster": "",
"Retrieves the IP address of the running cluster": "実行中のクラスタの IP アドレスを取得します",
"Retrieves the IP address of the running cluster, and writes it to STDOUT.": "",
"Retrieves the IP address of the running cluster, checks it\n\t\t\twith IP in kubeconfig, and corrects kubeconfig if incorrect.": "",
"Returns a URL to connect to a service": "",
"Returns logs to debug a local Kubernetes cluster": "",
"Returns a URL to connect to a service": "サービスに接続するための URL を返します",
"Returns logs to debug a local Kubernetes cluster": "ローカル Kubernetes クラスタをデバッグするためのログを返します",
"Returns the Kubernetes URL for a service in your local cluster. In the case of multiple URLs they will be printed one at a time.": "",
"Returns the value of PROPERTY_NAME from the minikube config file. Can be overwritten at runtime by flags or environmental variables.": "",
"Right-click the PowerShell icon and select Run as Administrator to open PowerShell in elevated mode.": "",
"Run 'kubectl describe pod coredns -n kube-system' and check for a firewall or DNS conflict": "",
"Run 'minikube delete' to delete the stale VM, or and ensure that minikube is running as the same user you are issuing this command with": "",
"Run 'sudo sysctl fs.protected_regular=0', or try a driver which does not require root, such as '--driver=docker'": "",
"Run a kubectl binary matching the cluster version": "",
"Run a kubectl binary matching the cluster version": "クラスタのバージョンに適合する kubectl のバイナリを実行します",
"Run minikube from the C: drive.": "",
"Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nExamples:\nminikube kubectl -- --help\nminikube kubectl -- get pods --namespace kube-system": "",
"Run: 'chmod 600 $HOME/.kube/config'": "",
@ -431,11 +431,11 @@
"Specify the ip that the mount should be setup on": "",
"Specify the mount filesystem type (supported types: 9p)": "",
"StartHost failed, but will try again: {{.error}}": "",
"Starting control plane node {{.name}} in cluster {{.cluster}}": "コントロールプレーンのノード{{.name}}を{{.cluster}}上で起動しています",
"Starting control plane node {{.name}} in cluster {{.cluster}}": "コントロールプレーンのノード {{.name}} {{.cluster}} 上で起動しています",
"Starting node {{.name}} in cluster {{.cluster}}": "",
"Starting tunnel for service {{.service}}.": "",
"Starts a local Kubernetes cluster": "",
"Starts a local kubernetes cluster": "ローカル Kubernetes クラスタを起動します",
"Starts a local Kubernetes cluster": "ローカル Kubernetes クラスタを起動します",
"Starts a local kubernetes cluster": "ローカル Kubernetes クラスタを起動します",
"Starts a node.": "",
"Starts an existing stopped node in a cluster.": "",
"Startup with {{.old_driver}} driver failed, trying with alternate driver {{.new_driver}}: {{.error}}": "",
@ -443,7 +443,7 @@
"Stopping tunnel for service {{.service}}.": "サービス {{.service}} のトンネルを停止しています。",
"Stops a local Kubernetes cluster running in Virtualbox. This command stops the VM\nitself, leaving all files intact. The cluster can be started again with the \"start\" command.": "",
"Stops a node in a cluster.": "",
"Stops a running local Kubernetes cluster": "",
"Stops a running local Kubernetes cluster": "ローカル Kubernetes クラスタを停止します",
"Successfully added {{.name}} to {{.cluster}}!": "",
"Successfully deleted all profiles": "",
"Successfully mounted {{.sourcePath}} to {{.destinationPath}}": "",
@ -555,7 +555,7 @@
"To suppress memory validations you can use --force flag.": "",
"To track progress on multi-node clusters, see https://github.com/kubernetes/minikube/issues/7538.": "",
"To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run:": "kubectl か minikube コマンドを独自のユーザーとして使用するには、そのコマンドの再配置が必要な場合があります。たとえば、独自の設定を上書きするには、以下を実行します",
"Troubleshooting Commands:": "",
"Troubleshooting Commands:": "トラブルシュート用コマンド:",
"Try 'minikube delete' to force new SSL certificates to be installed": "",
"Try 'minikube delete', and disable any conflicting VPN or firewall software": "",
"Try specifying a --driver, or see https://minikube.sigs.k8s.io/docs/start/": "",
@ -594,11 +594,11 @@
"Uninstalling Kubernetes {{.kubernetes_version}} using {{.bootstrapper_name}} ...": "{{.bootstrapper_name}} を使用して Kubernetes {{.kubernetes_version}} をアンインストールしています...",
"Unmounting {{.path}} ...": "",
"Unpaused {{.count}} containers": "",
"Unpaused {{.count}} containers in: {{.namespaces}}": "",
"Unpausing node {{.name}} ...": "",
"Unpaused {{.count}} containers in: {{.namespaces}}": "次のnamespaceに存在する {{.count}} 個のコンテナを再稼働させました: {{.namespaces}}",
"Unpausing node {{.name}} ...": "ノード {{.name}} を再稼働させています ...",
"Unset the KUBECONFIG environment variable, or verify that it does not point to an empty or otherwise invalid path": "",
"Unset variables instead of setting them": "",
"Update kubeconfig in case of an IP or port change": "",
"Update kubeconfig in case of an IP or port change": "IP アドレスやポート番号が変わった場合に kubeconfig を更新します",
"Update server returned an empty list": "",
"Updating the running {{.driver_name}} \"{{.cluster}}\" {{.machine_type}} ...": "",
"Upgrade to QEMU v3.1.0+, run 'virt-host-validate', or ensure that you are not running in a nested VM environment.": "",
@ -630,7 +630,7 @@
"Validation unable to parse disk size '{{.diskSize}}': {{.error}}": "検証中に、ディスクのサイズ( {{.diskSize}} )をパースできませんでした。{{.error}}",
"Verify that your HTTP_PROXY and HTTPS_PROXY environment variables are set correctly.": "HTTP_PROXY と HTTPS_PROXY 環境変数が正常に設定されているかを確認します",
"Verify the IP address of the running cluster in kubeconfig.": "Kubernetes の設定ファイルのクラスタの IP アドレスを確認します",
"Verifying Kubernetes components...": "Kubernetesコンポーネントを検証しています...",
"Verifying Kubernetes components...": "Kubernetes コンポーネントを検証しています...",
"Verifying dashboard health ...": "ダッシュボードの状態を確認しています...",
"Verifying proxy health ...": "プロキシの状態を確認しています...",
"Verifying {{.addon_name}} addon...": "",
@ -716,7 +716,7 @@
"minikube is unable to access the Google Container Registry. You may need to configure it to use a HTTP proxy.": "minikube が Google Container Registry に接続できません。 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": "minikube が VM に接続できませんでした。 {{.error}}\n\n\t考えられる理由は以下の二つです。\n\n\t- VPN 、あるいはファイアウォールによる干渉\n\t- {{.hypervisor}} のネットワークの設定での問題\n\n\t迂回策には以下があります。\n\n\t- ローカルの VPN 、あるいはファイアウォールを無効にする\n\t- {{.ip}} へのアクセスを許可するようにローカルの VPN 、あるいはファイアウォールを設定する\n\t- {{.hypervisor}} を再起動、あるいは再インストールする\n\t- 別の VM ドライバーを使用する\n\t- --force を使用してこの接続チェックを上書きする",
"minikube profile was successfully set to {{.profile_name}}": "{{.profile_name}} の値が minikube のプロフィールに正常に設定されました",
"minikube provisions and manages local Kubernetes clusters optimized for development workflows.": "",
"minikube provisions and manages local Kubernetes clusters optimized for development workflows.": "minikube は、開発ワークフロー用に最適化されたローカル Kubernetes クラスタをプロビジョンおよび管理します。",
"minikube quickly sets up a local Kubernetes cluster": "",
"minikube status --output OUTPUT. json, text": "minikube status --output OUTPUT. json, text",
"minikube {{.version}} is available! Download it: {{.url}}": "minikube {{.version}} が利用可能です! 以下のURLでダウンロードできます。 {{.url}}",
@ -725,11 +725,11 @@
"mount failed": "マウントが失敗しました",
"namespaces to pause": "停止する名前空間",
"namespaces to unpause": "停止を解除する名前空間",
"none driver does not support multi-node clusters": "マルチクラスタをサポートしているドライバーがありません",
"none driver does not support multi-node clusters": "マルチクラスタをサポートしているドライバーがありません",
"not enough arguments ({{.ArgCount}}).\\nusage: minikube config set PROPERTY_NAME PROPERTY_VALUE": "引数({{.ArgCount}})が少なすぎます。\\n使用方法: minikube config set PROPERTY_NAME PROPERTY_VALUE",
"output layout (EXPERIMENTAL, JSON only): 'nodes' or 'cluster'": "",
"pause Kubernetes": "",
"pause containers": "コンテナを停止させます",
"pause Kubernetes": "Kubernetes を一時停止させます",
"pause containers": "コンテナを一時停止させます",
"profile sets the current minikube profile, or gets the current profile if no arguments are provided. This is used to run and manage multiple minikube instance. You can return to the default minikube profile by running `minikube profile default`": "profile で現在の minikube のプロフィールの値を設定することができます。profil に引数を渡さなければ、現在のプロフィールを見ることができます。このコマンドは複数の minikube インスタンスを管理するのに使用されます。「 minikube profile default 」で minikube のデフォルトのプロフィールを見ることができます",
"provisioning host for node": "",
"reload cached images.": "キャッシュしていたイメージから再読み込みをします",
@ -767,7 +767,7 @@
"{{ .name }}: {{ .rejection }}": "{{ .name }}: {{ .rejection }}",
"{{.cluster}} IP has been updated to point at {{.ip}}": "{{.cluster}} の IP アドレスは {{.ip}} へと更新されました",
"{{.cluster}} IP was already correctly configured for {{.ip}}": "{{.cluster}} の IP アドレスは {{.ip}} としてすでに正常に設定されています",
"{{.count}} nodes stopped.": "{{.count}}台のノードが停止しました",
"{{.count}} nodes stopped.": "{{.count}}台のノードが停止しました",
"{{.driver_name}} \"{{.cluster}}\" {{.machine_type}} is missing, will recreate.": "{{.driver_name}} 「 {{.cluster}} 」 {{.machine_type}} がありません。再生成します。",
"{{.driver_name}} couldn't proceed because {{.driver_name}} service is not healthy.": "",
"{{.driver_name}} has only {{.container_limit}}MB memory but you specified {{.specified_memory}}MB": "",