From 41be43647bc576c89c5075a7adb79932e5b6d7fd Mon Sep 17 00:00:00 2001 From: Levi Harrison Date: Tue, 27 Jul 2021 23:20:04 -0400 Subject: [PATCH 1/4] Implemented host_network_host setting Signed-off-by: Levi Harrison --- discovery/moby/docker.go | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/discovery/moby/docker.go b/discovery/moby/docker.go index 34eea7d4c9..3a5a11e7b3 100644 --- a/discovery/moby/docker.go +++ b/discovery/moby/docker.go @@ -54,6 +54,7 @@ var DefaultDockerSDConfig = DockerSDConfig{ RefreshInterval: model.Duration(60 * time.Second), Port: 80, Filters: []Filter{}, + HostNetworkHost: "localhost", HTTPClientConfig: config.DefaultHTTPClientConfig, } @@ -65,9 +66,10 @@ func init() { type DockerSDConfig struct { HTTPClientConfig config.HTTPClientConfig `yaml:",inline"` - Host string `yaml:"host"` - Port int `yaml:"port"` - Filters []Filter `yaml:"filters"` + Host string `yaml:"host"` + Port int `yaml:"port"` + Filters []Filter `yaml:"filters"` + HostNetworkHost string `yaml:"host_network_host"` RefreshInterval model.Duration `yaml:"refresh_interval"` } @@ -104,9 +106,10 @@ func (c *DockerSDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error type DockerDiscovery struct { *refresh.Discovery - client *client.Client - port int - filters filters.Args + client *client.Client + port int + hostNetworkHost string + filters filters.Args } // NewDockerDiscovery returns a new DockerDiscovery which periodically refreshes its targets. @@ -114,7 +117,8 @@ func NewDockerDiscovery(conf *DockerSDConfig, logger log.Logger) (*DockerDiscove var err error d := &DockerDiscovery{ - port: conf.Port, + port: conf.Port, + hostNetworkHost: conf.HostNetworkHost, } hostURL, err := url.Parse(conf.Host) @@ -245,7 +249,15 @@ func (d *DockerDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group, er labels[model.LabelName(k)] = model.LabelValue(v) } - addr := net.JoinHostPort(n.IPAddress, strconv.FormatUint(uint64(d.port), 10)) + // Containers in host networking mode don't have ports, + // so they only end up here, not in the previous loop. + var addr string + if c.HostConfig.NetworkMode != "host" { + addr = net.JoinHostPort(n.IPAddress, strconv.FormatUint(uint64(d.port), 10)) + } else { + addr = d.hostNetworkHost + } + labels[model.AddressLabel] = model.LabelValue(addr) tg.Targets = append(tg.Targets, labels) } From 89f154d643ef02e3fa97e18afeeb1e7b0f4b557f Mon Sep 17 00:00:00 2001 From: Levi Harrison Date: Tue, 27 Jul 2021 23:33:25 -0400 Subject: [PATCH 2/4] Added tests Signed-off-by: Levi Harrison --- config/config_test.go | 1 + discovery/moby/docker_test.go | 12 +++++- .../dockerprom/containers/json_limit_0.json | 39 +++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/config/config_test.go b/config/config_test.go index 0d569c59f3..c70a730090 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -738,6 +738,7 @@ var expectedConf = &Config{ Filters: []moby.Filter{}, Host: "unix:///var/run/docker.sock", Port: 80, + HostNetworkHost: "localhost", RefreshInterval: model.Duration(60 * time.Second), HTTPClientConfig: config.DefaultHTTPClientConfig, }, diff --git a/discovery/moby/docker_test.go b/discovery/moby/docker_test.go index 9ede9ab539..bb84b1571a 100644 --- a/discovery/moby/docker_test.go +++ b/discovery/moby/docker_test.go @@ -49,7 +49,7 @@ host: %s tg := tgs[0] require.NotNil(t, tg) require.NotNil(t, tg.Targets) - require.Equal(t, 2, len(tg.Targets)) + require.Equal(t, 3, len(tg.Targets)) for i, lbls := range []model.LabelSet{ { @@ -93,6 +93,16 @@ host: %s "__meta_docker_network_name": "dockersd_default", "__meta_docker_network_scope": "local", }, + { + "__address__": "localhost", + "__meta_docker_container_id": "54ed6cc5c0988260436cb0e739b7b6c9cad6c439a93b4c4fdbe9753e1c94b189", + "__meta_docker_container_label_com_docker_compose_project": "dockersd", + "__meta_docker_container_label_com_docker_compose_service": "host_networking", + "__meta_docker_container_label_com_docker_compose_version": "1.25.0", + "__meta_docker_container_name": "/dockersd_host_networking_1", + "__meta_docker_container_network_mode": "host", + "__meta_docker_network_ip": "", + }, } { t.Run(fmt.Sprintf("item %d", i), func(t *testing.T) { require.Equal(t, lbls, tg.Targets[i]) diff --git a/discovery/moby/testdata/dockerprom/containers/json_limit_0.json b/discovery/moby/testdata/dockerprom/containers/json_limit_0.json index 6405a091c8..37f575d22c 100644 --- a/discovery/moby/testdata/dockerprom/containers/json_limit_0.json +++ b/discovery/moby/testdata/dockerprom/containers/json_limit_0.json @@ -89,5 +89,44 @@ } }, "Mounts": [] + }, + { + "Id": "54ed6cc5c0988260436cb0e739b7b6c9cad6c439a93b4c4fdbe9753e1c94b189", + "Names": [ + "/dockersd_host_networking_1" + ], + "Image": "httpd", + "ImageID": "sha256:73b8cfec11558fe86f565b4357f6d6c8560f4c49a5f15ae970a24da86c9adc93", + "Command": "httpd-foreground", + "Created": 1627440494, + "Ports": [], + "Labels": { + "com.docker.compose.project": "dockersd", + "com.docker.compose.service": "host_networking", + "com.docker.compose.version": "1.25.0" + }, + "State": "running", + "Status": "Up 3 minutes", + "HostConfig": { "NetworkMode": "host" }, + "NetworkSettings": { + "Networks": { + "host": { + "IPAMConfig": null, + "Links": null, + "Aliases": null, + "NetworkID": "80c4459fa193c5c8b57e90e117d2f899d1a86708e548738149d62e03df0ec35c", + "EndpointID": "e9bea4c499c34bd41609b0e1e9b38f9964c69180c1a22130f28b6af802c156d8", + "Gateway": "", + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "MacAddress": "", + "DriverOpts": null + } + } + }, + "Mounts": [] } ] From 3556302c761f3be2e6ca5b6d16ec34632cb6c9de Mon Sep 17 00:00:00 2001 From: Levi Harrison Date: Tue, 27 Jul 2021 23:33:40 -0400 Subject: [PATCH 3/4] Added docs Signed-off-by: Levi Harrison --- docs/configuration/configuration.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md index ffd790ff07..456a7b5298 100644 --- a/docs/configuration/configuration.md +++ b/docs/configuration/configuration.md @@ -639,6 +639,9 @@ tls_config: # tasks and services that don't have published ports. [ port: | default = 80 ] +# The host to use if the container is in host networking mode. +[ host_network_host: | default = "localhost" ] + # Optional filters to limit the discovery process to a subset of available # resources. # The available filters are listed in the upstream documentation: From c1b1b826ce4b9142b1853a1c4688b4034f6bf280 Mon Sep 17 00:00:00 2001 From: Levi Harrison Date: Tue, 3 Aug 2021 05:58:49 -0600 Subject: [PATCH 4/4] HostNetworkHost -> HostNetworkingHost Signed-off-by: Levi Harrison --- config/config_test.go | 12 +++++------ discovery/moby/docker.go | 32 ++++++++++++++--------------- docs/configuration/configuration.md | 2 +- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/config/config_test.go b/config/config_test.go index c70a730090..d5cc092a27 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -735,12 +735,12 @@ var expectedConf = &Config{ ServiceDiscoveryConfigs: discovery.Configs{ &moby.DockerSDConfig{ - Filters: []moby.Filter{}, - Host: "unix:///var/run/docker.sock", - Port: 80, - HostNetworkHost: "localhost", - RefreshInterval: model.Duration(60 * time.Second), - HTTPClientConfig: config.DefaultHTTPClientConfig, + Filters: []moby.Filter{}, + Host: "unix:///var/run/docker.sock", + Port: 80, + HostNetworkingHost: "localhost", + RefreshInterval: model.Duration(60 * time.Second), + HTTPClientConfig: config.DefaultHTTPClientConfig, }, }, }, diff --git a/discovery/moby/docker.go b/discovery/moby/docker.go index 3a5a11e7b3..98dc42acbb 100644 --- a/discovery/moby/docker.go +++ b/discovery/moby/docker.go @@ -51,11 +51,11 @@ const ( // DefaultDockerSDConfig is the default Docker SD configuration. var DefaultDockerSDConfig = DockerSDConfig{ - RefreshInterval: model.Duration(60 * time.Second), - Port: 80, - Filters: []Filter{}, - HostNetworkHost: "localhost", - HTTPClientConfig: config.DefaultHTTPClientConfig, + RefreshInterval: model.Duration(60 * time.Second), + Port: 80, + Filters: []Filter{}, + HostNetworkingHost: "localhost", + HTTPClientConfig: config.DefaultHTTPClientConfig, } func init() { @@ -66,10 +66,10 @@ func init() { type DockerSDConfig struct { HTTPClientConfig config.HTTPClientConfig `yaml:",inline"` - Host string `yaml:"host"` - Port int `yaml:"port"` - Filters []Filter `yaml:"filters"` - HostNetworkHost string `yaml:"host_network_host"` + Host string `yaml:"host"` + Port int `yaml:"port"` + Filters []Filter `yaml:"filters"` + HostNetworkingHost string `yaml:"host_networking_host"` RefreshInterval model.Duration `yaml:"refresh_interval"` } @@ -106,10 +106,10 @@ func (c *DockerSDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error type DockerDiscovery struct { *refresh.Discovery - client *client.Client - port int - hostNetworkHost string - filters filters.Args + client *client.Client + port int + hostNetworkingHost string + filters filters.Args } // NewDockerDiscovery returns a new DockerDiscovery which periodically refreshes its targets. @@ -117,8 +117,8 @@ func NewDockerDiscovery(conf *DockerSDConfig, logger log.Logger) (*DockerDiscove var err error d := &DockerDiscovery{ - port: conf.Port, - hostNetworkHost: conf.HostNetworkHost, + port: conf.Port, + hostNetworkingHost: conf.HostNetworkingHost, } hostURL, err := url.Parse(conf.Host) @@ -255,7 +255,7 @@ func (d *DockerDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group, er if c.HostConfig.NetworkMode != "host" { addr = net.JoinHostPort(n.IPAddress, strconv.FormatUint(uint64(d.port), 10)) } else { - addr = d.hostNetworkHost + addr = d.hostNetworkingHost } labels[model.AddressLabel] = model.LabelValue(addr) diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md index 456a7b5298..4ef8ce4e01 100644 --- a/docs/configuration/configuration.md +++ b/docs/configuration/configuration.md @@ -640,7 +640,7 @@ tls_config: [ port: | default = 80 ] # The host to use if the container is in host networking mode. -[ host_network_host: | default = "localhost" ] +[ host_networking_host: | default = "localhost" ] # Optional filters to limit the discovery process to a subset of available # resources.