Skip to content

Commit de6194a

Browse files
committed
Use direct guest IP for k3d relays
1 parent e962eb9 commit de6194a

4 files changed

Lines changed: 95 additions & 31 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ docker_build("tilt-sample", ".")
199199
200200
k8s_yaml("k8s.yaml")
201201
202-
k8s_resource("tilt-sample", port_forwards=8080)
202+
k8s_resource("tilt-sample", port_forwards="8080:80")
203203
```
204204

205205
Run Tilt after the spind environment is ready.

examples/tilt/Tiltfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ docker_build("tilt-sample", ".")
44

55
k8s_yaml("k8s.yaml")
66

7-
k8s_resource("tilt-sample", port_forwards=8080)
7+
k8s_resource("tilt-sample", port_forwards="8080:80")

internal/spind/vm/start/kind_ready.go

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func (m *Manager) configureKubernetesEndpoint(ctx context.Context, name string,
8080
state.KubernetesLastError = err.Error()
8181
return state
8282
}
83-
pid, err := startKubernetesRelay(ctx, name, vmDir, metadata, state)
83+
pid, err := startKubernetesRelay(ctx, name, vmDir, metadata, state, kindMetadata)
8484
if err != nil {
8585
state.KubernetesLastError = err.Error()
8686
return state
@@ -119,39 +119,18 @@ func allocateKubernetesPort(preferred int) (int, error) {
119119
return listener.Addr().(*net.TCPAddr).Port, nil
120120
}
121121

122-
func startKubernetesRelay(ctx context.Context, name string, vmDir string, metadata spindvm.Metadata, state spindvm.State) (int, error) {
123-
return startTCPRelay(ctx, name, vmDir, metadata, state, state.KubernetesRelayLogPath, state.KubernetesAPIServerPort, state.KubernetesAPIServerTargetPort, "Kubernetes")
122+
func startKubernetesRelay(ctx context.Context, name string, vmDir string, metadata spindvm.Metadata, state spindvm.State, kindMetadata spindkind.Metadata) (int, error) {
123+
return startTCPRelay(ctx, name, vmDir, metadata, state, state.KubernetesRelayLogPath, state.KubernetesAPIServerPort, state.KubernetesAPIServerTargetPort, "Kubernetes", kindMetadata.Distribution == spindkind.DistributionK3d)
124124
}
125125

126126
func startRegistryRelay(ctx context.Context, name string, vmDir string, metadata spindvm.Metadata, state spindvm.State) (int, error) {
127-
return startTCPRelay(ctx, name, vmDir, metadata, state, state.RegistryRelayLogPath, state.RegistryPort, state.RegistryTargetPort, "registry")
127+
return startTCPRelay(ctx, name, vmDir, metadata, state, state.RegistryRelayLogPath, state.RegistryPort, state.RegistryTargetPort, "registry", true)
128128
}
129129

130-
func startTCPRelay(ctx context.Context, name string, vmDir string, metadata spindvm.Metadata, state spindvm.State, logPath string, listenPort int, targetPort int, service string) (int, error) {
131-
args := []string{
132-
"kubernetes-relay",
133-
name,
134-
"--listen-port", strconv.Itoa(listenPort),
135-
"--target-port", strconv.Itoa(targetPort),
136-
"--guest-port", fmt.Sprintf("%d", state.DockerTCPForwardGuestPort),
137-
}
138-
switch metadata.Backend {
139-
case BackendVirtualizationFramework:
140-
if state.ExecSocketPath == "" {
141-
return 0, errors.New("exec socket path is missing")
142-
}
143-
args = append(args,
144-
"--ssh-socket", state.ExecSocketPath,
145-
"--ssh-key", filepath.Join(vmDir, vmSSHPrivateKeyName),
146-
"--ssh-user", metadata.ExecUser,
147-
)
148-
case BackendCloudHypervisor:
149-
if state.CloudHypervisorVsockSocketPath == "" {
150-
return 0, errors.New("Cloud Hypervisor vsock socket path is missing")
151-
}
152-
args = append(args, "--vsock", state.CloudHypervisorVsockSocketPath)
153-
default:
154-
return 0, fmt.Errorf("unsupported backend %q", metadata.Backend)
130+
func startTCPRelay(ctx context.Context, name string, vmDir string, metadata spindvm.Metadata, state spindvm.State, logPath string, listenPort int, targetPort int, service string, preferGuestIP bool) (int, error) {
131+
args, err := tcpRelayArgs(name, vmDir, metadata, state, listenPort, targetPort, preferGuestIP)
132+
if err != nil {
133+
return 0, err
155134
}
156135
executable, err := os.Executable()
157136
if err != nil {
@@ -177,6 +156,38 @@ func startTCPRelay(ctx context.Context, name string, vmDir string, metadata spin
177156
return pid, nil
178157
}
179158

159+
func tcpRelayArgs(name string, vmDir string, metadata spindvm.Metadata, state spindvm.State, listenPort int, targetPort int, preferGuestIP bool) ([]string, error) {
160+
args := []string{
161+
"kubernetes-relay",
162+
name,
163+
"--listen-port", strconv.Itoa(listenPort),
164+
"--target-port", strconv.Itoa(targetPort),
165+
"--guest-port", fmt.Sprintf("%d", state.DockerTCPForwardGuestPort),
166+
}
167+
switch metadata.Backend {
168+
case BackendVirtualizationFramework:
169+
if preferGuestIP && state.DockerGuestIPAddress != "" {
170+
return append(args, "--guest-ip", state.DockerGuestIPAddress), nil
171+
}
172+
if state.ExecSocketPath == "" {
173+
return nil, errors.New("exec socket path is missing")
174+
}
175+
args = append(args,
176+
"--ssh-socket", state.ExecSocketPath,
177+
"--ssh-key", filepath.Join(vmDir, vmSSHPrivateKeyName),
178+
"--ssh-user", metadata.ExecUser,
179+
)
180+
case BackendCloudHypervisor:
181+
if state.CloudHypervisorVsockSocketPath == "" {
182+
return nil, errors.New("Cloud Hypervisor vsock socket path is missing")
183+
}
184+
args = append(args, "--vsock", state.CloudHypervisorVsockSocketPath)
185+
default:
186+
return nil, fmt.Errorf("unsupported backend %q", metadata.Backend)
187+
}
188+
return args, nil
189+
}
190+
180191
func kubectlCheckGeneratedKubeconfig(ctx context.Context, kubeconfigPath string) error {
181192
cmd := exec.CommandContext(ctx, "kubectl", "--kubeconfig", kubeconfigPath, "get", "nodes")
182193
output, err := cmd.CombinedOutput()

internal/spind/vm/start/manager_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"os/signal"
1818
"path/filepath"
1919
"runtime"
20+
"slices"
2021
"strconv"
2122
"strings"
2223
"syscall"
@@ -1862,6 +1863,58 @@ func TestUnknownVMFails(t *testing.T) {
18621863
}
18631864
}
18641865

1866+
func TestTCPRelayArgsUsesGuestIPWhenPreferred(t *testing.T) {
1867+
vmDir := t.TempDir()
1868+
args, err := tcpRelayArgs("work", vmDir, spindvm.Metadata{
1869+
Backend: BackendVirtualizationFramework,
1870+
ExecUser: "spind",
1871+
}, spindvm.State{
1872+
ExecSocketPath: filepath.Join(vmDir, "exec.sock"),
1873+
DockerGuestIPAddress: "192.168.64.202",
1874+
}, 49321, 40123, true)
1875+
if err != nil {
1876+
t.Fatal(err)
1877+
}
1878+
want := []string{
1879+
"kubernetes-relay",
1880+
"work",
1881+
"--listen-port", "49321",
1882+
"--target-port", "40123",
1883+
"--guest-port", "0",
1884+
"--guest-ip", "192.168.64.202",
1885+
}
1886+
if !slices.Equal(args, want) {
1887+
t.Fatalf("args = %#v, want %#v", args, want)
1888+
}
1889+
}
1890+
1891+
func TestTCPRelayArgsKeepsSSHWhenGuestIPIsNotPreferred(t *testing.T) {
1892+
vmDir := t.TempDir()
1893+
args, err := tcpRelayArgs("work", vmDir, spindvm.Metadata{
1894+
Backend: BackendVirtualizationFramework,
1895+
ExecUser: "spind",
1896+
}, spindvm.State{
1897+
ExecSocketPath: filepath.Join(vmDir, "exec.sock"),
1898+
DockerGuestIPAddress: "192.168.64.202",
1899+
}, 49321, 40123, false)
1900+
if err != nil {
1901+
t.Fatal(err)
1902+
}
1903+
want := []string{
1904+
"kubernetes-relay",
1905+
"work",
1906+
"--listen-port", "49321",
1907+
"--target-port", "40123",
1908+
"--guest-port", "0",
1909+
"--ssh-socket", filepath.Join(vmDir, "exec.sock"),
1910+
"--ssh-key", filepath.Join(vmDir, vmSSHPrivateKeyName),
1911+
"--ssh-user", "spind",
1912+
}
1913+
if !slices.Equal(args, want) {
1914+
t.Fatalf("args = %#v, want %#v", args, want)
1915+
}
1916+
}
1917+
18651918
func TestFakeRunnerProcess(t *testing.T) {
18661919
if os.Getenv("SPIND_FAKE_RUNNER") != "1" {
18671920
return

0 commit comments

Comments
 (0)