Skip to content

Commit 6e5e4a6

Browse files
committed
Subscribe to container engine API for published ports
Monitor container creation and deletion events by subscribing to the container engine's API. Upon receiving a container creation or deletion event, the system immediately forwards the port mappings through the aggregated channel. This ensures that the ports are opened on the host without any latency. Signed-off-by: Nino Kodabande <[email protected]>
1 parent 5775c22 commit 6e5e4a6

27 files changed

+1501
-60
lines changed

cmd/lima-guestagent/daemon_linux.go

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,25 @@ func newDaemonCommand() *cobra.Command {
2828
daemonCommand.Flags().Duration("tick", 3*time.Second, "Tick for polling events")
2929
daemonCommand.Flags().Int("vsock-port", 0, "Use vsock server instead a UNIX socket")
3030
daemonCommand.Flags().String("virtio-port", "", "Use virtio server instead a UNIX socket")
31+
daemonCommand.Flags().StringSlice("docker-sockets", []string{}, "Paths to Docker socket files to monitor for exposed ports")
32+
daemonCommand.Flags().StringSlice("containerd-sockets", []string{}, "Paths to Containerd socket files to monitor for exposed ports")
33+
daemonCommand.Flags().StringSlice("kubernetes-configs", []string{}, "Path to Kubernetes config file to monitor for ports")
3134
return daemonCommand
3235
}
3336

3437
func daemonAction(cmd *cobra.Command, _ []string) error {
3538
ctx := cmd.Context()
39+
if os.Geteuid() != 0 {
40+
return errors.New("must run as the root user")
41+
}
3642
socket := "/run/lima-guestagent.sock"
3743
tick, err := cmd.Flags().GetDuration("tick")
3844
if err != nil {
3945
return err
4046
}
47+
if tick == 0 {
48+
return errors.New("tick must be specified")
49+
}
4150
vSockPort, err := cmd.Flags().GetInt("vsock-port")
4251
if err != nil {
4352
return err
@@ -46,12 +55,19 @@ func daemonAction(cmd *cobra.Command, _ []string) error {
4655
if err != nil {
4756
return err
4857
}
49-
if tick == 0 {
50-
return errors.New("tick must be specified")
58+
dockerSockets, err := cmd.Flags().GetStringSlice("docker-sockets")
59+
if err != nil {
60+
return err
5161
}
52-
if os.Geteuid() != 0 {
53-
return errors.New("must run as the root user")
62+
containerdSockets, err := cmd.Flags().GetStringSlice("containerd-sockets")
63+
if err != nil {
64+
return err
5465
}
66+
kubernetesConfig, err := cmd.Flags().GetStringSlice("kubernetes-configs")
67+
if err != nil {
68+
return err
69+
}
70+
5571
logrus.Infof("event tick: %v", tick)
5672

5773
newTicker := func() (<-chan time.Time, func()) {
@@ -62,7 +78,14 @@ func daemonAction(cmd *cobra.Command, _ []string) error {
6278
return ticker.C, ticker.Stop
6379
}
6480

65-
agent, err := guestagent.New(ctx, newTicker, tick*20)
81+
agent, err := guestagent.New(
82+
&guestagent.Config{
83+
Ticker: newTicker,
84+
IptablesIdle: tick * 20,
85+
DockerSockets: dockerSockets,
86+
ContainerdSockets: containerdSockets,
87+
KubernetesConfigs: kubernetesConfig,
88+
})
6689
if err != nil {
6790
return err
6891
}

cmd/lima-guestagent/install_systemd_linux.go

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ func newInstallSystemdCommand() *cobra.Command {
2626
}
2727
installSystemdCommand.Flags().Int("vsock-port", 0, "Use vsock server on specified port")
2828
installSystemdCommand.Flags().String("virtio-port", "", "Use virtio server instead a UNIX socket")
29+
installSystemdCommand.Flags().StringSlice("docker-sockets", []string{}, "Paths to Docker socket files to monitor for exposed ports")
30+
installSystemdCommand.Flags().StringSlice("containerd-sockets", []string{}, "Paths to Containerd socket files to monitor for exposed ports")
31+
installSystemdCommand.Flags().StringSlice("kubernetes-configs", []string{}, "Path to Kubernetes config files to monitor for ports")
2932
return installSystemdCommand
3033
}
3134

@@ -43,7 +46,25 @@ func installSystemdAction(cmd *cobra.Command, _ []string) error {
4346
if err != nil {
4447
return err
4548
}
46-
unit, err := generateSystemdUnit(vsockPort, virtioPort, debug)
49+
dockerSockets, err := cmd.Flags().GetStringSlice("docker-sockets")
50+
if err != nil {
51+
return err
52+
}
53+
containerdSockets, err := cmd.Flags().GetStringSlice("containerd-sockets")
54+
if err != nil {
55+
return err
56+
}
57+
kubernetesConfigs, err := cmd.Flags().GetStringSlice("kubernetes-configs")
58+
if err != nil {
59+
return err
60+
}
61+
unit, err := generateSystemdUnit(
62+
vsockPort,
63+
virtioPort,
64+
dockerSockets,
65+
containerdSockets,
66+
kubernetesConfigs,
67+
debug)
4768
if err != nil {
4869
return err
4970
}
@@ -82,7 +103,7 @@ func installSystemdAction(cmd *cobra.Command, _ []string) error {
82103
//go:embed lima-guestagent.TEMPLATE.service
83104
var systemdUnitTemplate string
84105

85-
func generateSystemdUnit(vsockPort int, virtioPort string, debug bool) ([]byte, error) {
106+
func generateSystemdUnit(vsockPort int, virtioPort string, dockerSockets, containerdSockets, kubeConfigs []string, debug bool) ([]byte, error) {
86107
selfExeAbs, err := os.Executable()
87108
if err != nil {
88109
return nil, err
@@ -98,6 +119,15 @@ func generateSystemdUnit(vsockPort int, virtioPort string, debug bool) ([]byte,
98119
if debug {
99120
args = append(args, "--debug")
100121
}
122+
if len(dockerSockets) > 0 {
123+
args = append(args, "--docker-sockets", strings.Join(dockerSockets, ","))
124+
}
125+
if len(containerdSockets) > 0 {
126+
args = append(args, "--containerd-sockets", strings.Join(containerdSockets, ","))
127+
}
128+
if len(kubeConfigs) > 0 {
129+
args = append(args, "--kubernetes-configs", strings.Join(kubeConfigs, ","))
130+
}
101131

102132
m := map[string]string{
103133
"Binary": selfExeAbs,

go.mod

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,13 @@ require (
1717
github.com/cpuguy83/go-md2man/v2 v2.0.7
1818
github.com/digitalocean/go-qemu v0.0.0-20221209210016-f035778c97f7
1919
github.com/diskfs/go-diskfs v1.7.0 // gomodjail:unconfined
20+
github.com/docker/docker v28.3.3+incompatible
21+
github.com/docker/go-connections v0.5.0
2022
github.com/docker/go-units v0.5.0
2123
github.com/elastic/go-libaudit/v2 v2.6.2
2224
github.com/foxcpp/go-mockdns v1.1.0
2325
github.com/goccy/go-yaml v1.18.0
26+
github.com/gogo/protobuf v1.3.2 // indirect
2427
github.com/google/go-cmp v0.7.0
2528
github.com/google/yamlfmt v0.17.2
2629
github.com/invopop/jsonschema v0.13.0
@@ -63,22 +66,22 @@ require (
6366
github.com/bmatcuk/doublestar/v4 v4.7.1 // indirect
6467
github.com/buger/jsonparser v1.1.1 // indirect
6568
github.com/containerd/log v0.1.0 // indirect
69+
github.com/creack/pty v1.1.18 // indirect
6670
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
6771
github.com/digitalocean/go-libvirt v0.0.0-20220804181439-8648fbde413e // indirect
6872
github.com/dimchansky/utfbom v1.1.1 // indirect
6973
github.com/djherbis/times v1.6.0 // indirect
7074
github.com/elliotchance/orderedmap v1.8.0 // indirect
7175
github.com/emicklei/go-restful/v3 v3.12.2 // indirect
7276
github.com/fatih/color v1.18.0 // indirect
73-
// gomodjail:unconfined
7477
github.com/fsnotify/fsnotify v1.8.0 // indirect
7578
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
7679
github.com/go-logr/logr v1.4.3 // indirect
7780
github.com/go-openapi/jsonpointer v0.21.0 // indirect
7881
github.com/go-openapi/jsonreference v0.21.0 // indirect
7982
github.com/go-openapi/swag v0.23.0 // indirect
8083
github.com/goccy/go-json v0.10.5 // indirect
81-
github.com/gogo/protobuf v1.3.2 // indirect
84+
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
8285
github.com/google/btree v1.1.3 // indirect
8386
github.com/google/gnostic-models v0.7.0 // indirect
8487
github.com/google/gopacket v1.1.19 // indirect
@@ -101,7 +104,11 @@ require (
101104
github.com/mitchellh/mapstructure v1.5.0 // indirect
102105
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
103106
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
107+
github.com/morikuni/aec v1.0.0 // indirect
104108
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
109+
github.com/opencontainers/image-spec v1.1.1 // indirect
110+
github.com/opencontainers/runtime-spec v1.1.0 // indirect
111+
github.com/opencontainers/selinux v1.11.0 // indirect
105112
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
106113
github.com/pierrec/lz4/v4 v4.1.22 // indirect
107114
github.com/pkg/errors v0.9.1 // indirect
@@ -113,11 +120,15 @@ require (
113120
github.com/u-root/uio v0.0.0-20240224005618-d2acac8f3701 // indirect
114121
github.com/x448/float16 v0.8.4 // indirect
115122
github.com/yuin/gopher-lua v1.1.1 // indirect
123+
go.opentelemetry.io/otel v1.37.0 // indirect
124+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 // indirect
125+
go.opentelemetry.io/otel/metric v1.37.0 // indirect
126+
go.opentelemetry.io/otel/trace v1.37.0 // indirect
116127
golang.org/x/crypto v0.42.0 // indirect
117128
golang.org/x/mod v0.27.0 // indirect
118129
golang.org/x/oauth2 v0.30.0 // indirect
119130
golang.org/x/term v0.35.0 // indirect
120-
golang.org/x/time v0.9.0 // indirect
131+
golang.org/x/time v0.12.0 // indirect
121132
golang.org/x/tools v0.36.0 // indirect
122133
google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect
123134
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
@@ -141,3 +152,40 @@ require (
141152
sigs.k8s.io/randfill v1.0.0 // indirect
142153
sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect
143154
)
155+
156+
require github.com/containerd/containerd v1.7.28
157+
158+
require (
159+
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect
160+
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 // indirect
161+
github.com/Microsoft/hcsshim v0.11.7 // indirect
162+
github.com/containerd/cgroups v1.1.0 // indirect
163+
github.com/containerd/containerd/api v1.9.0
164+
github.com/containerd/errdefs v0.3.0 // indirect
165+
github.com/containerd/fifo v1.1.0 // indirect
166+
github.com/containerd/platforms v0.2.1 // indirect
167+
github.com/containerd/ttrpc v1.2.7 // indirect
168+
github.com/containerd/typeurl/v2 v2.2.0 // indirect
169+
github.com/distribution/reference v0.6.0 // indirect
170+
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect
171+
github.com/felixge/httpsnoop v1.0.3 // indirect
172+
github.com/go-logr/stdr v1.2.2 // indirect
173+
github.com/klauspost/compress v1.17.4 // indirect
174+
github.com/moby/locker v1.0.1 // indirect
175+
github.com/moby/sys/mountinfo v0.6.2 // indirect
176+
github.com/moby/sys/sequential v0.6.0 // indirect
177+
github.com/moby/sys/signal v0.7.0 // indirect
178+
github.com/moby/sys/user v0.3.0 // indirect
179+
github.com/moby/sys/userns v0.1.0 // indirect
180+
go.opencensus.io v0.24.0 // indirect
181+
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
182+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 // indirect
183+
google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 // indirect
184+
)
185+
186+
require (
187+
github.com/containerd/errdefs/pkg v0.3.0 // indirect
188+
github.com/moby/docker-image-spec v1.3.1 // indirect
189+
github.com/moby/sys/atomicwriter v0.1.0 // indirect
190+
github.com/moby/term v0.5.2 // indirect
191+
)

0 commit comments

Comments
 (0)