From e98370a5582243525b7a5d4b482f5368b4fa67da Mon Sep 17 00:00:00 2001 From: Thomas Stromberg Date: Fri, 10 Apr 2020 17:00:12 -0700 Subject: [PATCH] Modify applyKICOverlay so that it does not rely on piping stdin --- pkg/minikube/bootstrapper/kubeadm/kubeadm.go | 42 ++++++++++++-------- pkg/minikube/command/ssh_runner.go | 4 ++ 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go index 2bbf948e52..3be149ae2f 100644 --- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go +++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go @@ -101,8 +101,7 @@ func (k *Bootstrapper) LogCommands(cfg config.ClusterConfig, o bootstrapper.LogO dmesg.WriteString(fmt.Sprintf(" | tail -n %d", o.Lines)) } - describeNodes := fmt.Sprintf("sudo %s describe nodes --kubeconfig=%s", - path.Join(vmpath.GuestPersistentDir, "binaries", cfg.KubernetesConfig.KubernetesVersion, "kubectl"), + describeNodes := fmt.Sprintf("sudo %s describe nodes --kubeconfig=%s", kubectlPath(cfg), path.Join(vmpath.GuestPersistentDir, "kubeconfig")) return map[string]string{ @@ -208,7 +207,7 @@ func (k *Bootstrapper) init(cfg config.ClusterConfig) error { go func() { // the overlay is required for containerd and cri-o runtime: see #7428 if driver.IsKIC(cfg.Driver) && cfg.KubernetesConfig.ContainerRuntime != "docker" { - if err := k.applyKicOverlay(cfg); err != nil { + if err := k.applyKICOverlay(cfg); err != nil { glog.Errorf("failed to apply kic overlay: %v", err) } } @@ -694,7 +693,7 @@ func (k *Bootstrapper) UpdateNode(cfg config.ClusterConfig, n config.Node, r cru } // Installs compatibility shims for non-systemd environments - kubeletPath := path.Join(vmpath.GuestPersistentDir, "binaries", cfg.KubernetesConfig.KubernetesVersion, "kubectl") + kubeletPath := path.Join(vmpath.GuestPersistentDir, "binaries", cfg.KubernetesConfig.KubernetesVersion, "kubelet") shims, err := sm.GenerateInitShim("kubelet", kubeletPath, bsutil.KubeletSystemdConfFile) if err != nil { return errors.Wrap(err, "shim") @@ -754,21 +753,32 @@ func startKubeletIfRequired(runner command.Runner, sm sysinit.Manager) error { return sm.Start("kubelet") } -// applyKicOverlay applies the CNI plugin needed to make kic work -func (k *Bootstrapper) applyKicOverlay(cfg config.ClusterConfig) error { - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - - cmd := exec.CommandContext(ctx, "sudo", - path.Join(vmpath.GuestPersistentDir, "binaries", cfg.KubernetesConfig.KubernetesVersion, "kubectl"), "create", fmt.Sprintf("--kubeconfig=%s", path.Join(vmpath.GuestPersistentDir, "kubeconfig")), - "-f", "-") +// kubectlPath returns the path to the kubelet +func kubectlPath(cfg config.ClusterConfig) string { + return path.Join(vmpath.GuestPersistentDir, "binaries", cfg.KubernetesConfig.KubernetesVersion, "kubectl") +} +// applyKICOverlay applies the CNI plugin needed to make kic work +func (k *Bootstrapper) applyKICOverlay(cfg config.ClusterConfig) error { b := bytes.Buffer{} if err := kicCNIConfig.Execute(&b, struct{ ImageName string }{ImageName: kic.OverlayImage}); err != nil { return err } - cmd.Stdin = bytes.NewReader(b.Bytes()) + ko := path.Join(vmpath.GuestEphemeralDir, fmt.Sprintf("kic_overlay.yaml")) + f := assets.NewMemoryAssetTarget(b.Bytes(), ko, "0644") + + if err := k.c.Copy(f); err != nil { + return errors.Wrapf(err, "copy") + } + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + cmd := exec.CommandContext(ctx, "sudo", kubectlPath(cfg), "apply", + fmt.Sprintf("--kubeconfig=%s", path.Join(vmpath.GuestPersistentDir, "kubeconfig")), + "-f", ko) + if rr, err := k.c.RunCmd(cmd); err != nil { return errors.Wrapf(err, "cmd: %s output: %s", rr.Command(), rr.Output()) } @@ -797,8 +807,7 @@ func (k *Bootstrapper) applyNodeLabels(cfg config.ClusterConfig) error { defer cancel() // example: // sudo /var/lib/minikube/binaries//kubectl label nodes minikube.k8s.io/version= minikube.k8s.io/commit=aa91f39ffbcf27dcbb93c4ff3f457c54e585cf4a-dirty minikube.k8s.io/name=p1 minikube.k8s.io/updated_at=2020_02_20T12_05_35_0700 --all --overwrite --kubeconfig=/var/lib/minikube/kubeconfig - cmd := exec.CommandContext(ctx, "sudo", - path.Join(vmpath.GuestPersistentDir, "binaries", cfg.KubernetesConfig.KubernetesVersion, "kubectl"), + cmd := exec.CommandContext(ctx, "sudo", kubectlPath(cfg), "label", "nodes", verLbl, commitLbl, nameLbl, createdAtLbl, "--all", "--overwrite", fmt.Sprintf("--kubeconfig=%s", path.Join(vmpath.GuestPersistentDir, "kubeconfig"))) @@ -816,8 +825,7 @@ func (k *Bootstrapper) elevateKubeSystemPrivileges(cfg config.ClusterConfig) err defer cancel() rbacName := "minikube-rbac" // kubectl create clusterrolebinding minikube-rbac --clusterrole=cluster-admin --serviceaccount=kube-system:default - cmd := exec.CommandContext(ctx, "sudo", - path.Join(vmpath.GuestPersistentDir, "binaries", cfg.KubernetesConfig.KubernetesVersion, "kubectl"), + cmd := exec.CommandContext(ctx, "sudo", kubectlPath(cfg), "create", "clusterrolebinding", rbacName, "--clusterrole=cluster-admin", "--serviceaccount=kube-system:default", fmt.Sprintf("--kubeconfig=%s", path.Join(vmpath.GuestPersistentDir, "kubeconfig"))) rr, err := k.c.RunCmd(cmd) diff --git a/pkg/minikube/command/ssh_runner.go b/pkg/minikube/command/ssh_runner.go index 3e7a7cf0ad..e8b79cb031 100644 --- a/pkg/minikube/command/ssh_runner.go +++ b/pkg/minikube/command/ssh_runner.go @@ -140,6 +140,10 @@ func teeSSH(s *ssh.Session, cmd string, outB io.Writer, errB io.Writer) error { // RunCmd implements the Command Runner interface to run a exec.Cmd object func (s *SSHRunner) RunCmd(cmd *exec.Cmd) (*RunResult, error) { + if cmd.Stdin != nil { + return nil, fmt.Errorf("SSHRunner does not support stdin - you could be the first to add it") + } + rr := &RunResult{Args: cmd.Args} glog.Infof("Run: %v", rr.Command())