Skip to content

Commit

Permalink
Extract preloaded tarball as soon as minikube volume is created
Browse files Browse the repository at this point in the history
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`
  • Loading branch information
Priya Wadhwa committed Apr 7, 2020
1 parent a57dc85 commit b509d69
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 17 deletions.
37 changes: 24 additions & 13 deletions pkg/drivers/kic/kic.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"os/exec"
"strconv"
"strings"
"sync"
"time"

"github.com/docker/machine/libmachine/drivers"
Expand Down Expand Up @@ -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")
}
Expand All @@ -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
}

Expand Down
16 changes: 12 additions & 4 deletions pkg/drivers/kic/oci/oci.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down Expand Up @@ -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"
Expand Down

0 comments on commit b509d69

Please sign in to comment.