Skip to content

Commit

Permalink
Add Using Driver Address Mode docs
Browse files Browse the repository at this point in the history
  • Loading branch information
schmichael committed Dec 8, 2017
1 parent e2fed06 commit 1fb31c9
Showing 1 changed file with 123 additions and 4 deletions.
127 changes: 123 additions & 4 deletions website/source/docs/job-specification/service.html.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,10 @@ does not automatically enable service discovery.
and port. `driver` advertises the IP used in the driver (e.g. Docker's
internal IP) and uses the container's port specified in the port map. The
default is `auto` which behaves the same as `host` unless the driver
determines its IP should be used. This setting supported Docker since Nomad
0.6 and rkt since Nomad 0.7. It will advertise the container IP if a network
plugin is used (e.g. weave).
determines its IP should be used. This setting is supported in Docker since
Nomad 0.6 and rkt since Nomad 0.7. Nomad will advertise the container IP if a
network plugin is used (e.g. weave). See [below for
details.](#using-driver-address-mode)

### `check` Parameters

Expand All @@ -125,7 +126,8 @@ scripts.
- `address_mode` `(string: "host")` - Same as `address_mode` on `service`.
Unlike services, checks do not have an `auto` address mode as there's no way
for Nomad to know which is the best address to use for checks. Consul needs
access to the address for any HTTP or TCP checks. Added in Nomad 0.7.1.
access to the address for any HTTP or TCP checks. Added in Nomad 0.7.1. See
[below for details.](#using-driver-address-mode)

- `args` `(array<string>: [])` - Specifies additional arguments to the
`command`. This only applies to script-based health checks.
Expand Down Expand Up @@ -333,6 +335,123 @@ service {
}
```

### Using Driver Address Mode

The [Docker](/docs/drivers/docker.html#network_mode) and
[rkt](/docs/drivers/rkt.html#net) drivers support the `driver` setting for the
`address_mode` parameter in both `service` and `check` stanzas. The driver
address mode allows advertising and health checking the IP and port assigned to
a task by the driver. This way if you're using a network plugin like Weave with
Docker, you can advertise the Weave address in Consul instead of the host's
address.

For example if you were running the example Redis job in an environment with
Weave but Consul was running on the host you could use the following
configuration:

```hcl
job "example" {
datacenters = ["dc1"]
group "cache" {
task "redis" {
driver = "docker"
config {
image = "redis:3.2"
network_mode = "weave"
port_map {
db = 6379
}
}
resources {
cpu = 500 # 500 MHz
memory = 256 # 256MB
network {
mbits = 10
port "db" {}
}
}
service {
name = "weave-redis"
port = "db"
check {
name = "host-redis-check"
type = "tcp"
interval = "10s"
timeout = "2s"
}
}
}
}
}
```

No explicit `address_mode` required!

Services default to the `auto` address mode. When a Docker network mode other
than "host" or "bridge" is used, services will automatically advertise the
driver's address (in this case Weave's). The service will advertise the
container's port: 6379.

However since Consul is often run on the host without access to the Weave
network, `check` stanzas default to `host` address mode. The TCP check will run
against the host's IP and the dynamic host port assigned by Nomad.

Note that the `check` still inherits the `service` stanza's `db` port label,
but each will resolve the port label according to their address mode.

If Consul has access to the Weave network the job could be configured like
this:

```hcl
job "example" {
datacenters = ["dc1"]
group "cache" {
task "redis" {
driver = "docker"
config {
image = "redis:3.2"
network_mode = "weave"
# No port map required!
}
resources {
cpu = 500 # 500 MHz
memory = 256 # 256MB
network {
mbits = 10
}
}
service {
name = "weave-redis"
port = 6379
address_mode = "driver"
check {
name = "host-redis-check"
type = "tcp"
interval = "10s"
timeout = "2s"
port = 6379
address_mode = "driver"
}
}
}
}
}
```

In this case Nomad doesn't need to assign Redis any host ports. The `service`
and `check` stanzas can both specify the port number to advertise and check
directly since Nomad isn't managing any port assignments.


- - -

<sup><small>1</small></sup><small> Script checks are not supported for the
Expand Down

0 comments on commit 1fb31c9

Please sign in to comment.