2015-11-18 20:14:28 +00:00
|
|
|
---
|
|
|
|
layout: "docs"
|
|
|
|
page_title: "Service Discovery in Nomad"
|
2015-11-18 21:35:16 +00:00
|
|
|
sidebar_current: "docs-jobspec-service-discovery"
|
2015-11-18 20:14:28 +00:00
|
|
|
description: |-
|
|
|
|
Learn how to add service discovery to jobs
|
2015-11-18 22:11:23 +00:00
|
|
|
---
|
2015-11-18 20:14:28 +00:00
|
|
|
|
|
|
|
# Service Discovery
|
|
|
|
|
2015-11-18 21:15:47 +00:00
|
|
|
Nomad schedules workloads of various types across a cluster of generic hosts.
|
|
|
|
Because of this, placement is not known in advance and you will need to use
|
|
|
|
service discovery to connect tasks to other services deployed across your
|
2016-01-14 03:10:08 +00:00
|
|
|
cluster. Nomad integrates with [Consul](https://www.consul.io) to provide service
|
2015-11-18 21:15:47 +00:00
|
|
|
discovery and monitoring.
|
|
|
|
|
|
|
|
Note that in order to use Consul with Nomad, you will need to configure and
|
|
|
|
install Consul on your nodes alongside Nomad, or schedule it as a system job.
|
|
|
|
Nomad does not currently run Consul for you.
|
2015-11-18 20:14:28 +00:00
|
|
|
|
|
|
|
## Configuration
|
|
|
|
|
2016-06-14 22:21:57 +00:00
|
|
|
To configure Consul integration please see the Agent's configuration
|
|
|
|
[here](/docs/agent/config.html#consul_options).
|
2015-11-25 21:49:31 +00:00
|
|
|
|
2015-11-18 21:15:47 +00:00
|
|
|
## Service Definition Syntax
|
2015-11-18 20:14:28 +00:00
|
|
|
|
2016-01-27 05:09:03 +00:00
|
|
|
The service block in a Task definition defines a service which Nomad will
|
|
|
|
register with Consul. Multiple service blocks are allowed in a Task definition,
|
|
|
|
which allow registering multiple services for a Task that exposes multiple
|
2015-11-18 21:20:23 +00:00
|
|
|
ports.
|
2015-11-18 20:14:28 +00:00
|
|
|
|
2015-11-18 21:20:23 +00:00
|
|
|
### Example
|
2015-11-18 20:14:28 +00:00
|
|
|
|
|
|
|
A brief example of a service definition in a Task
|
2015-11-18 22:22:42 +00:00
|
|
|
|
2015-11-18 20:14:28 +00:00
|
|
|
```
|
|
|
|
group "database" {
|
|
|
|
task "mysql" {
|
|
|
|
driver = "docker"
|
|
|
|
service {
|
|
|
|
tags = ["master", "mysql"]
|
|
|
|
port = "db"
|
|
|
|
check {
|
|
|
|
type = "tcp"
|
2016-01-28 09:09:59 +00:00
|
|
|
interval = "10s"
|
2015-11-18 20:14:28 +00:00
|
|
|
timeout = "2s"
|
|
|
|
}
|
2016-03-26 20:02:30 +00:00
|
|
|
check {
|
|
|
|
type = "script"
|
|
|
|
name = "check_table"
|
2016-04-19 21:47:04 +00:00
|
|
|
command = "/usr/local/bin/check_mysql_table_status"
|
2016-03-28 17:06:44 +00:00
|
|
|
args = ["--verbose"]
|
2016-03-26 20:02:30 +00:00
|
|
|
interval = "60s"
|
|
|
|
timeout = "5s"
|
|
|
|
}
|
2015-11-18 20:14:28 +00:00
|
|
|
}
|
2015-11-18 21:15:47 +00:00
|
|
|
resources {
|
2015-11-18 20:14:28 +00:00
|
|
|
cpu = 500
|
|
|
|
memory = 1024
|
|
|
|
network {
|
|
|
|
mbits = 10
|
|
|
|
port "db" {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2015-11-18 21:20:23 +00:00
|
|
|
* `name`: Nomad automatically determines the name of a Task. By default the
|
2016-03-15 00:44:59 +00:00
|
|
|
name of a service is `$(job-name)-$(task-group)-$(task-name)`. Users can
|
2015-11-18 21:20:23 +00:00
|
|
|
explicitly name the service by specifying this option. If multiple services
|
2016-03-15 00:44:59 +00:00
|
|
|
are defined for a Task then only one task can have the default name, all
|
|
|
|
the services have to be explicitly named. Users can add the following to
|
|
|
|
the service names: `${JOB}`, `${TASKGROUP}`, `${TASK}`, `${BASE}`. Nomad
|
|
|
|
will replace them with the appropriate value of the Job, Task Group, and
|
|
|
|
Task names while registering the Job. `${BASE}` expands to
|
|
|
|
`${JOB}-${TASKGROUP}-${TASK}`. Names must be adhere to
|
|
|
|
[RFC-1123 §2.1](https://tools.ietf.org/html/rfc1123#section-2) and are
|
|
|
|
limited to alphanumeric and hyphen characters (i.e. `[a-z0-9\-]`), and be
|
|
|
|
less than 64 characters in length.
|
2015-11-18 20:14:28 +00:00
|
|
|
|
2016-03-26 21:45:04 +00:00
|
|
|
* `tags`: A list of tags associated with this Service. String interpolation is
|
|
|
|
supported in tags.
|
2015-11-18 20:14:28 +00:00
|
|
|
|
2016-04-14 17:57:42 +00:00
|
|
|
* `port`: `port` is optional and is used to associate the port with the service.
|
|
|
|
If specified, the port label must match one defined in the resources block.
|
|
|
|
This could be a label to either a dynamic or a static port. If an incorrect
|
|
|
|
port label is specified, Nomad doesn't register the IP:Port with Consul.
|
2015-11-18 20:14:28 +00:00
|
|
|
|
|
|
|
* `check`: A check block defines a health check associated with the service.
|
2016-03-26 20:02:30 +00:00
|
|
|
Multiple check blocks are allowed for a service. Nomad supports the `script`,
|
|
|
|
`http` and `tcp` Consul Checks. Script checks are not supported for the qemu
|
|
|
|
driver since the Nomad client doesn't have access to the file system of a
|
|
|
|
tasks using the Qemu driver.
|
2015-11-18 21:20:23 +00:00
|
|
|
|
|
|
|
### Check Syntax
|
2015-11-18 20:14:28 +00:00
|
|
|
|
|
|
|
* `type`: This indicates the check types supported by Nomad. Valid options are
|
2016-04-22 18:12:02 +00:00
|
|
|
currently `script`, `http` and `tcp`.
|
|
|
|
|
|
|
|
* `name`: The name of the health check.
|
2015-11-18 20:14:28 +00:00
|
|
|
|
2016-01-28 09:09:59 +00:00
|
|
|
* `interval`: This indicates the frequency of the health checks that Consul will
|
2015-11-18 20:14:28 +00:00
|
|
|
perform.
|
|
|
|
|
|
|
|
* `timeout`: This indicates how long Consul will wait for a health check query
|
|
|
|
to succeed.
|
|
|
|
|
|
|
|
* `path`: The path of the http endpoint which Consul will query to query the
|
2016-01-27 05:09:03 +00:00
|
|
|
health of a service if the type of the check is `http`. Nomad will add the IP
|
|
|
|
of the service and the port, users are only required to add the relative URL
|
2015-11-18 20:14:28 +00:00
|
|
|
of the health check endpoint.
|
|
|
|
|
2015-11-18 21:20:23 +00:00
|
|
|
* `protocol`: This indicates the protocol for the http checks. Valid options
|
2015-11-18 22:31:56 +00:00
|
|
|
are `http` and `https`. We default it to `http`
|
2015-11-18 20:14:28 +00:00
|
|
|
|
2016-03-28 21:25:15 +00:00
|
|
|
* `command`: This is the command that the Nomad client runs for doing script based
|
2016-03-26 20:02:30 +00:00
|
|
|
health check.
|
|
|
|
|
2016-03-28 21:25:15 +00:00
|
|
|
* `args`: Additional arguments to the `command` for script based health checks.
|
2016-03-26 20:02:30 +00:00
|
|
|
|
2015-11-18 21:20:23 +00:00
|
|
|
## Assumptions
|
2015-11-18 20:14:28 +00:00
|
|
|
|
2016-03-28 17:06:44 +00:00
|
|
|
* Consul 0.6.4 or later is needed for using the Script checks.
|
|
|
|
|
2016-01-27 05:09:03 +00:00
|
|
|
* Consul 0.6.0 or later is needed for using the TCP checks.
|
2015-11-18 20:22:48 +00:00
|
|
|
|
2016-01-27 05:09:03 +00:00
|
|
|
* The service discovery feature in Nomad depends on operators making sure that
|
|
|
|
the Nomad client can reach the Consul agent.
|
2015-11-18 20:14:28 +00:00
|
|
|
|
|
|
|
* Nomad assumes that it controls the life cycle of all the externally
|
|
|
|
discoverable services running on a host.
|
|
|
|
|
2016-01-27 05:09:03 +00:00
|
|
|
* Tasks running inside Nomad also need to reach out to the Consul agent if
|
2015-11-18 21:20:23 +00:00
|
|
|
they want to use any of the Consul APIs. Ex: A task running inside a docker
|
|
|
|
container in the bridge mode won't be able to talk to a Consul Agent running
|
|
|
|
on the loopback interface of the host since the container in the bridge mode
|
|
|
|
has it's own network interface and doesn't see interfaces on the global
|
|
|
|
network namespace of the host. There are a couple of ways to solve this, one
|
|
|
|
way is to run the container in the host networking mode, or make the Consul
|
2016-01-27 05:09:03 +00:00
|
|
|
agent listen on an interface in the network namespace of the container.
|