Merge branch 'master' of github.com:sharifelgamal/minikube into gcp-cs
commit
4bc5cb77d1
10
Makefile
10
Makefile
|
@ -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.22.0-1628622362-12032
|
||||
ISO_VERSION ?= v1.22.0-1628974786-12268
|
||||
# Dashes are valid in semver, but not Linux packaging. Use ~ to delimit alpha/beta
|
||||
DEB_VERSION ?= $(subst -,~,$(RAW_VERSION))
|
||||
DEB_REVISION ?= 0
|
||||
|
@ -40,7 +40,7 @@ KVM_GO_VERSION ?= $(GO_VERSION:.0=)
|
|||
|
||||
|
||||
INSTALL_SIZE ?= $(shell du out/minikube-windows-amd64.exe | cut -f1)
|
||||
BUILDROOT_BRANCH ?= 2020.02.12
|
||||
BUILDROOT_BRANCH ?= 2021.02.4
|
||||
REGISTRY ?= gcr.io/k8s-minikube
|
||||
|
||||
# Get git commit id
|
||||
|
@ -66,10 +66,10 @@ MINIKUBE_BUCKET ?= minikube/releases
|
|||
MINIKUBE_UPLOAD_LOCATION := gs://${MINIKUBE_BUCKET}
|
||||
MINIKUBE_RELEASES_URL=https://github.com/kubernetes/minikube/releases/download
|
||||
|
||||
KERNEL_VERSION ?= 4.19.182
|
||||
KERNEL_VERSION ?= 4.19.202
|
||||
# latest from https://github.com/golangci/golangci-lint/releases
|
||||
# update this only by running `make update-golint-version`
|
||||
GOLINT_VERSION ?= v1.41.1
|
||||
GOLINT_VERSION ?= v1.42.0
|
||||
# Limit number of default jobs, to avoid the CI builds running out of memory
|
||||
GOLINT_JOBS ?= 4
|
||||
# see https://github.com/golangci/golangci-lint#memory-usage-of-golangci-lint
|
||||
|
@ -282,8 +282,6 @@ minikube_iso: deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/usr/b
|
|||
git clone --depth=1 --branch=$(BUILDROOT_BRANCH) https://github.com/buildroot/buildroot $(BUILD_DIR)/buildroot; \
|
||||
fi;
|
||||
$(MAKE) BR2_EXTERNAL=../../deploy/iso/minikube-iso minikube_defconfig -C $(BUILD_DIR)/buildroot
|
||||
mkdir -p $(BUILD_DIR)/buildroot/output/build
|
||||
echo "module buildroot.org/go" > $(BUILD_DIR)/buildroot/output/build/go.mod
|
||||
$(MAKE) -C $(BUILD_DIR)/buildroot host-python
|
||||
$(MAKE) -C $(BUILD_DIR)/buildroot
|
||||
mv $(BUILD_DIR)/buildroot/output/images/rootfs.iso9660 $(BUILD_DIR)/minikube.iso
|
||||
|
|
|
@ -20,6 +20,7 @@ limitations under the License.
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
|
@ -33,6 +34,7 @@ import (
|
|||
apiWait "k8s.io/apimachinery/pkg/util/wait"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"gopkg.in/yaml.v2"
|
||||
"k8s.io/klog/v2"
|
||||
|
||||
kconst "k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
||||
|
@ -384,12 +386,94 @@ func dockerSetScript(ec DockerEnvConfig, w io.Writer) error {
|
|||
dockerSetEnvTmpl = dockerEnvTCPTmpl
|
||||
}
|
||||
envVars := dockerEnvVars(ec)
|
||||
if ec.Shell == "none" {
|
||||
switch outputFormat {
|
||||
case "":
|
||||
// shell "none"
|
||||
break
|
||||
case "text":
|
||||
for k, v := range envVars {
|
||||
_, err := fmt.Fprintf(w, "%s=%s\n", k, v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
case "json":
|
||||
json, err := json.Marshal(envVars)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = w.Write(json)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = w.Write([]byte{'\n'})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
case "yaml":
|
||||
yaml, err := yaml.Marshal(envVars)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = w.Write(yaml)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
default:
|
||||
exit.Message(reason.InternalOutputUsage, "error: --output must be 'text', 'yaml' or 'json'")
|
||||
}
|
||||
}
|
||||
return shell.SetScript(ec.EnvConfig, w, dockerSetEnvTmpl, dockerShellCfgSet(ec, envVars))
|
||||
}
|
||||
|
||||
// dockerSetScript writes out a shell-compatible 'docker-env unset' script
|
||||
func dockerUnsetScript(ec DockerEnvConfig, w io.Writer) error {
|
||||
vars := dockerEnvNames(ec)
|
||||
if ec.Shell == "none" {
|
||||
switch outputFormat {
|
||||
case "":
|
||||
// shell "none"
|
||||
break
|
||||
case "text":
|
||||
for _, n := range vars {
|
||||
_, err := fmt.Fprintf(w, "%s\n", n)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
case "json":
|
||||
json, err := json.Marshal(vars)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = w.Write(json)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = w.Write([]byte{'\n'})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
case "yaml":
|
||||
yaml, err := yaml.Marshal(vars)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = w.Write(yaml)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
default:
|
||||
exit.Message(reason.InternalOutputUsage, "error: --output must be 'text', 'yaml' or 'json'")
|
||||
}
|
||||
}
|
||||
return shell.UnsetScript(ec.EnvConfig, w, vars)
|
||||
}
|
||||
|
||||
|
@ -508,5 +592,6 @@ func init() {
|
|||
dockerEnvCmd.Flags().BoolVar(&sshHost, "ssh-host", false, "Use SSH connection instead of HTTPS (port 2376)")
|
||||
dockerEnvCmd.Flags().BoolVar(&sshAdd, "ssh-add", false, "Add SSH identity key to SSH authentication agent")
|
||||
dockerEnvCmd.Flags().StringVar(&shell.ForceShell, "shell", "", "Force environment to be configured for a specified shell: [fish, cmd, powershell, tcsh, bash, zsh], default is auto-detect")
|
||||
dockerEnvCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "One of 'text', 'yaml' or 'json'.")
|
||||
dockerEnvCmd.Flags().BoolVarP(&dockerUnset, "unset", "u", false, "Unset variables instead of setting them")
|
||||
}
|
||||
|
|
|
@ -18,10 +18,14 @@ package cmd
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"os"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/google/go-cmp/cmp/cmpopts"
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
type FakeNoProxyGetter struct {
|
||||
|
@ -36,13 +40,16 @@ func (f FakeNoProxyGetter) GetNoProxyVar() (string, string) {
|
|||
func TestGenerateDockerScripts(t *testing.T) {
|
||||
var tests = []struct {
|
||||
shell string
|
||||
output string
|
||||
config DockerEnvConfig
|
||||
noProxyGetter *FakeNoProxyGetter
|
||||
wantSet string
|
||||
wantUnset string
|
||||
diffOpts []cmp.Option
|
||||
}{
|
||||
{
|
||||
"bash",
|
||||
"",
|
||||
DockerEnvConfig{profile: "dockerdriver", driver: "docker", hostIP: "127.0.0.1", port: 32842, certsDir: "/certs"},
|
||||
nil,
|
||||
`export DOCKER_TLS_VERIFY="1"
|
||||
|
@ -58,9 +65,11 @@ unset DOCKER_HOST;
|
|||
unset DOCKER_CERT_PATH;
|
||||
unset MINIKUBE_ACTIVE_DOCKERD;
|
||||
`,
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"bash",
|
||||
"",
|
||||
DockerEnvConfig{profile: "dockerdriver", driver: "docker", ssh: true, username: "root", hostname: "host", sshport: 22},
|
||||
nil,
|
||||
`export DOCKER_HOST="ssh://root@host:22"
|
||||
|
@ -74,9 +83,11 @@ unset DOCKER_HOST;
|
|||
unset DOCKER_CERT_PATH;
|
||||
unset MINIKUBE_ACTIVE_DOCKERD;
|
||||
`,
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"bash",
|
||||
"",
|
||||
DockerEnvConfig{profile: "bash", driver: "kvm2", hostIP: "127.0.0.1", port: 2376, certsDir: "/certs"},
|
||||
nil,
|
||||
`export DOCKER_TLS_VERIFY="1"
|
||||
|
@ -92,9 +103,11 @@ unset DOCKER_HOST;
|
|||
unset DOCKER_CERT_PATH;
|
||||
unset MINIKUBE_ACTIVE_DOCKERD;
|
||||
`,
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"bash",
|
||||
"",
|
||||
DockerEnvConfig{profile: "ipv6", driver: "kvm2", hostIP: "fe80::215:5dff:fe00:a903", port: 2376, certsDir: "/certs"},
|
||||
nil,
|
||||
`export DOCKER_TLS_VERIFY="1"
|
||||
|
@ -110,9 +123,11 @@ unset DOCKER_HOST;
|
|||
unset DOCKER_CERT_PATH;
|
||||
unset MINIKUBE_ACTIVE_DOCKERD;
|
||||
`,
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"fish",
|
||||
"",
|
||||
DockerEnvConfig{profile: "fish", driver: "kvm2", hostIP: "127.0.0.1", port: 2376, certsDir: "/certs"},
|
||||
nil,
|
||||
`set -gx DOCKER_TLS_VERIFY "1";
|
||||
|
@ -128,9 +143,11 @@ set -e DOCKER_HOST;
|
|||
set -e DOCKER_CERT_PATH;
|
||||
set -e MINIKUBE_ACTIVE_DOCKERD;
|
||||
`,
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"powershell",
|
||||
"",
|
||||
DockerEnvConfig{profile: "powershell", driver: "hyperv", hostIP: "192.168.0.1", port: 2376, certsDir: "/certs"},
|
||||
nil,
|
||||
`$Env:DOCKER_TLS_VERIFY = "1"
|
||||
|
@ -146,9 +163,11 @@ Remove-Item Env:\\DOCKER_HOST
|
|||
Remove-Item Env:\\DOCKER_CERT_PATH
|
||||
Remove-Item Env:\\MINIKUBE_ACTIVE_DOCKERD
|
||||
`,
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"cmd",
|
||||
"",
|
||||
DockerEnvConfig{profile: "cmd", driver: "hyperv", hostIP: "192.168.0.1", port: 2376, certsDir: "/certs"},
|
||||
nil,
|
||||
`SET DOCKER_TLS_VERIFY=1
|
||||
|
@ -164,9 +183,11 @@ SET DOCKER_HOST=
|
|||
SET DOCKER_CERT_PATH=
|
||||
SET MINIKUBE_ACTIVE_DOCKERD=
|
||||
`,
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"emacs",
|
||||
"",
|
||||
DockerEnvConfig{profile: "emacs", driver: "hyperv", hostIP: "192.168.0.1", port: 2376, certsDir: "/certs"},
|
||||
nil,
|
||||
`(setenv "DOCKER_TLS_VERIFY" "1")
|
||||
|
@ -181,9 +202,11 @@ SET MINIKUBE_ACTIVE_DOCKERD=
|
|||
(setenv "DOCKER_CERT_PATH" nil)
|
||||
(setenv "MINIKUBE_ACTIVE_DOCKERD" nil)
|
||||
`,
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"bash",
|
||||
"",
|
||||
DockerEnvConfig{profile: "bash-no-proxy", driver: "kvm2", hostIP: "127.0.0.1", port: 2376, certsDir: "/certs", noProxy: true},
|
||||
&FakeNoProxyGetter{"NO_PROXY", "127.0.0.1"},
|
||||
`export DOCKER_TLS_VERIFY="1"
|
||||
|
@ -202,9 +225,11 @@ unset DOCKER_CERT_PATH;
|
|||
unset MINIKUBE_ACTIVE_DOCKERD;
|
||||
unset NO_PROXY;
|
||||
`,
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"bash",
|
||||
"",
|
||||
DockerEnvConfig{profile: "bash-no-proxy-lower", driver: "kvm2", hostIP: "127.0.0.1", port: 2376, certsDir: "/certs", noProxy: true},
|
||||
&FakeNoProxyGetter{"no_proxy", "127.0.0.1"},
|
||||
`export DOCKER_TLS_VERIFY="1"
|
||||
|
@ -223,9 +248,11 @@ unset DOCKER_CERT_PATH;
|
|||
unset MINIKUBE_ACTIVE_DOCKERD;
|
||||
unset no_proxy;
|
||||
`,
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"powershell",
|
||||
"",
|
||||
DockerEnvConfig{profile: "powershell-no-proxy-idempotent", driver: "hyperv", hostIP: "192.168.0.1", port: 2376, certsDir: "/certs", noProxy: true},
|
||||
&FakeNoProxyGetter{"no_proxy", "192.168.0.1"},
|
||||
`$Env:DOCKER_TLS_VERIFY = "1"
|
||||
|
@ -243,9 +270,11 @@ Remove-Item Env:\\DOCKER_CERT_PATH
|
|||
Remove-Item Env:\\MINIKUBE_ACTIVE_DOCKERD
|
||||
Remove-Item Env:\\no_proxy
|
||||
`,
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"bash",
|
||||
"",
|
||||
DockerEnvConfig{profile: "sh-no-proxy-add", driver: "kvm2", hostIP: "127.0.0.1", port: 2376, certsDir: "/certs", noProxy: true},
|
||||
&FakeNoProxyGetter{"NO_PROXY", "192.168.0.1,10.0.0.4"},
|
||||
`export DOCKER_TLS_VERIFY="1"
|
||||
|
@ -264,9 +293,11 @@ unset DOCKER_CERT_PATH;
|
|||
unset MINIKUBE_ACTIVE_DOCKERD;
|
||||
unset NO_PROXY;
|
||||
`,
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"none",
|
||||
"",
|
||||
DockerEnvConfig{profile: "noneshell", driver: "docker", hostIP: "127.0.0.1", port: 32842, certsDir: "/certs"},
|
||||
nil,
|
||||
`DOCKER_TLS_VERIFY=1
|
||||
|
@ -279,11 +310,91 @@ DOCKER_HOST
|
|||
DOCKER_CERT_PATH
|
||||
MINIKUBE_ACTIVE_DOCKERD
|
||||
`,
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"none",
|
||||
"text",
|
||||
DockerEnvConfig{profile: "nonetext", driver: "docker", hostIP: "127.0.0.1", port: 32842, certsDir: "/certs"},
|
||||
nil,
|
||||
`DOCKER_TLS_VERIFY=1
|
||||
DOCKER_HOST=tcp://127.0.0.1:32842
|
||||
DOCKER_CERT_PATH=/certs
|
||||
MINIKUBE_ACTIVE_DOCKERD=nonetext
|
||||
`,
|
||||
`DOCKER_TLS_VERIFY
|
||||
DOCKER_HOST
|
||||
DOCKER_CERT_PATH
|
||||
MINIKUBE_ACTIVE_DOCKERD
|
||||
`,
|
||||
[]cmp.Option{
|
||||
cmpopts.AcyclicTransformer("SplitLines", func(s string) []string {
|
||||
return strings.Split(s, "\n")
|
||||
}),
|
||||
cmpopts.SortSlices(func(a, b string) bool {
|
||||
return a < b
|
||||
}),
|
||||
},
|
||||
},
|
||||
{
|
||||
"none",
|
||||
"json",
|
||||
DockerEnvConfig{profile: "nonejson", driver: "docker", hostIP: "127.0.0.1", port: 32842, certsDir: "/certs"},
|
||||
nil,
|
||||
`{
|
||||
"DOCKER_TLS_VERIFY": "1",
|
||||
"DOCKER_HOST": "tcp://127.0.0.1:32842",
|
||||
"DOCKER_CERT_PATH": "/certs",
|
||||
"MINIKUBE_ACTIVE_DOCKERD": "nonejson"
|
||||
}`,
|
||||
`[
|
||||
"DOCKER_TLS_VERIFY",
|
||||
"DOCKER_HOST",
|
||||
"DOCKER_CERT_PATH",
|
||||
"MINIKUBE_ACTIVE_DOCKERD"
|
||||
]`,
|
||||
[]cmp.Option{
|
||||
cmp.FilterValues(func(x, y string) bool {
|
||||
return json.Valid([]byte(x)) && json.Valid([]byte(y))
|
||||
},
|
||||
cmp.Transformer("ParseJSON", func(in string) (out interface{}) {
|
||||
if err := json.Unmarshal([]byte(in), &out); err != nil {
|
||||
panic(err) // should never occur given previous filter to ensure valid JSON
|
||||
}
|
||||
return out
|
||||
})),
|
||||
},
|
||||
},
|
||||
{
|
||||
"none",
|
||||
"yaml",
|
||||
DockerEnvConfig{profile: "noneyaml", driver: "docker", hostIP: "127.0.0.1", port: 32842, certsDir: "/certs"},
|
||||
nil,
|
||||
`DOCKER_TLS_VERIFY: "1"
|
||||
DOCKER_HOST: tcp://127.0.0.1:32842
|
||||
DOCKER_CERT_PATH: /certs
|
||||
MINIKUBE_ACTIVE_DOCKERD: noneyaml
|
||||
`,
|
||||
`- DOCKER_TLS_VERIFY
|
||||
- DOCKER_HOST
|
||||
- DOCKER_CERT_PATH
|
||||
- MINIKUBE_ACTIVE_DOCKERD
|
||||
`,
|
||||
[]cmp.Option{
|
||||
cmpopts.AcyclicTransformer("ParseYAML", func(in string) (out interface{}) {
|
||||
if err := yaml.Unmarshal([]byte(in), &out); err != nil {
|
||||
return nil
|
||||
}
|
||||
return out
|
||||
}),
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tc := range tests {
|
||||
t.Run(tc.config.profile, func(t *testing.T) {
|
||||
tc.config.EnvConfig.Shell = tc.shell
|
||||
// set global variable
|
||||
outputFormat = tc.output
|
||||
defaultNoProxyGetter = tc.noProxyGetter
|
||||
var b []byte
|
||||
buf := bytes.NewBuffer(b)
|
||||
|
@ -291,7 +402,7 @@ MINIKUBE_ACTIVE_DOCKERD
|
|||
t.Errorf("setScript(%+v) error: %v", tc.config, err)
|
||||
}
|
||||
got := buf.String()
|
||||
if diff := cmp.Diff(tc.wantSet, got); diff != "" {
|
||||
if diff := cmp.Diff(tc.wantSet, got, tc.diffOpts...); diff != "" {
|
||||
t.Errorf("setScript(%+v) mismatch (-want +got):\n%s\n\nraw output:\n%s\nquoted: %q", tc.config, diff, got, got)
|
||||
}
|
||||
|
||||
|
@ -300,7 +411,7 @@ MINIKUBE_ACTIVE_DOCKERD
|
|||
t.Errorf("unsetScript(%+v) error: %v", tc.config, err)
|
||||
}
|
||||
got = buf.String()
|
||||
if diff := cmp.Diff(tc.wantUnset, got); diff != "" {
|
||||
if diff := cmp.Diff(tc.wantUnset, got, tc.diffOpts...); diff != "" {
|
||||
t.Errorf("unsetScript(%+v) mismatch (-want +got):\n%s\n\nraw output:\n%s\nquoted: %q", tc.config, diff, got, got)
|
||||
}
|
||||
|
||||
|
|
|
@ -165,6 +165,24 @@ $ minikube image unload image busybox
|
|||
},
|
||||
}
|
||||
|
||||
var pullImageCmd = &cobra.Command{
|
||||
Use: "pull",
|
||||
Short: "Pull images",
|
||||
Example: `
|
||||
$ minikube image pull busybox
|
||||
`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
profile, err := config.LoadProfile(viper.GetString(config.ProfileName))
|
||||
if err != nil {
|
||||
exit.Error(reason.Usage, "loading profile", err)
|
||||
}
|
||||
|
||||
if err := machine.PullImages(args, profile); err != nil {
|
||||
exit.Error(reason.GuestImagePull, "Failed to pull images", err)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
func createTar(dir string) (string, error) {
|
||||
tar, err := docker.CreateTarStream(dir, dockerFile)
|
||||
if err != nil {
|
||||
|
@ -245,6 +263,46 @@ $ minikube image ls
|
|||
},
|
||||
}
|
||||
|
||||
var tagImageCmd = &cobra.Command{
|
||||
Use: "tag",
|
||||
Short: "Tag images",
|
||||
Example: `
|
||||
$ minikube image tag source target
|
||||
`,
|
||||
Aliases: []string{"list"},
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if len(args) != 2 {
|
||||
exit.Message(reason.Usage, "Please provide source and target image")
|
||||
}
|
||||
profile, err := config.LoadProfile(viper.GetString(config.ProfileName))
|
||||
if err != nil {
|
||||
exit.Error(reason.Usage, "loading profile", err)
|
||||
}
|
||||
|
||||
if err := machine.TagImage(profile, args[0], args[1]); err != nil {
|
||||
exit.Error(reason.GuestImageTag, "Failed to tag images", err)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
var pushImageCmd = &cobra.Command{
|
||||
Use: "push",
|
||||
Short: "Push images",
|
||||
Example: `
|
||||
$ minikube image push busybox
|
||||
`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
profile, err := config.LoadProfile(viper.GetString(config.ProfileName))
|
||||
if err != nil {
|
||||
exit.Error(reason.Usage, "loading profile", err)
|
||||
}
|
||||
|
||||
if err := machine.PushImages(args, profile); err != nil {
|
||||
exit.Error(reason.GuestImagePush, "Failed to push images", err)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
loadImageCmd.Flags().BoolVarP(&pull, "pull", "", false, "Pull the remote image (no caching)")
|
||||
loadImageCmd.Flags().BoolVar(&imgDaemon, "daemon", false, "Cache image from docker daemon")
|
||||
|
@ -252,6 +310,7 @@ func init() {
|
|||
loadImageCmd.Flags().BoolVar(&overwrite, "overwrite", true, "Overwrite image even if same image:tag name exists")
|
||||
imageCmd.AddCommand(loadImageCmd)
|
||||
imageCmd.AddCommand(removeImageCmd)
|
||||
imageCmd.AddCommand(pullImageCmd)
|
||||
buildImageCmd.Flags().StringVarP(&tag, "tag", "t", "", "Tag to apply to the new image (optional)")
|
||||
buildImageCmd.Flags().BoolVarP(&push, "push", "", false, "Push the new image (requires tag)")
|
||||
buildImageCmd.Flags().StringVarP(&dockerFile, "file", "f", "", "Path to the Dockerfile to use (optional)")
|
||||
|
@ -259,4 +318,6 @@ func init() {
|
|||
buildImageCmd.Flags().StringArrayVar(&buildOpt, "build-opt", nil, "Specify arbitrary flags to pass to the build. (format: key=value)")
|
||||
imageCmd.AddCommand(buildImageCmd)
|
||||
imageCmd.AddCommand(listImageCmd)
|
||||
imageCmd.AddCommand(tagImageCmd)
|
||||
imageCmd.AddCommand(pushImageCmd)
|
||||
}
|
||||
|
|
|
@ -86,7 +86,7 @@ var tunnelCmd = &cobra.Command{
|
|||
sshPort := strconv.Itoa(port)
|
||||
sshKey := filepath.Join(localpath.MiniPath(), "machines", cname, "id_rsa")
|
||||
|
||||
kicSSHTunnel := kic.NewSSHTunnel(ctx, sshPort, sshKey, clientset.CoreV1())
|
||||
kicSSHTunnel := kic.NewSSHTunnel(ctx, sshPort, sshKey, clientset.CoreV1(), clientset.NetworkingV1())
|
||||
err = kicSSHTunnel.Start()
|
||||
if err != nil {
|
||||
exit.Error(reason.SvcTunnelStart, "error starting tunnel", err)
|
||||
|
|
|
@ -0,0 +1,78 @@
|
|||
From 2b512af2ddaae01926fdcc9056b71017cac2a8d2 Mon Sep 17 00:00:00 2001
|
||||
From: Tamir Duberstein <tamird@google.com>
|
||||
Date: Thu, 25 Feb 2021 16:44:46 -0500
|
||||
Subject: [PATCH] dist: generate stub go.mod in workdir
|
||||
|
||||
(cherry picked from commit c6374f516206c02b905d0d76ee1a66dab6fcd212)
|
||||
---
|
||||
src/cmd/dist/build.go | 26 ++++++--------------------
|
||||
1 file changed, 6 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go
|
||||
index 9e2b4f33b8..e5a7f9e9c4 100644
|
||||
--- a/src/cmd/dist/build.go
|
||||
+++ b/src/cmd/dist/build.go
|
||||
@@ -110,9 +110,6 @@ func xinit() {
|
||||
fatalf("$GOROOT must be set")
|
||||
}
|
||||
goroot = filepath.Clean(b)
|
||||
- if modRoot := findModuleRoot(goroot); modRoot != "" {
|
||||
- fatalf("found go.mod file in %s: $GOROOT must not be inside a module", modRoot)
|
||||
- }
|
||||
|
||||
b = os.Getenv("GOROOT_FINAL")
|
||||
if b == "" {
|
||||
@@ -244,6 +241,9 @@ func xinit() {
|
||||
os.Setenv("LANGUAGE", "en_US.UTF8")
|
||||
|
||||
workdir = xworkdir()
|
||||
+ if err := ioutil.WriteFile(pathf("%s/go.mod", workdir), []byte("module bootstrap"), 0666); err != nil {
|
||||
+ fatalf("cannot write stub go.mod: %s", err)
|
||||
+ }
|
||||
xatexit(rmworkdir)
|
||||
|
||||
tooldir = pathf("%s/pkg/tool/%s_%s", goroot, gohostos, gohostarch)
|
||||
@@ -1484,11 +1484,11 @@ func goCmd(goBinary string, cmd string, args ...string) {
|
||||
goCmd = append(goCmd, "-p=1")
|
||||
}
|
||||
|
||||
- run(goroot, ShowOutput|CheckExit, append(goCmd, args...)...)
|
||||
+ run(workdir, ShowOutput|CheckExit, append(goCmd, args...)...)
|
||||
}
|
||||
|
||||
func checkNotStale(goBinary string, targets ...string) {
|
||||
- out := run(goroot, CheckExit,
|
||||
+ out := run(workdir, CheckExit,
|
||||
append([]string{
|
||||
goBinary,
|
||||
"list", "-gcflags=all=" + gogcflags, "-ldflags=all=" + goldflags,
|
||||
@@ -1498,7 +1498,7 @@ func checkNotStale(goBinary string, targets ...string) {
|
||||
os.Setenv("GODEBUG", "gocachehash=1")
|
||||
for _, target := range []string{"runtime/internal/sys", "cmd/dist", "cmd/link"} {
|
||||
if strings.Contains(out, "STALE "+target) {
|
||||
- run(goroot, ShowOutput|CheckExit, goBinary, "list", "-f={{.ImportPath}} {{.Stale}}", target)
|
||||
+ run(workdir, ShowOutput|CheckExit, goBinary, "list", "-f={{.ImportPath}} {{.Stale}}", target)
|
||||
break
|
||||
}
|
||||
}
|
||||
@@ -1590,20 +1590,6 @@ func checkCC() {
|
||||
}
|
||||
}
|
||||
|
||||
-func findModuleRoot(dir string) (root string) {
|
||||
- for {
|
||||
- if fi, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil && !fi.IsDir() {
|
||||
- return dir
|
||||
- }
|
||||
- d := filepath.Dir(dir)
|
||||
- if d == dir {
|
||||
- break
|
||||
- }
|
||||
- dir = d
|
||||
- }
|
||||
- return ""
|
||||
-}
|
||||
-
|
||||
func defaulttarg() string {
|
||||
// xgetwd might return a path with symlinks fully resolved, and if
|
||||
// there happens to be symlinks in goroot, then the hasprefix test
|
|
@ -0,0 +1,2 @@
|
|||
net.ipv4.conf.lxc*.rp_filter = 0
|
||||
net.ipv4.conf.cilium_*.rp_filter = 0
|
|
@ -18,13 +18,12 @@ BR2_ROOTFS_USERS_TABLES="$(BR2_EXTERNAL_MINIKUBE_PATH)/board/coreos/minikube/use
|
|||
BR2_ROOTFS_OVERLAY="$(BR2_EXTERNAL_MINIKUBE_PATH)/board/coreos/minikube/rootfs-overlay"
|
||||
BR2_LINUX_KERNEL=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="4.19.182"
|
||||
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="4.19.202"
|
||||
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
|
||||
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL_MINIKUBE_PATH)/board/coreos/minikube/linux_defconfig"
|
||||
BR2_LINUX_KERNEL_LZ4=y
|
||||
BR2_LINUX_KERNEL_NEEDS_HOST_LIBELF=y
|
||||
BR2_PACKAGE_GZIP=y
|
||||
BR2_PACKAGE_LZ4=y
|
||||
BR2_PACKAGE_XZ=y
|
||||
BR2_PACKAGE_STRACE=y
|
||||
BR2_PACKAGE_SYSDIG=y
|
||||
|
@ -37,6 +36,9 @@ BR2_PACKAGE_SSHFS=y
|
|||
BR2_PACKAGE_XFSPROGS=y
|
||||
BR2_PACKAGE_PARTED=y
|
||||
BR2_PACKAGE_SYSSTAT=y
|
||||
BR2_PACKAGE_LUAJIT=y
|
||||
BR2_PACKAGE_LZ4=y
|
||||
BR2_PACKAGE_LZ4_PROGS=y
|
||||
BR2_PACKAGE_CA_CERTIFICATES=y
|
||||
BR2_PACKAGE_LIBOPENSSL_BIN=y
|
||||
BR2_PACKAGE_LIBCURL_CURL=y
|
||||
|
@ -58,7 +60,9 @@ BR2_PACKAGE_PSMISC=y
|
|||
BR2_PACKAGE_SYSTEMD_LOGIND=y
|
||||
BR2_PACKAGE_SYSTEMD_MACHINED=y
|
||||
BR2_PACKAGE_TAR=y
|
||||
BR2_PACKAGE_UTIL_LINUX_BINARIES=y
|
||||
BR2_PACKAGE_UTIL_LINUX_LOSETUP=y
|
||||
BR2_PACKAGE_UTIL_LINUX_NOLOGIN=y
|
||||
BR2_PACKAGE_UTIL_LINUX_NSENTER=y
|
||||
BR2_PACKAGE_UTIL_LINUX_SCHEDUTILS=y
|
||||
BR2_TARGET_ROOTFS_CPIO_GZIP=y
|
||||
|
|
|
@ -264,14 +264,14 @@ function displayTestAndEnvironmentChart(testData, testName, environmentName) {
|
|||
groupData.date,
|
||||
groupData.flakeRate,
|
||||
`<div style="padding: 1rem; font-family: 'Arial'; font-size: 14">
|
||||
<b>${groupData.date.toString()}</b><br>
|
||||
<b>Date:</b> ${groupData.date.toLocaleString([], {dateStyle: 'medium'})}<br>
|
||||
<b>Flake Percentage:</b> ${groupData.flakeRate.toFixed(2)}%<br>
|
||||
<b>Jobs:</b><br>
|
||||
${groupData.jobs.map(({ id, status }) => ` - <a href="${testGopoghLink(id, environmentName, testName)}">${id}</a> (${status})`).join("<br>")}
|
||||
</div>`,
|
||||
groupData.duration,
|
||||
`<div style="padding: 1rem; font-family: 'Arial'; font-size: 14">
|
||||
<b>${groupData.date.toString()}</b><br>
|
||||
<b>Date:</b> ${groupData.date.toLocaleString([], {dateStyle: 'medium'})}<br>
|
||||
<b>Average Duration:</b> ${groupData.duration.toFixed(2)}s<br>
|
||||
<b>Jobs:</b><br>
|
||||
${groupData.jobs.map(({ id, duration }) => ` - <a href="${testGopoghLink(id, environmentName, testName)}">${id}</a> (${duration}s)`).join("<br>")}
|
||||
|
@ -340,14 +340,14 @@ function displayTestAndEnvironmentChart(testData, testName, environmentName) {
|
|||
groupData.date,
|
||||
groupData.flakeRate,
|
||||
`<div style="padding: 1rem; font-family: 'Arial'; font-size: 14">
|
||||
<b>${groupData.date.toString()}</b><br>
|
||||
<b>Date:</b> ${groupData.date.toLocaleString([], {dateStyle: 'medium'})}<br>
|
||||
<b>Flake Percentage:</b> ${groupData.flakeRate.toFixed(2)}%<br>
|
||||
<b>Jobs:</b><br>
|
||||
${groupData.jobs.map(({ id, status }) => ` - <a href="${testGopoghLink(id, environmentName, testName)}">${id}</a> (${status})`).join("<br>")}
|
||||
</div>`,
|
||||
groupData.duration,
|
||||
`<div style="padding: 1rem; font-family: 'Arial'; font-size: 14">
|
||||
<b>${groupData.date.toString()}</b><br>
|
||||
<b>Date:</b> ${groupData.date.toLocaleString([], {dateStyle: 'medium'})}<br>
|
||||
<b>Average Duration:</b> ${groupData.duration.toFixed(2)}s<br>
|
||||
<b>Jobs:</b><br>
|
||||
${groupData.jobs.map(({ id, duration }) => ` - <a href="${testGopoghLink(id, environmentName, testName)}">${id}</a> (${duration}s)`).join("<br>")}
|
||||
|
@ -482,7 +482,7 @@ function displayEnvironmentChart(testData, environmentName) {
|
|||
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>Date:</b> ${data.date.toLocaleString([], {dateStyle: 'medium'})}<br>
|
||||
<b>Flake Percentage:</b> ${data.flakeRate.toFixed(2)}%<br>
|
||||
<b>Jobs:</b><br>
|
||||
${data.jobs.map(({ id, status }) => ` - <a href="${testGopoghLink(id, environmentName, name)}">${id}</a> (${status})`).join("<br>")}
|
||||
|
@ -559,7 +559,7 @@ function displayEnvironmentChart(testData, environmentName) {
|
|||
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>Date:</b> ${data.date.toLocaleString([], {dateStyle: 'medium'})}<br>
|
||||
<b>Flake Percentage:</b> ${data.flakeRate.toFixed(2)}%<br>
|
||||
<b>Jobs:</b><br>
|
||||
${data.jobs.map(({ id, status }) => ` - <a href="${testGopoghLink(id, environmentName, name)}">${id}</a> (${status})`).join("<br>")}
|
||||
|
@ -619,14 +619,14 @@ function displayEnvironmentChart(testData, environmentName) {
|
|||
dateInfo.date,
|
||||
dateInfo.testCount,
|
||||
`<div style="padding: 1rem; font-family: 'Arial'; font-size: 14">
|
||||
<b>${dateInfo.date.toString()}</b><br>
|
||||
<b>Date:</b> ${dateInfo.date.toLocaleString([], {dateStyle: 'medium'})}<br>
|
||||
<b>Test Count (averaged): </b> ${+dateInfo.testCount.toFixed(2)}<br>
|
||||
<b>Jobs:</b><br>
|
||||
${dateInfo.runInfo.map(job => ` - <a href="${testGopoghLink(job.rootJob, environmentName)}">${job.rootJob}</a> Test count: ${job.testCount}`).join("<br>")}
|
||||
</div>`,
|
||||
dateInfo.totalDuration,
|
||||
`<div style="padding: 1rem; font-family: 'Arial'; font-size: 14">
|
||||
<b>${dateInfo.date.toString()}</b><br>
|
||||
<b>Date:</b> ${dateInfo.date.toLocaleString([], {dateStyle: 'medium'})}<br>
|
||||
<b>Total Duration (averaged): </b> ${+dateInfo.totalDuration.toFixed(2)}<br>
|
||||
<b>Jobs:</b><br>
|
||||
${dateInfo.runInfo.map(job => ` - <a href="${testGopoghLink(job.rootJob, environmentName)}">${job.rootJob}</a> Total Duration: ${+job.totalDuration.toFixed(2)}s`).join("<br>")}
|
||||
|
|
|
@ -219,16 +219,8 @@ func addonSpecificChecks(cc *config.ClusterConfig, name string, enable bool, run
|
|||
// to match both ingress and ingress-dns addons
|
||||
if strings.HasPrefix(name, "ingress") && enable {
|
||||
if driver.IsKIC(cc.Driver) {
|
||||
if runtime.GOOS == "windows" {
|
||||
if runtime.GOOS == "windows" || runtime.GOOS == "darwin" {
|
||||
out.Styled(style.Tip, `After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1"`)
|
||||
} else if runtime.GOOS != "linux" {
|
||||
exit.Message(reason.Usage, `Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported.
|
||||
Alternatively to use this addon you can use a vm-based driver:
|
||||
|
||||
'minikube start --vm=true'
|
||||
|
||||
To track the update on this work in progress feature please check:
|
||||
https://github.com/kubernetes/minikube/issues/7332`, out.V{"driver_name": cc.Driver, "os_name": runtime.GOOS, "addon_name": name})
|
||||
} else if driver.BareMetal(cc.Driver) {
|
||||
out.WarningT(`Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.`,
|
||||
out.V{"driver_name": cc.Driver, "addon_name": name})
|
||||
|
|
|
@ -305,6 +305,16 @@ func (r *Containerd) RemoveImage(name string) error {
|
|||
return removeCRIImage(r.Runner, name)
|
||||
}
|
||||
|
||||
// TagImage tags an image in this runtime
|
||||
func (r *Containerd) TagImage(source string, target string) error {
|
||||
klog.Infof("Tagging image %s: %s", source, target)
|
||||
c := exec.Command("sudo", "ctr", "-n=k8s.io", "images", "tag", source, target)
|
||||
if _, err := r.Runner.RunCmd(c); err != nil {
|
||||
return errors.Wrapf(err, "ctr images tag")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func gitClone(cr CommandRunner, src string) (string, error) {
|
||||
// clone to a temporary directory
|
||||
rr, err := cr.RunCmd(exec.Command("mktemp", "-d"))
|
||||
|
@ -412,6 +422,15 @@ func (r *Containerd) BuildImage(src string, file string, tag string, push bool,
|
|||
return nil
|
||||
}
|
||||
|
||||
// PushImage pushes an image
|
||||
func (r *Containerd) PushImage(name string) error {
|
||||
klog.Infof("Pushing image %s: %s", name)
|
||||
c := exec.Command("sudo", "ctr", "-n=k8s.io", "images", "push", name)
|
||||
if _, err := r.Runner.RunCmd(c); err != nil {
|
||||
return errors.Wrapf(err, "ctr images push")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (r *Containerd) initBuildkitDaemon() error {
|
||||
// if daemon is already running, do nothing
|
||||
cmd := exec.Command("pgrep", "buildkitd")
|
||||
|
|
|
@ -134,10 +134,9 @@ func pauseCRIContainers(cr CommandRunner, root string, ids []string) error {
|
|||
args = append(args, "--root", root)
|
||||
}
|
||||
args = append(args, "pause")
|
||||
cargs := args
|
||||
for _, id := range ids {
|
||||
cargs = append(cargs, id)
|
||||
if _, err := cr.RunCmd(exec.Command("sudo", cargs...)); err != nil {
|
||||
args := append(args, id)
|
||||
if _, err := cr.RunCmd(exec.Command("sudo", args...)); err != nil {
|
||||
return errors.Wrap(err, "runc")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -216,6 +216,16 @@ func (r *CRIO) RemoveImage(name string) error {
|
|||
return removeCRIImage(r.Runner, name)
|
||||
}
|
||||
|
||||
// TagImage tags an image in this runtime
|
||||
func (r *CRIO) TagImage(source string, target string) error {
|
||||
klog.Infof("Tagging image %s: %s", source, target)
|
||||
c := exec.Command("sudo", "podman", "tag", source, target)
|
||||
if _, err := r.Runner.RunCmd(c); err != nil {
|
||||
return errors.Wrap(err, "crio tag image")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// BuildImage builds an image into this runtime
|
||||
func (r *CRIO) BuildImage(src string, file string, tag string, push bool, env []string, opts []string) error {
|
||||
klog.Infof("Building image: %s", src)
|
||||
|
@ -250,6 +260,16 @@ func (r *CRIO) BuildImage(src string, file string, tag string, push bool, env []
|
|||
return nil
|
||||
}
|
||||
|
||||
// PushImage pushes an image
|
||||
func (r *CRIO) PushImage(name string) error {
|
||||
klog.Infof("Pushing image %s", name)
|
||||
c := exec.Command("sudo", "podman", "push", name)
|
||||
if _, err := r.Runner.RunCmd(c); err != nil {
|
||||
return errors.Wrap(err, "crio push image")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// CGroupDriver returns cgroup driver ("cgroupfs" or "systemd")
|
||||
func (r *CRIO) CGroupDriver() (string, error) {
|
||||
c := exec.Command("crio", "config")
|
||||
|
|
|
@ -101,6 +101,10 @@ type Manager interface {
|
|||
BuildImage(string, string, string, bool, []string, []string) error
|
||||
// Save an image from the runtime on a host
|
||||
SaveImage(string, string) error
|
||||
// Tag an image
|
||||
TagImage(string, string) error
|
||||
// Push an image from the runtime to the container registry
|
||||
PushImage(string) error
|
||||
|
||||
// ImageExists takes image name and image sha checks if an it exists
|
||||
ImageExists(string, string) bool
|
||||
|
|
|
@ -244,6 +244,16 @@ func (r *Docker) RemoveImage(name string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
// TagImage tags an image in this runtime
|
||||
func (r *Docker) TagImage(source string, target string) error {
|
||||
klog.Infof("Tagging image %s: %s", source, target)
|
||||
c := exec.Command("docker", "tag", source, target)
|
||||
if _, err := r.Runner.RunCmd(c); err != nil {
|
||||
return errors.Wrap(err, "tag image docker.")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// BuildImage builds an image into this runtime
|
||||
func (r *Docker) BuildImage(src string, file string, tag string, push bool, env []string, opts []string) error {
|
||||
klog.Infof("Building image: %s", src)
|
||||
|
@ -278,6 +288,16 @@ func (r *Docker) BuildImage(src string, file string, tag string, push bool, env
|
|||
return nil
|
||||
}
|
||||
|
||||
// PushImage pushes an image
|
||||
func (r *Docker) PushImage(name string) error {
|
||||
klog.Infof("Pushing image: %s", name)
|
||||
c := exec.Command("docker", "push", name)
|
||||
if _, err := r.Runner.RunCmd(c); err != nil {
|
||||
return errors.Wrap(err, "push image docker.")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// CGroupDriver returns cgroup driver ("cgroupfs" or "systemd")
|
||||
func (r *Docker) CGroupDriver() (string, error) {
|
||||
// Note: the server daemon has to be running, for this call to return successfully
|
||||
|
|
|
@ -40,7 +40,7 @@ const fileScheme = "file"
|
|||
// DefaultISOURLs returns a list of ISO URL's to consult by default, in priority order
|
||||
func DefaultISOURLs() []string {
|
||||
v := version.GetISOVersion()
|
||||
isoBucket := "minikube-builds/iso/12032"
|
||||
isoBucket := "minikube-builds/iso/12268"
|
||||
return []string{
|
||||
fmt.Sprintf("https://storage.googleapis.com/%s/minikube-%s.iso", isoBucket, v),
|
||||
fmt.Sprintf("https://github.com/kubernetes/minikube/releases/download/%s/minikube-%s.iso", v, v),
|
||||
|
|
|
@ -539,3 +539,141 @@ func ListImages(profile *config.Profile) error {
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
// TagImage tags image in all nodes in profile
|
||||
func TagImage(profile *config.Profile, source string, target string) error {
|
||||
api, err := NewAPIClient()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "error creating api client")
|
||||
}
|
||||
defer api.Close()
|
||||
|
||||
succeeded := []string{}
|
||||
failed := []string{}
|
||||
|
||||
pName := profile.Name
|
||||
|
||||
c, err := config.Load(pName)
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to load profile %q: %v", pName, err)
|
||||
return errors.Wrapf(err, "error loading config for profile :%v", pName)
|
||||
}
|
||||
|
||||
for _, n := range c.Nodes {
|
||||
m := config.MachineName(*c, n)
|
||||
|
||||
status, err := Status(api, m)
|
||||
if err != nil {
|
||||
klog.Warningf("error getting status for %s: %v", m, err)
|
||||
continue
|
||||
}
|
||||
|
||||
if status == state.Running.String() {
|
||||
h, err := api.Load(m)
|
||||
if err != nil {
|
||||
klog.Warningf("Failed to load machine %q: %v", m, err)
|
||||
continue
|
||||
}
|
||||
runner, err := CommandRunner(h)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
cruntime, err := cruntime.New(cruntime.Config{Type: c.KubernetesConfig.ContainerRuntime, Runner: runner})
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "error creating container runtime")
|
||||
}
|
||||
err = cruntime.TagImage(source, target)
|
||||
if err != nil {
|
||||
failed = append(failed, m)
|
||||
klog.Warningf("Failed to tag image for profile %s %v", pName, err.Error())
|
||||
continue
|
||||
}
|
||||
succeeded = append(succeeded, m)
|
||||
}
|
||||
}
|
||||
|
||||
klog.Infof("succeeded tagging in: %s", strings.Join(succeeded, " "))
|
||||
klog.Infof("failed tagging in: %s", strings.Join(failed, " "))
|
||||
return nil
|
||||
}
|
||||
|
||||
// pushImages pushes images from the container run time
|
||||
func pushImages(cruntime cruntime.Manager, images []string) error {
|
||||
klog.Infof("PushImages start: %s", images)
|
||||
start := time.Now()
|
||||
|
||||
defer func() {
|
||||
klog.Infof("PushImages completed in %s", time.Since(start))
|
||||
}()
|
||||
|
||||
var g errgroup.Group
|
||||
|
||||
for _, image := range images {
|
||||
image := image
|
||||
g.Go(func() error {
|
||||
return cruntime.PushImage(image)
|
||||
})
|
||||
}
|
||||
if err := g.Wait(); err != nil {
|
||||
return errors.Wrap(err, "error pushing images")
|
||||
}
|
||||
klog.Infoln("Successfully pushed images")
|
||||
return nil
|
||||
}
|
||||
|
||||
// PushImages push images on all nodes in profile
|
||||
func PushImages(images []string, profile *config.Profile) error {
|
||||
api, err := NewAPIClient()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "error creating api client")
|
||||
}
|
||||
defer api.Close()
|
||||
|
||||
succeeded := []string{}
|
||||
failed := []string{}
|
||||
|
||||
pName := profile.Name
|
||||
|
||||
c, err := config.Load(pName)
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to load profile %q: %v", pName, err)
|
||||
return errors.Wrapf(err, "error loading config for profile :%v", pName)
|
||||
}
|
||||
|
||||
for _, n := range c.Nodes {
|
||||
m := config.MachineName(*c, n)
|
||||
|
||||
status, err := Status(api, m)
|
||||
if err != nil {
|
||||
klog.Warningf("error getting status for %s: %v", m, err)
|
||||
continue
|
||||
}
|
||||
|
||||
if status == state.Running.String() {
|
||||
h, err := api.Load(m)
|
||||
if err != nil {
|
||||
klog.Warningf("Failed to load machine %q: %v", m, err)
|
||||
continue
|
||||
}
|
||||
runner, err := CommandRunner(h)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
cruntime, err := cruntime.New(cruntime.Config{Type: c.KubernetesConfig.ContainerRuntime, Runner: runner})
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "error creating container runtime")
|
||||
}
|
||||
err = pushImages(cruntime, images)
|
||||
if err != nil {
|
||||
failed = append(failed, m)
|
||||
klog.Warningf("Failed to push image for profile %s %v", pName, err.Error())
|
||||
continue
|
||||
}
|
||||
succeeded = append(succeeded, m)
|
||||
}
|
||||
}
|
||||
|
||||
klog.Infof("succeeded pushing in: %s", strings.Join(succeeded, " "))
|
||||
klog.Infof("failed pushing in: %s", strings.Join(failed, " "))
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -118,7 +118,7 @@ func Styled(st style.Enum, format string, a ...V) {
|
|||
func boxedCommon(printFunc func(format string, a ...interface{}), cfg box.Config, title string, format string, a ...V) {
|
||||
box := box.New(cfg)
|
||||
if !useColor {
|
||||
box.Config.Color = ""
|
||||
box.Config.Color = nil
|
||||
}
|
||||
str := Sprintf(style.None, format, a...)
|
||||
printFunc(box.String(title, strings.TrimSpace(str)))
|
||||
|
|
|
@ -24,6 +24,7 @@ import (
|
|||
|
||||
"k8s.io/minikube/pkg/minikube/out/register"
|
||||
"k8s.io/minikube/pkg/minikube/reason"
|
||||
"k8s.io/minikube/pkg/minikube/tests"
|
||||
)
|
||||
|
||||
type buffFd struct {
|
||||
|
@ -86,7 +87,7 @@ func TestDisplayProblem(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestDisplayJSON(t *testing.T) {
|
||||
func TestDisplayProblemJSON(t *testing.T) {
|
||||
defer SetJSON(false)
|
||||
SetJSON(true)
|
||||
|
||||
|
@ -96,7 +97,6 @@ func TestDisplayJSON(t *testing.T) {
|
|||
}{
|
||||
{
|
||||
k: &reason.Kind{
|
||||
|
||||
ID: "BUG",
|
||||
ExitCode: 4,
|
||||
Advice: "fix me!",
|
||||
|
@ -117,12 +117,10 @@ func TestDisplayJSON(t *testing.T) {
|
|||
return "random-id"
|
||||
}
|
||||
|
||||
JSON = true
|
||||
Error(*tc.k, "my error")
|
||||
actual := buf.String()
|
||||
if actual != tc.expected {
|
||||
t.Fatalf("expected didn't match actual:\nExpected:\n%v\n\nActual:\n%v", tc.expected, actual)
|
||||
}
|
||||
actual := buf.Bytes()
|
||||
|
||||
tests.CompareJSON(t, actual, []byte(tc.expected))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,6 +21,8 @@ import (
|
|||
"fmt"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"k8s.io/minikube/pkg/minikube/tests"
|
||||
)
|
||||
|
||||
func TestPrintStep(t *testing.T) {
|
||||
|
@ -39,11 +41,9 @@ func TestPrintStep(t *testing.T) {
|
|||
}
|
||||
|
||||
PrintStep("message")
|
||||
actual := buf.String()
|
||||
actual := buf.Bytes()
|
||||
|
||||
if actual != expected {
|
||||
t.Fatalf("expected didn't match actual:\nExpected:\n%v\n\nActual:\n%v", expected, actual)
|
||||
}
|
||||
tests.CompareJSON(t, actual, []byte(expected))
|
||||
}
|
||||
|
||||
func TestPrintInfo(t *testing.T) {
|
||||
|
@ -59,11 +59,9 @@ func TestPrintInfo(t *testing.T) {
|
|||
}
|
||||
|
||||
PrintInfo("info")
|
||||
actual := buf.String()
|
||||
actual := buf.Bytes()
|
||||
|
||||
if actual != expected {
|
||||
t.Fatalf("expected didn't match actual:\nExpected:\n%v\n\nActual:\n%v", expected, actual)
|
||||
}
|
||||
tests.CompareJSON(t, actual, []byte(expected))
|
||||
}
|
||||
|
||||
func TestError(t *testing.T) {
|
||||
|
@ -79,11 +77,9 @@ func TestError(t *testing.T) {
|
|||
}
|
||||
|
||||
PrintError("error")
|
||||
actual := buf.String()
|
||||
actual := buf.Bytes()
|
||||
|
||||
if actual != expected {
|
||||
t.Fatalf("expected didn't match actual:\nExpected:\n%v\n\nActual:\n%v", expected, actual)
|
||||
}
|
||||
tests.CompareJSON(t, actual, []byte(expected))
|
||||
}
|
||||
|
||||
func TestErrorExitCode(t *testing.T) {
|
||||
|
@ -99,10 +95,9 @@ func TestErrorExitCode(t *testing.T) {
|
|||
}
|
||||
|
||||
PrintErrorExitCode("error", 5, map[string]string{"a": "b"}, map[string]string{"c": "d"})
|
||||
actual := buf.String()
|
||||
if actual != expected {
|
||||
t.Fatalf("expected didn't match actual:\nExpected:\n%v\n\nActual:\n%v", expected, actual)
|
||||
}
|
||||
actual := buf.Bytes()
|
||||
|
||||
tests.CompareJSON(t, actual, []byte(expected))
|
||||
}
|
||||
|
||||
func TestWarning(t *testing.T) {
|
||||
|
@ -118,9 +113,7 @@ func TestWarning(t *testing.T) {
|
|||
}
|
||||
|
||||
PrintWarning("warning")
|
||||
actual := buf.String()
|
||||
actual := buf.Bytes()
|
||||
|
||||
if actual != expected {
|
||||
t.Fatalf("expected didn't match actual:\nExpected:\n%v\n\nActual:\n%v", expected, actual)
|
||||
}
|
||||
tests.CompareJSON(t, actual, []byte(expected))
|
||||
}
|
||||
|
|
|
@ -21,6 +21,8 @@ import (
|
|||
"fmt"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"k8s.io/minikube/pkg/minikube/tests"
|
||||
)
|
||||
|
||||
func TestSetCurrentStep(t *testing.T) {
|
||||
|
@ -42,9 +44,7 @@ func TestSetCurrentStep(t *testing.T) {
|
|||
}
|
||||
|
||||
PrintStep("message")
|
||||
actual := buf.String()
|
||||
actual := buf.Bytes()
|
||||
|
||||
if actual != expected {
|
||||
t.Fatalf("expected didn't match actual:\nExpected:\n%v\n\nActual:\n%v", expected, actual)
|
||||
}
|
||||
tests.CompareJSON(t, actual, []byte(expected))
|
||||
}
|
||||
|
|
|
@ -315,8 +315,14 @@ var (
|
|||
GuestImageLoad = Kind{ID: "GUEST_IMAGE_LOAD", ExitCode: ExGuestError}
|
||||
// minikube failed to remove an image
|
||||
GuestImageRemove = Kind{ID: "GUEST_IMAGE_REMOVE", ExitCode: ExGuestError}
|
||||
// minikube failed to pull an image
|
||||
GuestImagePull = Kind{ID: "GUEST_IMAGE_PULL", ExitCode: ExGuestError}
|
||||
// minikube failed to push an image
|
||||
GuestImagePush = Kind{ID: "GUEST_IMAGE_PUSH", ExitCode: ExGuestError}
|
||||
// minikube failed to build an image
|
||||
GuestImageBuild = Kind{ID: "GUEST_IMAGE_BUILD", ExitCode: ExGuestError}
|
||||
// minikube failed to tag an image
|
||||
GuestImageTag = Kind{ID: "GUEST_IMAGE_TAG", ExitCode: ExGuestError}
|
||||
// minikube failed to load host
|
||||
GuestLoadHost = Kind{ID: "GUEST_LOAD_HOST", ExitCode: ExGuestError}
|
||||
// minkube failed to create a mount
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
package tests
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"reflect"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// TestEvent simulates a CloudEvent for our JSON output
|
||||
type TestEvent struct {
|
||||
Data map[string]string `json:"data"`
|
||||
Datacontenttype string `json:"datacontenttype"`
|
||||
ID string `json:"id"`
|
||||
Source string `json:"source"`
|
||||
Specversion string `json:"specversion"`
|
||||
Eventtype string `json:"type"`
|
||||
}
|
||||
|
||||
// CompareJSON takes two byte slices, unmarshals them to TestEvent
|
||||
// and compares them, failing the test if they don't match
|
||||
func CompareJSON(t *testing.T, actual, expected []byte) {
|
||||
var actualJSON, expectedJSON TestEvent
|
||||
|
||||
err := json.Unmarshal(actual, &actualJSON)
|
||||
if err != nil {
|
||||
t.Fatalf("error unmarshalling json: %v", err)
|
||||
}
|
||||
|
||||
err = json.Unmarshal(expected, &expectedJSON)
|
||||
if err != nil {
|
||||
t.Fatalf("error unmarshalling json: %v", err)
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(actualJSON, expectedJSON) {
|
||||
t.Fatalf("expected didn't match actual:\nExpected:\n%v\n\nActual:\n%v", expected, actual)
|
||||
}
|
||||
}
|
|
@ -36,7 +36,7 @@ type sshConn struct {
|
|||
activeConn bool
|
||||
}
|
||||
|
||||
func createSSHConn(name, sshPort, sshKey string, svc *v1.Service) *sshConn {
|
||||
func createSSHConn(name, sshPort, sshKey string, resourcePorts []int32, resourceIP string, resourceName string) *sshConn {
|
||||
// extract sshArgs
|
||||
sshArgs := []string{
|
||||
// TODO: document the options here
|
||||
|
@ -50,17 +50,17 @@ func createSSHConn(name, sshPort, sshKey string, svc *v1.Service) *sshConn {
|
|||
|
||||
askForSudo := false
|
||||
var privilegedPorts []int32
|
||||
for _, port := range svc.Spec.Ports {
|
||||
for _, port := range resourcePorts {
|
||||
arg := fmt.Sprintf(
|
||||
"-L %d:%s:%d",
|
||||
port.Port,
|
||||
svc.Spec.ClusterIP,
|
||||
port.Port,
|
||||
port,
|
||||
resourceIP,
|
||||
port,
|
||||
)
|
||||
|
||||
// check if any port is privileged
|
||||
if port.Port < 1024 {
|
||||
privilegedPorts = append(privilegedPorts, port.Port)
|
||||
if port < 1024 {
|
||||
privilegedPorts = append(privilegedPorts, port)
|
||||
askForSudo = true
|
||||
}
|
||||
|
||||
|
@ -71,8 +71,8 @@ func createSSHConn(name, sshPort, sshKey string, svc *v1.Service) *sshConn {
|
|||
if askForSudo && runtime.GOOS != "windows" {
|
||||
out.Styled(
|
||||
style.Warning,
|
||||
"The service {{.service}} requires privileged ports to be exposed: {{.ports}}",
|
||||
out.V{"service": svc.Name, "ports": fmt.Sprintf("%v", privilegedPorts)},
|
||||
"The service/ingress {{.resource}} requires privileged ports to be exposed: {{.ports}}",
|
||||
out.V{"resource": resourceName, "ports": fmt.Sprintf("%v", privilegedPorts)},
|
||||
)
|
||||
|
||||
out.Styled(style.Permissions, "sudo permission will be asked for it.")
|
||||
|
@ -89,7 +89,7 @@ func createSSHConn(name, sshPort, sshKey string, svc *v1.Service) *sshConn {
|
|||
|
||||
return &sshConn{
|
||||
name: name,
|
||||
service: svc.Name,
|
||||
service: resourceName,
|
||||
cmd: cmd,
|
||||
activeConn: false,
|
||||
}
|
||||
|
|
|
@ -23,8 +23,10 @@ import (
|
|||
"time"
|
||||
|
||||
v1 "k8s.io/api/core/v1"
|
||||
v1_networking "k8s.io/api/networking/v1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
typed_core "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||
typed_networking "k8s.io/client-go/kubernetes/typed/networking/v1"
|
||||
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/minikube/pkg/minikube/tunnel"
|
||||
|
@ -36,19 +38,21 @@ type SSHTunnel struct {
|
|||
sshPort string
|
||||
sshKey string
|
||||
v1Core typed_core.CoreV1Interface
|
||||
v1Networking typed_networking.NetworkingV1Interface
|
||||
LoadBalancerEmulator tunnel.LoadBalancerEmulator
|
||||
conns map[string]*sshConn
|
||||
connsToStop map[string]*sshConn
|
||||
}
|
||||
|
||||
// NewSSHTunnel ...
|
||||
func NewSSHTunnel(ctx context.Context, sshPort, sshKey string, v1Core typed_core.CoreV1Interface) *SSHTunnel {
|
||||
func NewSSHTunnel(ctx context.Context, sshPort, sshKey string, v1Core typed_core.CoreV1Interface, v1Networking typed_networking.NetworkingV1Interface) *SSHTunnel {
|
||||
return &SSHTunnel{
|
||||
ctx: ctx,
|
||||
sshPort: sshPort,
|
||||
sshKey: sshKey,
|
||||
v1Core: v1Core,
|
||||
LoadBalancerEmulator: tunnel.NewLoadBalancerEmulator(v1Core),
|
||||
v1Networking: v1Networking,
|
||||
conns: make(map[string]*sshConn),
|
||||
connsToStop: make(map[string]*sshConn),
|
||||
}
|
||||
|
@ -73,6 +77,11 @@ func (t *SSHTunnel) Start() error {
|
|||
klog.Errorf("error listing services: %v", err)
|
||||
}
|
||||
|
||||
ingresses, err := t.v1Networking.Ingresses("").List(context.Background(), metav1.ListOptions{})
|
||||
if err != nil {
|
||||
klog.Errorf("error listing ingresses: %v", err)
|
||||
}
|
||||
|
||||
t.markConnectionsToBeStopped()
|
||||
|
||||
for _, svc := range services.Items {
|
||||
|
@ -81,6 +90,10 @@ func (t *SSHTunnel) Start() error {
|
|||
}
|
||||
}
|
||||
|
||||
for _, ingress := range ingresses.Items {
|
||||
t.startConnectionIngress(ingress)
|
||||
}
|
||||
|
||||
t.stopMarkedConnections()
|
||||
|
||||
// TODO: which time to use?
|
||||
|
@ -104,8 +117,14 @@ func (t *SSHTunnel) startConnection(svc v1.Service) {
|
|||
return
|
||||
}
|
||||
|
||||
resourcePorts := []int32{}
|
||||
|
||||
for _, port := range svc.Spec.Ports {
|
||||
resourcePorts = append(resourcePorts, port.Port)
|
||||
}
|
||||
|
||||
// create new ssh conn
|
||||
newSSHConn := createSSHConn(uniqName, t.sshPort, t.sshKey, &svc)
|
||||
newSSHConn := createSSHConn(uniqName, t.sshPort, t.sshKey, resourcePorts, svc.Spec.ClusterIP, svc.Name)
|
||||
t.conns[newSSHConn.name] = newSSHConn
|
||||
|
||||
go func() {
|
||||
|
@ -121,6 +140,31 @@ func (t *SSHTunnel) startConnection(svc v1.Service) {
|
|||
}
|
||||
}
|
||||
|
||||
func (t *SSHTunnel) startConnectionIngress(ingress v1_networking.Ingress) {
|
||||
uniqName := sshConnUniqNameIngress(ingress)
|
||||
existingSSHConn, ok := t.conns[uniqName]
|
||||
|
||||
if ok {
|
||||
// if the svc still exist we remove the conn from the stopping list
|
||||
delete(t.connsToStop, existingSSHConn.name)
|
||||
return
|
||||
}
|
||||
|
||||
resourcePorts := []int32{80, 443}
|
||||
resourceIP := "127.0.0.1"
|
||||
|
||||
// create new ssh conn
|
||||
newSSHConn := createSSHConn(uniqName, t.sshPort, t.sshKey, resourcePorts, resourceIP, ingress.Name)
|
||||
t.conns[newSSHConn.name] = newSSHConn
|
||||
|
||||
go func() {
|
||||
err := newSSHConn.startAndWait()
|
||||
if err != nil {
|
||||
klog.Errorf("error starting ssh tunnel: %v", err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
func (t *SSHTunnel) stopActiveConnections() {
|
||||
for _, conn := range t.conns {
|
||||
err := conn.stop()
|
||||
|
@ -157,3 +201,13 @@ func sshConnUniqName(service v1.Service) string {
|
|||
|
||||
return strings.Join(n, "")
|
||||
}
|
||||
|
||||
func sshConnUniqNameIngress(ingress v1_networking.Ingress) string {
|
||||
n := []string{ingress.Name}
|
||||
|
||||
for _, rule := range ingress.Spec.Rules {
|
||||
n = append(n, rule.Host)
|
||||
}
|
||||
|
||||
return strings.Join(n, "")
|
||||
}
|
||||
|
|
|
@ -20,11 +20,12 @@ minikube docker-env [flags]
|
|||
### Options
|
||||
|
||||
```
|
||||
--no-proxy Add machine IP to NO_PROXY environment variable
|
||||
--shell string Force environment to be configured for a specified shell: [fish, cmd, powershell, tcsh, bash, zsh], default is auto-detect
|
||||
--ssh-add Add SSH identity key to SSH authentication agent
|
||||
--ssh-host Use SSH connection instead of HTTPS (port 2376)
|
||||
-u, --unset Unset variables instead of setting them
|
||||
--no-proxy Add machine IP to NO_PROXY environment variable
|
||||
-o, --output string One of 'text', 'yaml' or 'json'.
|
||||
--shell string Force environment to be configured for a specified shell: [fish, cmd, powershell, tcsh, bash, zsh], default is auto-detect
|
||||
--ssh-add Add SSH identity key to SSH authentication agent
|
||||
--ssh-host Use SSH connection instead of HTTPS (port 2376)
|
||||
-u, --unset Unset variables instead of setting them
|
||||
```
|
||||
|
||||
### Options inherited from parent commands
|
||||
|
|
|
@ -216,6 +216,90 @@ $ minikube image ls
|
|||
--vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging
|
||||
```
|
||||
|
||||
## minikube image pull
|
||||
|
||||
Pull images
|
||||
|
||||
### Synopsis
|
||||
|
||||
Pull images
|
||||
|
||||
```shell
|
||||
minikube image pull [flags]
|
||||
```
|
||||
|
||||
### Examples
|
||||
|
||||
```
|
||||
|
||||
$ minikube image pull busybox
|
||||
|
||||
```
|
||||
|
||||
### Options inherited from parent commands
|
||||
|
||||
```
|
||||
--add_dir_header If true, adds the file directory to the header of the log messages
|
||||
--alsologtostderr log to standard error as well as files
|
||||
-b, --bootstrapper string The name of the cluster bootstrapper that will set up the Kubernetes cluster. (default "kubeadm")
|
||||
-h, --help
|
||||
--log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0)
|
||||
--log_dir string If non-empty, write log files in this directory
|
||||
--log_file string If non-empty, use this log file
|
||||
--log_file_max_size uint Defines the maximum size a log file can grow to. Unit is megabytes. If the value is 0, the maximum file size is unlimited. (default 1800)
|
||||
--logtostderr log to standard error instead of files
|
||||
--one_output If true, only write logs to their native severity level (vs also writing to each lower severity level)
|
||||
-p, --profile string The name of the minikube VM being used. This can be set to allow having multiple instances of minikube independently. (default "minikube")
|
||||
--skip_headers If true, avoid header prefixes in the log messages
|
||||
--skip_log_headers If true, avoid headers when opening log files
|
||||
--stderrthreshold severity logs at or above this threshold go to stderr (default 2)
|
||||
--user string Specifies the user executing the operation. Useful for auditing operations executed by 3rd party tools. Defaults to the operating system username.
|
||||
-v, --v Level number for the log level verbosity
|
||||
--vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging
|
||||
```
|
||||
|
||||
## minikube image push
|
||||
|
||||
Push images
|
||||
|
||||
### Synopsis
|
||||
|
||||
Push images
|
||||
|
||||
```shell
|
||||
minikube image push [flags]
|
||||
```
|
||||
|
||||
### Examples
|
||||
|
||||
```
|
||||
|
||||
$ minikube image push busybox
|
||||
|
||||
```
|
||||
|
||||
### Options inherited from parent commands
|
||||
|
||||
```
|
||||
--add_dir_header If true, adds the file directory to the header of the log messages
|
||||
--alsologtostderr log to standard error as well as files
|
||||
-b, --bootstrapper string The name of the cluster bootstrapper that will set up the Kubernetes cluster. (default "kubeadm")
|
||||
-h, --help
|
||||
--log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0)
|
||||
--log_dir string If non-empty, write log files in this directory
|
||||
--log_file string If non-empty, use this log file
|
||||
--log_file_max_size uint Defines the maximum size a log file can grow to. Unit is megabytes. If the value is 0, the maximum file size is unlimited. (default 1800)
|
||||
--logtostderr log to standard error instead of files
|
||||
--one_output If true, only write logs to their native severity level (vs also writing to each lower severity level)
|
||||
-p, --profile string The name of the minikube VM being used. This can be set to allow having multiple instances of minikube independently. (default "minikube")
|
||||
--skip_headers If true, avoid header prefixes in the log messages
|
||||
--skip_log_headers If true, avoid headers when opening log files
|
||||
--stderrthreshold severity logs at or above this threshold go to stderr (default 2)
|
||||
--user string Specifies the user executing the operation. Useful for auditing operations executed by 3rd party tools. Defaults to the operating system username.
|
||||
-v, --v Level number for the log level verbosity
|
||||
--vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging
|
||||
```
|
||||
|
||||
## minikube image rm
|
||||
|
||||
Remove one or more images
|
||||
|
@ -264,3 +348,49 @@ $ minikube image unload image busybox
|
|||
--vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging
|
||||
```
|
||||
|
||||
## minikube image tag
|
||||
|
||||
Tag images
|
||||
|
||||
### Synopsis
|
||||
|
||||
Tag images
|
||||
|
||||
```shell
|
||||
minikube image tag [flags]
|
||||
```
|
||||
|
||||
### Aliases
|
||||
|
||||
[list]
|
||||
|
||||
### Examples
|
||||
|
||||
```
|
||||
|
||||
$ minikube image tag source target
|
||||
|
||||
```
|
||||
|
||||
### Options inherited from parent commands
|
||||
|
||||
```
|
||||
--add_dir_header If true, adds the file directory to the header of the log messages
|
||||
--alsologtostderr log to standard error as well as files
|
||||
-b, --bootstrapper string The name of the cluster bootstrapper that will set up the Kubernetes cluster. (default "kubeadm")
|
||||
-h, --help
|
||||
--log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0)
|
||||
--log_dir string If non-empty, write log files in this directory
|
||||
--log_file string If non-empty, use this log file
|
||||
--log_file_max_size uint Defines the maximum size a log file can grow to. Unit is megabytes. If the value is 0, the maximum file size is unlimited. (default 1800)
|
||||
--logtostderr log to standard error instead of files
|
||||
--one_output If true, only write logs to their native severity level (vs also writing to each lower severity level)
|
||||
-p, --profile string The name of the minikube VM being used. This can be set to allow having multiple instances of minikube independently. (default "minikube")
|
||||
--skip_headers If true, avoid header prefixes in the log messages
|
||||
--skip_log_headers If true, avoid headers when opening log files
|
||||
--stderrthreshold severity logs at or above this threshold go to stderr (default 2)
|
||||
--user string Specifies the user executing the operation. Useful for auditing operations executed by 3rd party tools. Defaults to the operating system username.
|
||||
-v, --v Level number for the log level verbosity
|
||||
--vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging
|
||||
```
|
||||
|
||||
|
|
|
@ -65,7 +65,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-builds/iso/12032/minikube-v1.22.0-1628622362-12032.iso,https://github.com/kubernetes/minikube/releases/download/v1.22.0-1628622362-12032/minikube-v1.22.0-1628622362-12032.iso,https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.22.0-1628622362-12032.iso])
|
||||
--iso-url strings Locations to fetch the minikube ISO from. (default [https://storage.googleapis.com/minikube-builds/iso/12268/minikube-v1.22.0-1628974786-12268.iso,https://github.com/kubernetes/minikube/releases/download/v1.22.0-1628974786-12268/minikube-v1.22.0-1628974786-12268.iso,https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.22.0-1628974786-12268.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.21.3, 'latest' for v1.22.0-rc.0). Defaults to 'stable'.
|
||||
--kvm-gpu Enable experimental NVIDIA GPU support in minikube
|
||||
|
|
|
@ -378,9 +378,18 @@ minikube failed to pull or load an image
|
|||
"GUEST_IMAGE_REMOVE" (Exit code ExGuestError)
|
||||
minikube failed to remove an image
|
||||
|
||||
"GUEST_IMAGE_PULL" (Exit code ExGuestError)
|
||||
minikube failed to pull an image
|
||||
|
||||
"GUEST_IMAGE_PUSH" (Exit code ExGuestError)
|
||||
minikube failed to push an image
|
||||
|
||||
"GUEST_IMAGE_BUILD" (Exit code ExGuestError)
|
||||
minikube failed to build an image
|
||||
|
||||
"GUEST_IMAGE_TAG" (Exit code ExGuestError)
|
||||
minikube failed to tag an image
|
||||
|
||||
"GUEST_LOAD_HOST" (Exit code ExGuestError)
|
||||
minikube failed to load host
|
||||
|
||||
|
|
2
test.sh
2
test.sh
|
@ -45,7 +45,7 @@ then
|
|||
readonly BDIR="${ROOT_DIR}/hack/boilerplate"
|
||||
pushd . >/dev/null
|
||||
cd ${BDIR}
|
||||
missing="$(go run boilerplate.go -rootdir ${ROOT_DIR} -boilerplate-dir ${BDIR} | egrep -v '/assets.go|/translations.go|/site/themes/|/site/node_modules|\./out|/hugo/' || true)"
|
||||
missing="$(go run boilerplate.go -rootdir ${ROOT_DIR} -boilerplate-dir ${BDIR} | egrep -v '/assets.go|/translations.go|/site/themes/|/site/node_modules|\./out|/hugo/|hack/benchmark/time-to-k8s/time-to-k8s-repo' || true)"
|
||||
if [[ -n "${missing}" ]]; then
|
||||
echo "boilerplate missing: $missing"
|
||||
echo "consider running: ${BDIR}/fix.sh"
|
||||
|
|
|
@ -29,7 +29,6 @@ import (
|
|||
"os/exec"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"runtime"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
@ -68,7 +67,7 @@ func TestAddons(t *testing.T) {
|
|||
}
|
||||
|
||||
args := append([]string{"start", "-p", profile, "--wait=true", "--memory=4000", "--alsologtostderr", "--addons=registry", "--addons=metrics-server", "--addons=olm", "--addons=volumesnapshots", "--addons=csi-hostpath-driver"}, StartArgs()...)
|
||||
if !NoneDriver() && !(runtime.GOOS == "darwin" && KicDriver()) { // none driver and macos docker driver does not support ingress
|
||||
if !NoneDriver() { // none driver does not support ingress
|
||||
args = append(args, "--addons=ingress")
|
||||
}
|
||||
if !arm64Platform() {
|
||||
|
@ -155,7 +154,7 @@ func TestAddons(t *testing.T) {
|
|||
// validateIngressAddon tests the ingress addon by deploying a default nginx pod
|
||||
func validateIngressAddon(ctx context.Context, t *testing.T, profile string) {
|
||||
defer PostMortemLogs(t, profile)
|
||||
if NoneDriver() || (runtime.GOOS == "darwin" && KicDriver()) {
|
||||
if NoneDriver() {
|
||||
t.Skipf("skipping: ingress not supported ")
|
||||
}
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
"- {{.logPath}}": "",
|
||||
"--kvm-numa-count range is 1-8": "",
|
||||
"--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "",
|
||||
"127.0.0.1": "",
|
||||
"\u003ctarget file absolute path\u003e must be an absolute Path. Relative Path is not allowed (example: \"/home/docker/copied.txt\")": "",
|
||||
"==\u003e Audit \u003c==": "",
|
||||
"==\u003e Last Start \u003c==": "",
|
||||
|
@ -153,7 +154,6 @@
|
|||
"Downloading Kubernetes {{.version}} preload ...": "",
|
||||
"Downloading VM boot image ...": "",
|
||||
"Downloading driver {{.driver}}:": "",
|
||||
"Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported.\nAlternatively to use this addon you can use a vm-based driver:\n\n\t'minikube start --vm=true'\n\nTo track the update on this work in progress feature please check:\nhttps://github.com/kubernetes/minikube/issues/7332": "",
|
||||
"Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.": "",
|
||||
"ERROR creating `registry-creds-acr` secret": "",
|
||||
"ERROR creating `registry-creds-dpr` secret": "",
|
||||
|
@ -402,6 +402,7 @@
|
|||
"Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "",
|
||||
"Number of lines back to go within the log": "",
|
||||
"OS release is {{.pretty_name}}": "",
|
||||
"One of 'text', 'yaml' or 'json'.": "",
|
||||
"One of 'yaml' or 'json'.": "",
|
||||
"Only alphanumeric and dashes '-' are permitted. Minimum 1 character, starting with alphanumeric.": "",
|
||||
"Only alphanumeric and dashes '-' are permitted. Minimum 2 characters, starting with alphanumeric.": "",
|
||||
|
@ -661,7 +662,7 @@
|
|||
"The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "",
|
||||
"The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "",
|
||||
"The service namespace": "",
|
||||
"The service {{.service}} requires privileged ports to be exposed: {{.ports}}": "",
|
||||
"The service/ingress {{.resource}} requires privileged ports to be exposed: {{.ports}}": "",
|
||||
"The services namespace": "",
|
||||
"The time interval for each check that wait performs in seconds": "",
|
||||
"The value passed to --format is invalid": "",
|
||||
|
@ -848,6 +849,7 @@
|
|||
"error provisioning guest": "",
|
||||
"error starting tunnel": "",
|
||||
"error stopping tunnel": "",
|
||||
"error: --output must be 'text', 'yaml' or 'json'": "",
|
||||
"error: --output must be 'yaml' or 'json'": "",
|
||||
"experimental": "",
|
||||
"failed to add node": "",
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
"- {{.logPath}}": "",
|
||||
"--kvm-numa-count range is 1-8": "",
|
||||
"--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "",
|
||||
"127.0.0.1": "",
|
||||
"\u003ctarget file absolute path\u003e must be an absolute Path. Relative Path is not allowed (example: \"/home/docker/copied.txt\")": "",
|
||||
"==\u003e Audit \u003c==": "",
|
||||
"==\u003e Last Start \u003c==": "",
|
||||
|
@ -407,6 +408,7 @@
|
|||
"Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "",
|
||||
"Number of lines back to go within the log": "",
|
||||
"OS release is {{.pretty_name}}": "",
|
||||
"One of 'text', 'yaml' or 'json'.": "",
|
||||
"One of 'yaml' or 'json'.": "",
|
||||
"Only alphanumeric and dashes '-' are permitted. Minimum 1 character, starting with alphanumeric.": "",
|
||||
"Only alphanumeric and dashes '-' are permitted. Minimum 2 characters, starting with alphanumeric.": "",
|
||||
|
@ -666,7 +668,7 @@
|
|||
"The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "",
|
||||
"The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "",
|
||||
"The service namespace": "",
|
||||
"The service {{.service}} requires privileged ports to be exposed: {{.ports}}": "",
|
||||
"The service/ingress {{.resource}} requires privileged ports to be exposed: {{.ports}}": "",
|
||||
"The services namespace": "",
|
||||
"The time interval for each check that wait performs in seconds": "",
|
||||
"The value passed to --format is invalid": "",
|
||||
|
@ -853,6 +855,7 @@
|
|||
"error provisioning guest": "",
|
||||
"error starting tunnel": "",
|
||||
"error stopping tunnel": "",
|
||||
"error: --output must be 'text', 'yaml' or 'json'": "",
|
||||
"error: --output must be 'yaml' or 'json'": "",
|
||||
"experimental": "",
|
||||
"failed to add node": "",
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
"- {{.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é",
|
||||
"127.0.0.1": "127.0.0.1",
|
||||
"\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 Last Start \u003c==": "==\u003e Dernier démarrage \u003c==",
|
||||
|
@ -70,8 +71,8 @@
|
|||
"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.",
|
||||
"CGroup allocation is not available in your environment, You might be running minikube in a nested container. Try running:\n\t\t\t\n\tminikube start --extra-config=kubelet.cgroups-per-qos=false --extra-config=kubelet.enforce-node-allocatable=\"\"\n\n\t\t\t\n\t\t\t": "",
|
||||
"CGroup allocation is not available in your environment. You might be running minikube in a nested container. Try running:\n\t\t\t\n\tminikube start --extra-config=kubelet.cgroups-per-qos=false --extra-config=kubelet.enforce-node-allocatable=\"\"\n\n\t\t\t\n\t\t\t": "",
|
||||
"CGroup allocation is not available in your environment, You might be running minikube in a nested container. Try running:\n\t\t\t\n\tminikube start --extra-config=kubelet.cgroups-per-qos=false --extra-config=kubelet.enforce-node-allocatable=\"\"\n\n\t\t\t\n\t\t\t": "L'allocation CGroup n'est pas disponible dans votre environnement, vous exécutez peut-être minikube dans un conteneur imbriqué. Essayez d'exécuter :\n\t\t\t\n\tminikube start --extra-config=kubelet.cgroups-per-qos=false --extra-config=kubelet.enforce-node-allocatable=\"\"\n\n\t\t\t\n\t\t\t",
|
||||
"CGroup allocation is not available in your environment. You might be running minikube in a nested container. Try running:\n\t\t\t\n\tminikube start --extra-config=kubelet.cgroups-per-qos=false --extra-config=kubelet.enforce-node-allocatable=\"\"\n\n\t\t\t\n\t\t\t": "L'allocation CGroup n'est pas disponible dans votre environnement, vous exécutez peut-être minikube dans un conteneur imbriqué. Essayez d'exécuter :\n\t\t\t\n\tminikube start --extra-config=kubelet.cgroups-per-qos=false --extra-config=kubelet.enforce-node-allocatable=\"\"\n\n\t\t\t\n\t\t\t",
|
||||
"CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)": "Plug-in CNI à utiliser. Options valides : auto, bridge, calico, cilium, flannel, kindnet ou chemin vers un manifeste CNI (par défaut : auto)",
|
||||
"Cache image from docker daemon": "Cacher l'image du démon docker",
|
||||
"Cache image from remote registry": "Cacher l'image du registre distant",
|
||||
|
@ -407,6 +408,7 @@
|
|||
"Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "Nombre de disques supplémentaires créés et attachés à la machine virtuelle minikube (actuellement implémenté uniquement pour le pilote hyperkit)",
|
||||
"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}}",
|
||||
"One of 'text', 'yaml' or 'json'.": "Un parmi 'text', 'yaml' ou 'json'.",
|
||||
"One of 'yaml' or 'json'.": "Un parmi 'yaml' ou 'json'.",
|
||||
"Only alphanumeric and dashes '-' are permitted. Minimum 1 character, starting with alphanumeric.": "Seuls les caractères alphanumériques et les tirets '-' sont autorisés. Minimum 1 caractère, commençant par alphanumérique.",
|
||||
"Only alphanumeric and dashes '-' are permitted. Minimum 2 characters, starting with alphanumeric.": "Seuls les caractères alphanumériques et les tirets '-' sont autorisés. Minimum 2 caractères, commençant par alphanumérique.",
|
||||
|
@ -570,7 +572,7 @@
|
|||
"Starts a node.": "Démarre un nœud.",
|
||||
"Starts an existing stopped node in a cluster.": "Démarre un nœud arrêté existant dans un cluster.",
|
||||
"Startup with {{.old_driver}} driver failed, trying with alternate driver {{.new_driver}}: {{.error}}": "Échec du démarrage avec le pilote {{.old_driver}}, essai avec un autre pilote {{.new_driver}} : {{.error}}",
|
||||
"Stopped tunnel for service {{.service}}.": "",
|
||||
"Stopped tunnel for service {{.service}}.": "Tunnel arrêté pour le service {{.service}}.",
|
||||
"Stopping \"{{.profile_name}}\" in {{.driver_name}} ...": "Arrêt de \"{{.profile_name}}\" sur {{.driver_name}}...",
|
||||
"Stopping node \"{{.name}}\" ...": "Nœud d'arrêt \"{{.name}}\" ...",
|
||||
"Stopping tunnel for service {{.service}}.": "Tunnel d'arrêt pour le service {{.service}}.",
|
||||
|
@ -668,6 +670,7 @@
|
|||
"The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "L'allocation de mémoire demandée de {{.requested}}MiB ne laisse pas de place pour la surcharge système (mémoire système totale : {{.system_limit}}MiB). Vous pouvez rencontrer des problèmes de stabilité.",
|
||||
"The service namespace": "L'espace de nom du service",
|
||||
"The service {{.service}} requires privileged ports to be exposed: {{.ports}}": "Le service {{.service}} nécessite l'exposition des ports privilégiés : {{.ports}}",
|
||||
"The service/ingress {{.resource}} requires privileged ports to be exposed: {{.ports}}": "Le service/ingress {{.resource}} nécessite l'exposition des ports privilégiés : {{.ports}}",
|
||||
"The services namespace": "L'espace de noms des services",
|
||||
"The time interval for each check that wait performs in seconds": "L'intervalle de temps pour chaque contrôle que wait effectue en secondes",
|
||||
"The value passed to --format is invalid": "La valeur passée à --format n'est pas valide",
|
||||
|
@ -860,6 +863,7 @@
|
|||
"error provisioning host": "erreur lors de l'approvisionnement de l'hôte",
|
||||
"error starting tunnel": "erreur de démarrage du tunnel",
|
||||
"error stopping tunnel": "erreur d'arrêt du tunnel",
|
||||
"error: --output must be 'text', 'yaml' or 'json'": "erreur : --output doit être 'text', 'yaml' ou 'json'",
|
||||
"error: --output must be 'yaml' or 'json'": "erreur : --output doit être 'yaml' ou 'json'",
|
||||
"experimental": "expérimental",
|
||||
"failed to add node": "échec de l'ajout du nœud",
|
||||
|
@ -965,4 +969,4 @@
|
|||
"{{.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}}"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
"- {{.logPath}}": "",
|
||||
"--kvm-numa-count range is 1-8": "",
|
||||
"--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "",
|
||||
"127.0.0.1": "",
|
||||
"\u003ctarget file absolute path\u003e must be an absolute Path. Relative Path is not allowed (example: \"/home/docker/copied.txt\")": "",
|
||||
"==\u003e Audit \u003c==": "",
|
||||
"==\u003e Last Start \u003c==": "",
|
||||
|
@ -150,7 +151,6 @@
|
|||
"Downloading Kubernetes {{.version}} preload ...": "Kubernetes {{.version}} のダウンロードの準備をしています",
|
||||
"Downloading VM boot image ...": "VM ブートイメージをダウンロードしています...",
|
||||
"Downloading driver {{.driver}}:": "{{.driver}} ドライバをダウンロードしています:",
|
||||
"Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported.\nAlternatively to use this addon you can use a vm-based driver:\n\n\t'minikube start --vm=true'\n\nTo track the update on this work in progress feature please check:\nhttps://github.com/kubernetes/minikube/issues/7332": "",
|
||||
"Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.": "",
|
||||
"ERROR creating `registry-creds-acr` secret": "`registry-creds-acr` シークレット作成中にエラーが発生しました",
|
||||
"ERROR creating `registry-creds-dpr` secret": "`registry-creds-dpr` シークレット作成中にエラーが発生しました",
|
||||
|
@ -398,6 +398,7 @@
|
|||
"Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "",
|
||||
"Number of lines back to go within the log": "",
|
||||
"OS release is {{.pretty_name}}": "OS は {{.pretty_name}} です。",
|
||||
"One of 'text', 'yaml' or 'json'.": "",
|
||||
"One of 'yaml' or 'json'.": "",
|
||||
"Only alphanumeric and dashes '-' are permitted. Minimum 1 character, starting with alphanumeric.": "",
|
||||
"Only alphanumeric and dashes '-' are permitted. Minimum 2 characters, starting with alphanumeric.": "",
|
||||
|
@ -661,7 +662,7 @@
|
|||
"The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "",
|
||||
"The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "",
|
||||
"The service namespace": "",
|
||||
"The service {{.service}} requires privileged ports to be exposed: {{.ports}}": "",
|
||||
"The service/ingress {{.resource}} requires privileged ports to be exposed: {{.ports}}": "",
|
||||
"The services namespace": "",
|
||||
"The time interval for each check that wait performs in seconds": "",
|
||||
"The value passed to --format is invalid": "",
|
||||
|
@ -856,6 +857,7 @@
|
|||
"error provisioning guest": "",
|
||||
"error starting tunnel": "tunnel を開始する際にエラーが発生しました",
|
||||
"error stopping tunnel": "tunnel を停止する際にエラーが発生しました",
|
||||
"error: --output must be 'text', 'yaml' or 'json'": "",
|
||||
"error: --output must be 'yaml' or 'json'": "エラーです。 --output は「 yaml 」、あるいは「 json 」である必要があります",
|
||||
"experimental": "",
|
||||
"failed to add node": "",
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
"- {{.logPath}}": "",
|
||||
"--kvm-numa-count range is 1-8": "--kvm-numa-count 범위는 1부터 8입니다",
|
||||
"--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "",
|
||||
"127.0.0.1": "",
|
||||
"\u003ctarget file absolute path\u003e must be an absolute Path. Relative Path is not allowed (example: \"/home/docker/copied.txt\")": "",
|
||||
"==\u003e Audit \u003c==": "",
|
||||
"==\u003e Last Start \u003c==": "",
|
||||
|
@ -162,7 +163,6 @@
|
|||
"Downloading VM boot image ...": "가상 머신 부트 이미지 다운로드 중 ...",
|
||||
"Downloading driver {{.driver}}:": "드라이버 {{.driver}} 다운로드 중 :",
|
||||
"Downloading {{.name}} {{.version}}": "{{.name}} {{.version}} 다운로드 중",
|
||||
"Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported.\nAlternatively to use this addon you can use a vm-based driver:\n\n\t'minikube start --vm=true'\n\nTo track the update on this work in progress feature please check:\nhttps://github.com/kubernetes/minikube/issues/7332": "",
|
||||
"Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.": "",
|
||||
"ERROR creating `registry-creds-acr` secret": "registry-creds-acr` secret 생성 오류",
|
||||
"ERROR creating `registry-creds-dpr` secret": "`registry-creds-dpr` secret 생성 오류",
|
||||
|
@ -423,6 +423,7 @@
|
|||
"Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "",
|
||||
"Number of lines back to go within the log": "",
|
||||
"OS release is {{.pretty_name}}": "",
|
||||
"One of 'text', 'yaml' or 'json'.": "",
|
||||
"One of 'yaml' or 'json'.": "",
|
||||
"Only alphanumeric and dashes '-' are permitted. Minimum 1 character, starting with alphanumeric.": "",
|
||||
"Only alphanumeric and dashes '-' are permitted. Minimum 2 characters, starting with alphanumeric.": "",
|
||||
|
@ -672,7 +673,7 @@
|
|||
"The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "",
|
||||
"The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "",
|
||||
"The service namespace": "",
|
||||
"The service {{.service}} requires privileged ports to be exposed: {{.ports}}": "",
|
||||
"The service/ingress {{.resource}} requires privileged ports to be exposed: {{.ports}}": "",
|
||||
"The services namespace": "",
|
||||
"The time interval for each check that wait performs in seconds": "",
|
||||
"The value passed to --format is invalid": "",
|
||||
|
@ -858,6 +859,7 @@
|
|||
"error provisioning guest": "",
|
||||
"error starting tunnel": "",
|
||||
"error stopping tunnel": "",
|
||||
"error: --output must be 'text', 'yaml' or 'json'": "",
|
||||
"error: --output must be 'yaml' or 'json'": "",
|
||||
"experimental": "",
|
||||
"failed to add node": "",
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
"- {{.logPath}}": "",
|
||||
"--kvm-numa-count range is 1-8": "",
|
||||
"--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "",
|
||||
"127.0.0.1": "",
|
||||
"\u003ctarget file absolute path\u003e must be an absolute Path. Relative Path is not allowed (example: \"/home/docker/copied.txt\")": "",
|
||||
"==\u003e Audit \u003c==": "==\u003e Audyt \u003c==",
|
||||
"==\u003e Last Start \u003c==": "==\u003e Ostatni start \u003c==",
|
||||
|
@ -162,7 +163,6 @@
|
|||
"Downloading VM boot image ...": "Pobieranie obrazu maszyny wirtualnej ...",
|
||||
"Downloading driver {{.driver}}:": "",
|
||||
"Downloading {{.name}} {{.version}}": "Pobieranie {{.name}} {{.version}}",
|
||||
"Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported.\nAlternatively to use this addon you can use a vm-based driver:\n\n\t'minikube start --vm=true'\n\nTo track the update on this work in progress feature please check:\nhttps://github.com/kubernetes/minikube/issues/7332": "",
|
||||
"Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.": "",
|
||||
"ERROR creating `registry-creds-acr` secret": "",
|
||||
"ERROR creating `registry-creds-dpr` secret": "",
|
||||
|
@ -415,6 +415,7 @@
|
|||
"Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "",
|
||||
"Number of lines back to go within the log": "",
|
||||
"OS release is {{.pretty_name}}": "Wersja systemu operacyjnego to {{.pretty_name}}",
|
||||
"One of 'text', 'yaml' or 'json'.": "",
|
||||
"One of 'yaml' or 'json'.": "Jeden z dwóćh formatów - 'yaml' lub 'json'",
|
||||
"Only alphanumeric and dashes '-' are permitted. Minimum 1 character, starting with alphanumeric.": "Tylko znaki alfanumeryczne oraz myślniki '-' są dozwolone. Co najmniej jeden znak, zaczynając od znaku alfanumerycznego",
|
||||
"Only alphanumeric and dashes '-' are permitted. Minimum 2 characters, starting with alphanumeric.": "Tylko znaki alfanumeryczne oraz myślniki '-' są dozwolone. Co najmniej dwa znaki, zaczynając od znaku alfanumerycznego",
|
||||
|
@ -680,7 +681,7 @@
|
|||
"The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "",
|
||||
"The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "",
|
||||
"The service namespace": "",
|
||||
"The service {{.service}} requires privileged ports to be exposed: {{.ports}}": "",
|
||||
"The service/ingress {{.resource}} requires privileged ports to be exposed: {{.ports}}": "",
|
||||
"The services namespace": "",
|
||||
"The time interval for each check that wait performs in seconds": "",
|
||||
"The value passed to --format is invalid": "Wartość przekazana do --format jest nieprawidłowa",
|
||||
|
@ -864,6 +865,7 @@
|
|||
"error provisioning guest": "",
|
||||
"error starting tunnel": "",
|
||||
"error stopping tunnel": "",
|
||||
"error: --output must be 'text', 'yaml' or 'json'": "",
|
||||
"error: --output must be 'yaml' or 'json'": "",
|
||||
"experimental": "",
|
||||
"failed to add node": "",
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
"- {{.logPath}}": "",
|
||||
"--kvm-numa-count range is 1-8": "",
|
||||
"--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "",
|
||||
"127.0.0.1": "",
|
||||
"\u003ctarget file absolute path\u003e must be an absolute Path. Relative Path is not allowed (example: \"/home/docker/copied.txt\")": "",
|
||||
"==\u003e Audit \u003c==": "",
|
||||
"==\u003e Last Start \u003c==": "",
|
||||
|
@ -145,7 +146,6 @@
|
|||
"Downloading Kubernetes {{.version}} preload ...": "",
|
||||
"Downloading VM boot image ...": "",
|
||||
"Downloading driver {{.driver}}:": "",
|
||||
"Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported.\nAlternatively to use this addon you can use a vm-based driver:\n\n\t'minikube start --vm=true'\n\nTo track the update on this work in progress feature please check:\nhttps://github.com/kubernetes/minikube/issues/7332": "",
|
||||
"Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.": "",
|
||||
"ERROR creating `registry-creds-acr` secret": "",
|
||||
"ERROR creating `registry-creds-dpr` secret": "",
|
||||
|
@ -235,6 +235,8 @@
|
|||
"Failed to load image": "",
|
||||
"Failed to persist images": "",
|
||||
"Failed to pull image": "",
|
||||
"Failed to pull images": "",
|
||||
"Failed to push images": "",
|
||||
"Failed to reload cached images": "",
|
||||
"Failed to remove image": "",
|
||||
"Failed to save config {{.profile}}": "",
|
||||
|
@ -245,6 +247,7 @@
|
|||
"Failed to start container runtime": "",
|
||||
"Failed to start {{.driver}} {{.driver_type}}. Running \"{{.cmd}}\" may fix it: {{.error}}": "",
|
||||
"Failed to stop node {{.name}}": "",
|
||||
"Failed to tag images": "",
|
||||
"Failed to update cluster": "",
|
||||
"Failed to update config": "",
|
||||
"Failed unmount: {{.error}}": "",
|
||||
|
@ -377,6 +380,7 @@
|
|||
"Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "",
|
||||
"Number of lines back to go within the log": "",
|
||||
"OS release is {{.pretty_name}}": "",
|
||||
"One of 'text', 'yaml' or 'json'.": "",
|
||||
"One of 'yaml' or 'json'.": "",
|
||||
"Only alphanumeric and dashes '-' are permitted. Minimum 1 character, starting with alphanumeric.": "",
|
||||
"Only alphanumeric and dashes '-' are permitted. Minimum 2 characters, starting with alphanumeric.": "",
|
||||
|
@ -408,6 +412,7 @@
|
|||
"Please make sure the service you are looking for is deployed or is in the correct namespace.": "",
|
||||
"Please provide a path or url to build": "",
|
||||
"Please provide an image in your local daemon to load into minikube via \u003cminikube image load IMAGE_NAME\u003e": "",
|
||||
"Please provide source and target image": "",
|
||||
"Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "",
|
||||
"Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "",
|
||||
"Please see {{.documentation_url}} for more details": "",
|
||||
|
@ -432,8 +437,10 @@
|
|||
"Profile name '{{.profilename}}' is not valid": "",
|
||||
"Profile name should be unique": "",
|
||||
"Provide VM UUID to restore MAC address (hyperkit driver only)": "",
|
||||
"Pull images": "",
|
||||
"Pull the remote image (no caching)": "",
|
||||
"Pulling base image ...": "",
|
||||
"Push images": "",
|
||||
"Push the new image (requires tag)": "",
|
||||
"Reboot to complete VirtualBox installation, verify that VirtualBox is not blocked by your system, and/or use another hypervisor": "",
|
||||
"Rebuild libvirt with virt-network support": "",
|
||||
|
@ -548,6 +555,7 @@
|
|||
"Successfully stopped node {{.name}}": "",
|
||||
"Suggestion: {{.advice}}": "",
|
||||
"System only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "",
|
||||
"Tag images": "",
|
||||
"Tag to apply to the new image (optional)": "",
|
||||
"Target directory {{.path}} must be an absolute path": "",
|
||||
"Target {{.path}} can not be empty": "",
|
||||
|
@ -619,7 +627,7 @@
|
|||
"The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "",
|
||||
"The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "",
|
||||
"The service namespace": "",
|
||||
"The service {{.service}} requires privileged ports to be exposed: {{.ports}}": "",
|
||||
"The service/ingress {{.resource}} requires privileged ports to be exposed: {{.ports}}": "",
|
||||
"The services namespace": "",
|
||||
"The time interval for each check that wait performs in seconds": "",
|
||||
"The value passed to --format is invalid": "",
|
||||
|
@ -793,6 +801,7 @@
|
|||
"error provisioning guest": "",
|
||||
"error starting tunnel": "",
|
||||
"error stopping tunnel": "",
|
||||
"error: --output must be 'text', 'yaml' or 'json'": "",
|
||||
"error: --output must be 'yaml' or 'json'": "",
|
||||
"experimental": "",
|
||||
"failed to add node": "",
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
"- {{.logPath}}": "",
|
||||
"--kvm-numa-count range is 1-8": "",
|
||||
"--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "",
|
||||
"127.0.0.1": "",
|
||||
"\u003ctarget file absolute path\u003e must be an absolute Path. Relative Path is not allowed (example: \"/home/docker/copied.txt\")": "",
|
||||
"==\u003e Audit \u003c==": "",
|
||||
"==\u003e Last Start \u003c==": "",
|
||||
|
@ -187,7 +188,6 @@
|
|||
"Downloading VM boot image ...": "正在下载 VM boot image...",
|
||||
"Downloading driver {{.driver}}:": "正在下载驱动 {{.driver}}:",
|
||||
"Downloading {{.name}} {{.version}}": "正在下载 {{.name}} {{.version}}",
|
||||
"Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported.\nAlternatively to use this addon you can use a vm-based driver:\n\n\t'minikube start --vm=true'\n\nTo track the update on this work in progress feature please check:\nhttps://github.com/kubernetes/minikube/issues/7332": "",
|
||||
"Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.": "",
|
||||
"ERROR creating `registry-creds-acr` secret": "",
|
||||
"ERROR creating `registry-creds-dpr` secret": "创建 `registry-creds-dpr` secret 时出错",
|
||||
|
@ -488,6 +488,7 @@
|
|||
"Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "",
|
||||
"Number of lines back to go within the log": "",
|
||||
"OS release is {{.pretty_name}}": "",
|
||||
"One of 'text', 'yaml' or 'json'.": "",
|
||||
"One of 'yaml' or 'json'.": "",
|
||||
"Only alphanumeric and dashes '-' are permitted. Minimum 1 character, starting with alphanumeric.": "",
|
||||
"Only alphanumeric and dashes '-' are permitted. Minimum 2 characters, starting with alphanumeric.": "",
|
||||
|
@ -768,7 +769,7 @@
|
|||
"The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "",
|
||||
"The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "",
|
||||
"The service namespace": "",
|
||||
"The service {{.service}} requires privileged ports to be exposed: {{.ports}}": "",
|
||||
"The service/ingress {{.resource}} requires privileged ports to be exposed: {{.ports}}": "",
|
||||
"The services namespace": "",
|
||||
"The time interval for each check that wait performs in seconds": "",
|
||||
"The value passed to --format is invalid": "",
|
||||
|
@ -970,6 +971,7 @@
|
|||
"error provisioning guest": "",
|
||||
"error starting tunnel": "",
|
||||
"error stopping tunnel": "",
|
||||
"error: --output must be 'text', 'yaml' or 'json'": "",
|
||||
"error: --output must be 'yaml' or 'json'": "",
|
||||
"experimental": "",
|
||||
"failed to add node": "",
|
||||
|
|
Loading…
Reference in New Issue