From b509d69182fc227c50fa6905feb96e08046a9673 Mon Sep 17 00:00:00 2001 From: Priya Wadhwa Date: Tue, 7 Apr 2020 14:19:20 -0700 Subject: [PATCH] Extract preloaded tarball as soon as minikube volume is created Extracting preload currently takes 6 seconds. This PR begins preload extraction as soon as the minikube volume is created, and runs it in parallell with creating the container node and setting up SSH. This shaves 2-3 secnods off of `node.StartHost` --- pkg/drivers/kic/kic.go | 37 ++++++++++++++++++++++++------------- pkg/drivers/kic/oci/oci.go | 16 ++++++++++++---- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/pkg/drivers/kic/kic.go b/pkg/drivers/kic/kic.go index 692bcdf485c0..081850a1249a 100644 --- a/pkg/drivers/kic/kic.go +++ b/pkg/drivers/kic/kic.go @@ -22,6 +22,7 @@ import ( "os/exec" "strconv" "strings" + "sync" "time" "github.com/docker/machine/libmachine/drivers" @@ -112,6 +113,28 @@ func (d *Driver) Create() error { } } + if err := oci.SetupContainerNode(params); err != nil { + return errors.Wrap(err, "setting up container node") + } + + var waitForPreload sync.WaitGroup + waitForPreload.Add(1) + go func() { + defer waitForPreload.Done() + // If preload doesn't exist, don't bother extracting tarball to volume + if !download.PreloadExists(d.NodeConfig.KubernetesVersion, d.NodeConfig.ContainerRuntime) { + return + } + t := time.Now() + glog.Infof("Starting extracting preloaded images to volume") + // Extract preloaded images to container + if err := oci.ExtractTarballToVolume(download.TarballPath(d.NodeConfig.KubernetesVersion, d.NodeConfig.ContainerRuntime), params.Name, BaseImage); err != nil { + glog.Infof("Unable to extract preloaded tarball to volume: %v", err) + } else { + glog.Infof("Took %f seconds to extract preloaded images to volume", time.Since(t).Seconds()) + } + }() + if err := oci.CreateContainerNode(params); err != nil { return errors.Wrap(err, "create kic node") } @@ -120,19 +143,7 @@ func (d *Driver) Create() error { return errors.Wrap(err, "prepare kic ssh") } - // If preload doesn't exist, don't bother extracting tarball to volume - if !download.PreloadExists(d.NodeConfig.KubernetesVersion, d.NodeConfig.ContainerRuntime) { - return nil - } - t := time.Now() - glog.Infof("Starting extracting preloaded images to volume") - // Extract preloaded images to container - if err := oci.ExtractTarballToVolume(download.TarballPath(d.NodeConfig.KubernetesVersion, d.NodeConfig.ContainerRuntime), params.Name, BaseImage); err != nil { - glog.Infof("Unable to extract preloaded tarball to volume: %v", err) - } else { - glog.Infof("Took %f seconds to extract preloaded images to volume", time.Since(t).Seconds()) - } - + waitForPreload.Wait() return nil } diff --git a/pkg/drivers/kic/oci/oci.go b/pkg/drivers/kic/oci/oci.go index 29b6ddbd9bbf..6605c3e332fc 100644 --- a/pkg/drivers/kic/oci/oci.go +++ b/pkg/drivers/kic/oci/oci.go @@ -84,6 +84,18 @@ func DeleteContainer(ociBin string, name string) error { return nil } +// SetupContainerNode sets up the container node +func SetupContainerNode(p CreateParams) error { + if p.OCIBinary != Docker { + return nil + } + if err := createDockerVolume(p.Name, p.Name); err != nil { + return errors.Wrapf(err, "creating volume for %s container", p.Name) + } + glog.Infof("Successfully created a docker volume %s", p.Name) + return nil +} + // CreateContainerNode creates a new container node func CreateContainerNode(p CreateParams) error { runArgs := []string{ @@ -122,10 +134,6 @@ func CreateContainerNode(p CreateParams) error { runArgs = append(runArgs, "--volume", fmt.Sprintf("%s:/var:exec", hostVarVolPath)) } if p.OCIBinary == Docker { - if err := createDockerVolume(p.Name, p.Name); err != nil { - return errors.Wrapf(err, "creating volume for %s container", p.Name) - } - glog.Infof("Successfully created a docker volume %s", p.Name) runArgs = append(runArgs, "--volume", fmt.Sprintf("%s:/var", p.Name)) // setting resource limit in privileged mode is only supported by docker // podman error: "Error: invalid configuration, cannot set resources with rootless containers not using cgroups v2 unified mode"