Skip to content

Commit

Permalink
k8s: remove container runtime loading from the boot sequence (#6274)
Browse files Browse the repository at this point in the history
this should make tilt faster to load when connecting to a remote
or non-responsive k8s cluster

fixes #6265

Signed-off-by: Nick Santos <nick.santos@docker.com>
  • Loading branch information
nicks committed Dec 4, 2023
1 parent 825240f commit 43f9c6a
Show file tree
Hide file tree
Showing 10 changed files with 78 additions and 103 deletions.
4 changes: 3 additions & 1 deletion internal/build/test_utils.go
Expand Up @@ -49,7 +49,9 @@ func newDockerBuildFixture(t testing.TB) *dockerBuildFixture {
ctx, _, _ := testutils.CtxAndAnalyticsForTest()
env := clusterid.ProductGKE

dEnv := docker.ProvideClusterEnv(ctx, docker.RealClientCreator{}, "gke", env, wmcontainer.RuntimeDocker, k8s.FakeMinikube{})
kCli := k8s.NewFakeK8sClient(t)
kCli.Runtime = wmcontainer.RuntimeDocker
dEnv := docker.ProvideClusterEnv(ctx, docker.RealClientCreator{}, "gke", env, kCli, k8s.FakeMinikube{})
dCli := docker.NewDockerClient(ctx, docker.Env(dEnv))
_, ok := dCli.(*docker.Cli)
// If it wasn't an actual Docker client, it's an exploding client
Expand Down
10 changes: 9 additions & 1 deletion internal/cli/doctor.go
Expand Up @@ -137,7 +137,7 @@ func (c *doctorCmd) run(ctx context.Context, args []string) error {
ns, err := wireNamespace(ctx)
printField("Namespace", ns, err)

runtime, err := wireRuntime(ctx)
runtime, err := containerRuntime(ctx)
printField("Container Runtime", runtime, err)

kVersion, err := wireK8sVersion(ctx)
Expand Down Expand Up @@ -168,6 +168,14 @@ func (c *doctorCmd) run(ctx context.Context, args []string) error {
return nil
}

func containerRuntime(ctx context.Context) (container.Runtime, error) {
kClient, err := wireK8sClient(ctx)
if err != nil {
return "", err
}
return kClient.ContainerRuntime(ctx), nil
}

func clusterLocalRegistryDisplay(ctx context.Context) (string, error) {
kClient, err := wireK8sClient(ctx)
if err != nil {
Expand Down
10 changes: 0 additions & 10 deletions internal/cli/wire.go
Expand Up @@ -26,7 +26,6 @@ import (
"github.com/tilt-dev/tilt/internal/build"
"github.com/tilt-dev/tilt/internal/cloud"
"github.com/tilt-dev/tilt/internal/cloud/cloudurl"
"github.com/tilt-dev/tilt/internal/container"
"github.com/tilt-dev/tilt/internal/controllers"
"github.com/tilt-dev/tilt/internal/controllers/core/kubernetesdiscovery"
"github.com/tilt-dev/tilt/internal/docker"
Expand Down Expand Up @@ -69,7 +68,6 @@ var K8sWireSet = wire.NewSet(
k8s.ProvideRESTConfig,
k8s.ProvidePortForwardClient,
k8s.ProvideConfigNamespace,
k8s.ProvideContainerRuntime,
k8s.ProvideServerVersion,
k8s.ProvideK8sClient,
ProvideKubeContextOverride,
Expand Down Expand Up @@ -247,14 +245,6 @@ func wireClusterName(ctx context.Context) (k8s.ClusterName, error) {
return "", nil
}

func wireRuntime(ctx context.Context) (container.Runtime, error) {
wire.Build(
K8sWireSet,
k8s.ProvideMinikubeClient,
)
return "", nil
}

func wireK8sClient(ctx context.Context) (k8s.Client, error) {
wire.Build(
K8sWireSet,
Expand Down
51 changes: 11 additions & 40 deletions internal/cli/wire_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion internal/docker/client_integration_test.go
Expand Up @@ -18,7 +18,10 @@ import (

func TestCli_Run(t *testing.T) {
ctx, _, _ := testutils.CtxAndAnalyticsForTest()
dEnv := ProvideClusterEnv(ctx, RealClientCreator{}, "gke", clusterid.ProductGKE, wmcontainer.RuntimeDocker, k8s.FakeMinikube{})
k8sClient := k8s.NewFakeK8sClient(t)
k8sClient.Runtime = wmcontainer.RuntimeDocker

dEnv := ProvideClusterEnv(ctx, RealClientCreator{}, "gke", clusterid.ProductGKE, k8sClient, k8s.FakeMinikube{})
cli := NewDockerClient(ctx, Env(dEnv))
defer func() {
// release any idle connections to avoid out of file errors if running test many times
Expand Down
4 changes: 3 additions & 1 deletion internal/docker/client_test.go
Expand Up @@ -403,7 +403,9 @@ func TestProvideClusterProduct(t *testing.T) {

mkClient := k8s.FakeMinikube{DockerEnvMap: c.mkEnv, FakeVersion: minikubeV}
kubeContext := k8s.KubeContext(fmt.Sprintf("%s-me", c.env))
cluster := ProvideClusterEnv(context.Background(), fakeClientCreator{}, kubeContext, c.env, c.runtime, mkClient)
kCli := k8s.NewFakeK8sClient(t)
kCli.Runtime = c.runtime
cluster := ProvideClusterEnv(context.Background(), fakeClientCreator{}, kubeContext, c.env, kCli, mkClient)
assert.Equal(t, c.expectedCluster, Env(cluster))

local := ProvideLocalEnv(context.Background(), fakeClientCreator{}, kubeContext, c.env, cluster)
Expand Down
69 changes: 35 additions & 34 deletions internal/docker/env.go
Expand Up @@ -186,7 +186,7 @@ func ProvideClusterEnv(
creator ClientCreator,
kubeContext k8s.KubeContext,
product clusterid.Product,
runtime container.Runtime,
kClient k8s.Client,
minikubeClient k8s.MinikubeClient,
) ClusterEnv {
// start with an empty env, then populate with cluster-specific values if
Expand Down Expand Up @@ -219,45 +219,45 @@ func ProvideClusterEnv(
}
}

if runtime == container.RuntimeDocker {
if product == clusterid.ProductMinikube {
// If we're running Minikube with a docker runtime, talk to Minikube's docker socket.
envMap, ok, err := minikubeClient.DockerEnv(ctx)
if err != nil {
return ClusterEnv{Error: err}
}

if ok {
d, err := creator.FromEnvMap(envMap)
if err != nil {
return ClusterEnv{Error: fmt.Errorf("connecting to minikube: %v", err)}
}

// Handle the case where people manually set DOCKER_HOST to minikube.
if hostOverride == "" || hostOverride == d.DaemonHost() {
env.IsOldMinikube = isOldMinikube(ctx, minikubeClient)
env.BuildToKubeContexts = append(env.BuildToKubeContexts, string(kubeContext))
env.Client = d
for k, v := range envMap {
env.Environ = append(env.Environ, fmt.Sprintf("%s=%s", k, v))
}
sort.Strings(env.Environ)
}
if product == clusterid.ProductMinikube && kClient.ContainerRuntime(ctx) == container.RuntimeDocker {
// If we're running Minikube with a docker runtime, talk to Minikube's docker socket.
envMap, ok, err := minikubeClient.DockerEnv(ctx)
if err != nil {
return ClusterEnv{Error: err}
}

}
} else if product == clusterid.ProductMicroK8s {
// If we're running Microk8s with a docker runtime, talk to Microk8s's docker socket.
d, err := creator.FromEnvMap(map[string]string{"DOCKER_HOST": microK8sDockerHost})
if ok {
d, err := creator.FromEnvMap(envMap)
if err != nil {
return ClusterEnv{Error: fmt.Errorf("connecting to microk8s: %v", err)}
return ClusterEnv{Error: fmt.Errorf("connecting to minikube: %v", err)}
}

// Handle the case where people manually set DOCKER_HOST to microk8s.
// Handle the case where people manually set DOCKER_HOST to minikube.
if hostOverride == "" || hostOverride == d.DaemonHost() {
env.Client = d
env.Environ = append(env.Environ, fmt.Sprintf("DOCKER_HOST=%s", microK8sDockerHost))
env.IsOldMinikube = isOldMinikube(ctx, minikubeClient)
env.BuildToKubeContexts = append(env.BuildToKubeContexts, string(kubeContext))
env.Client = d
for k, v := range envMap {
env.Environ = append(env.Environ, fmt.Sprintf("%s=%s", k, v))
}
sort.Strings(env.Environ)
}

}
}

if product == clusterid.ProductMicroK8s && kClient.ContainerRuntime(ctx) == container.RuntimeDocker {
// If we're running Microk8s with a docker runtime, talk to Microk8s's docker socket.
d, err := creator.FromEnvMap(map[string]string{"DOCKER_HOST": microK8sDockerHost})
if err != nil {
return ClusterEnv{Error: fmt.Errorf("connecting to microk8s: %v", err)}
}

// Handle the case where people manually set DOCKER_HOST to microk8s.
if hostOverride == "" || hostOverride == d.DaemonHost() {
env.Client = d
env.Environ = append(env.Environ, fmt.Sprintf("DOCKER_HOST=%s", microK8sDockerHost))
env.BuildToKubeContexts = append(env.BuildToKubeContexts, string(kubeContext))
}
}

Expand All @@ -276,7 +276,8 @@ func ProvideClusterEnv(
// currently, we handle this by inspecting the Docker + K8s configs to see
// if they're matched up, but with the exception of microk8s (handled above),
// we don't override the environmental Docker config
if runtime == container.RuntimeDocker && willBuildToKubeContext(ctx, product, kubeContext, env) {
if willBuildToKubeContext(ctx, product, kubeContext, env) &&
kClient.ContainerRuntime(ctx) == container.RuntimeDocker {
env.BuildToKubeContexts = append(env.BuildToKubeContexts, string(kubeContext))
}

Expand Down

0 comments on commit 43f9c6a

Please sign in to comment.