From 2a9e9b2425b5fd87dc533c8566f24ec79bbefa04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20F=20Bj=C3=B6rklund?= Date: Mon, 20 Jul 2020 21:50:13 +0200 Subject: [PATCH 1/2] Make sure to prepare the kic volume after creation The volume is created as empty, so make sure that we run a container to do the initial copy of /var from the image. This is to avoid race conditions later on, where the preload starts to use the created volume for packing up the tarball. --- pkg/drivers/kic/oci/oci.go | 4 ++++ pkg/drivers/kic/oci/volumes.go | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/pkg/drivers/kic/oci/oci.go b/pkg/drivers/kic/oci/oci.go index 3ef6a94cfbc9..e66b76597ced 100644 --- a/pkg/drivers/kic/oci/oci.go +++ b/pkg/drivers/kic/oci/oci.go @@ -99,6 +99,10 @@ func PrepareContainerNode(p CreateParams) error { return errors.Wrapf(err, "creating volume for %s container", p.Name) } glog.Infof("Successfully created a %s volume %s", p.OCIBinary, p.Name) + if err := prepareVolume(p.OCIBinary, p.Image, p.Name); err != nil { + return errors.Wrapf(err, "preparing volume for %s container", p.Name) + } + glog.Infof("Successfully prepared a %s volume %s", p.OCIBinary, p.Name) return nil } diff --git a/pkg/drivers/kic/oci/volumes.go b/pkg/drivers/kic/oci/volumes.go index f3fb62d13a68..f43007ec7b1b 100644 --- a/pkg/drivers/kic/oci/volumes.go +++ b/pkg/drivers/kic/oci/volumes.go @@ -106,3 +106,14 @@ func createVolume(ociBin string, profile string, nodeName string) error { } return nil } + +// prepareVolume will copy the initial content of the mount point by starting a container to check the expected content +func prepareVolume(ociBin string, imageName string, nodeName string) error { + cmdArgs := []string{"run", "--rm", "--entrypoint", "/usr/bin/test"} + cmdArgs = append(cmdArgs, "-v", fmt.Sprintf("%s:/var", nodeName), imageName, "-d", "/var/lib") + cmd := exec.Command(ociBin, cmdArgs...) + if _, err := runCmd(cmd); err != nil { + return err + } + return nil +} \ No newline at end of file From 22585c3a1709266b551f9df27c7b4efb8d4772fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20F=20Bj=C3=B6rklund?= Date: Mon, 20 Jul 2020 21:53:31 +0200 Subject: [PATCH 2/2] Use the preload container run for podman as well Now that there is no more race between the containers for preparing the volume, we can use it for podman as well... Previously we risked ending up with not copying the contents of /var from the container image, which made it not work. --- pkg/drivers/kic/kic.go | 37 +++++++++++++++------------------- pkg/drivers/kic/oci/volumes.go | 2 +- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/pkg/drivers/kic/kic.go b/pkg/drivers/kic/kic.go index 153f43c81702..aee0501166de 100644 --- a/pkg/drivers/kic/kic.go +++ b/pkg/drivers/kic/kic.go @@ -122,27 +122,22 @@ func (d *Driver) Create() error { } var waitForPreload sync.WaitGroup - if d.NodeConfig.OCIBinary == oci.Docker { - 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(d.NodeConfig.OCIBinary, download.TarballPath(d.NodeConfig.KubernetesVersion, d.NodeConfig.ContainerRuntime), params.Name, d.NodeConfig.ImageDigest); err != nil { - glog.Infof("Unable to extract preloaded tarball to volume: %v", err) - } else { - glog.Infof("duration metric: took %f seconds to extract preloaded images to volume", time.Since(t).Seconds()) - } - }() - } else { - // driver == "podman" - glog.Info("Driver isn't docker, skipping extracting preloaded images") - } + 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(d.NodeConfig.OCIBinary, download.TarballPath(d.NodeConfig.KubernetesVersion, d.NodeConfig.ContainerRuntime), params.Name, d.NodeConfig.ImageDigest); err != nil { + glog.Infof("Unable to extract preloaded tarball to volume: %v", err) + } else { + glog.Infof("duration metric: 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") diff --git a/pkg/drivers/kic/oci/volumes.go b/pkg/drivers/kic/oci/volumes.go index f43007ec7b1b..ef1629df83fd 100644 --- a/pkg/drivers/kic/oci/volumes.go +++ b/pkg/drivers/kic/oci/volumes.go @@ -116,4 +116,4 @@ func prepareVolume(ociBin string, imageName string, nodeName string) error { return err } return nil -} \ No newline at end of file +}