2020-02-18 17:34:21 +00:00
|
|
|
|
---
|
|
|
|
|
name: '[Enterprise] Register and Discover Services within Namespaces'
|
|
|
|
|
content_length: 8
|
|
|
|
|
id: discovery-namespaces
|
|
|
|
|
products_used:
|
|
|
|
|
- Consul
|
2020-04-07 18:55:19 +00:00
|
|
|
|
description: In this guide you will register and discover services within a namespace.
|
2020-02-18 17:34:21 +00:00
|
|
|
|
level: Implementation
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
!> **Warning:** This guide is a draft and has not been fully tested.
|
|
|
|
|
|
|
|
|
|
!> **Warning:** Consul 1.7 is currently a beta release.
|
|
|
|
|
|
|
|
|
|
Namespaces allow multiple teams within the same organization to share the same
|
|
|
|
|
Consul datacenter(s) by separating services, key/value pairs, and other Consul
|
|
|
|
|
data per team. This provides operators with the ability to more easily run
|
|
|
|
|
Consul as a service. Namespaces also enable operators to [delegate ACL
|
|
|
|
|
management](/consul/namespaces/secure-namespaces).
|
|
|
|
|
|
|
|
|
|
Any service that is not registered in a namespace will be added to the `default`
|
|
|
|
|
namespace. This means that all services are namespaced in Consul 1.7 and newer,
|
|
|
|
|
even if the operator has not created any namespaces.
|
|
|
|
|
|
|
|
|
|
By the end of this guide, you will register two services in the Consul catalog:
|
|
|
|
|
one in the `default` namespace and one in an operator-configured namespace.
|
|
|
|
|
After you have registered the services, you will then use the Consul CLI, API
|
|
|
|
|
and UI to discover all the services registered in the Consul catalog.
|
|
|
|
|
|
|
|
|
|
## Perquisites
|
|
|
|
|
|
|
|
|
|
To complete this guide you will need at least a [local dev
|
|
|
|
|
agent](/consul/getting-started/install) running Consul Enterprise 1.7 or newer.
|
|
|
|
|
Review the documentation for downloading the [Enterprise
|
2020-04-09 23:20:00 +00:00
|
|
|
|
binary](/docs/enterprise#applied-after-bootstrapping).
|
2020-02-18 17:34:21 +00:00
|
|
|
|
You can also use an existing Consul datacenter that is running Consul Enterprise
|
|
|
|
|
1.7 or newer.
|
|
|
|
|
|
|
|
|
|
You should have at least one namespace configured. Review the [namespace
|
|
|
|
|
management]() documentation or execute the following command to create a
|
|
|
|
|
namespace.
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
$ consul namespace create app-team
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Register services in namespaces
|
|
|
|
|
|
|
|
|
|
You can register services in a namespace by using your existing workflow and
|
|
|
|
|
adding namespace information to the registration. There are two ways to add a
|
|
|
|
|
service to a namespace:
|
|
|
|
|
|
|
|
|
|
- adding the `namespace` option to the service registration file.
|
|
|
|
|
- using the `namespace` flag with the API or CLI at registration time.
|
|
|
|
|
|
|
|
|
|
If you would like to migrate an existing service into a new namespace,
|
|
|
|
|
re-register the service with the new namespace information.
|
|
|
|
|
|
|
|
|
|
### Default namespace
|
|
|
|
|
|
|
|
|
|
To register a service in the `default` namespace, use your existing registration
|
|
|
|
|
workflow; you do not need to add namespace information. In the example below,
|
|
|
|
|
you will register the `mysql` service in the default namespace.
|
|
|
|
|
|
|
|
|
|
First, create a service registration file for the MySQL service and its sidecar
|
|
|
|
|
proxy.
|
|
|
|
|
|
|
|
|
|
```hcl
|
|
|
|
|
service {
|
|
|
|
|
name = “mysql"
|
|
|
|
|
port = 9003
|
|
|
|
|
connect {sidecar_proxy}
|
|
|
|
|
}
|
|
|
|
|
```
|
2020-04-06 20:27:35 +00:00
|
|
|
|
|
2020-02-18 17:34:21 +00:00
|
|
|
|
Next, register the service and its sidecar proxy using the Consul CLI by
|
|
|
|
|
specifying the registration file.
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
$ consul services register mysql.hcl
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### App-team namespace
|
|
|
|
|
|
|
|
|
|
To register a service in a user-defined namespace, include the namespace in the
|
|
|
|
|
registration file, or pass it with a flag at registration time. In this guide,
|
|
|
|
|
we will include the namespace in the file.
|
|
|
|
|
|
|
|
|
|
First, create the service registration file named `wordpress.hcl`. Paste in the
|
|
|
|
|
following registration, which includes the service name and port, and a sidecar
|
|
|
|
|
proxy, along with the namespace.
|
|
|
|
|
|
|
|
|
|
```hcl
|
|
|
|
|
service {
|
|
|
|
|
name = “wordpress"
|
|
|
|
|
port = 9003
|
|
|
|
|
connect {sidecar_proxy}
|
|
|
|
|
namespace = "app-team"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Next register the service and its sidecar proxy.
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
$ consul services register wordpress.hcl -namespace app-team
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Discover services
|
|
|
|
|
|
|
|
|
|
You can discover namespaced services using all the usual methods for service
|
|
|
|
|
discovery in Consul: the CLI, web UI, DNS interface, and HTTP API.
|
|
|
|
|
|
|
|
|
|
### Consul CLI
|
|
|
|
|
|
|
|
|
|
To get a list of services in the default namespace use the `consul catalog` CLI
|
|
|
|
|
command. You do not need to add the flag any discover services in the `default`
|
|
|
|
|
namespace.
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
$ consul catalog services
|
|
|
|
|
consul
|
|
|
|
|
mysql
|
|
|
|
|
mysql-proxy
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Notice that you do not see services that are registered in the app-team
|
|
|
|
|
namespace.
|
|
|
|
|
|
|
|
|
|
Add the `-namepsace` flag to discover services within a user-created namespace.
|
|
|
|
|
In the example below, you will use the `-namespace` flag with the CLI to
|
|
|
|
|
discover all services registered in the app-team namespace.
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
$ consul catalog services -namespace app-team
|
|
|
|
|
consul
|
|
|
|
|
wordpress
|
|
|
|
|
wordpress-proxy
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Notice that you do not see services that are registered in the default
|
|
|
|
|
namespace. To discover all services in the catalog, you will need to query all
|
|
|
|
|
Consul namespaces.
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
$ consul catalog services
|
|
|
|
|
consul
|
|
|
|
|
mysql
|
|
|
|
|
mysql-proxy
|
|
|
|
|
$ consul catalog services -namespace app-team
|
|
|
|
|
consul
|
|
|
|
|
wordpress
|
|
|
|
|
wordpress-proxy
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Consul UI
|
|
|
|
|
|
|
|
|
|
You can also view namespaced-services in the Consul UI. Select a namespace using
|
|
|
|
|
the drop-down menu at the top of the top navigation. Then go to the “Services”
|
|
|
|
|
tab to see the services within the namespace.
|
|
|
|
|
|
|
|
|
|
Before you select a namespace the UI will list the services in the `default`
|
|
|
|
|
namespace.
|
|
|
|
|
|
|
|
|
|
![IMAGE FROM RFC! REPLACE ME AT BETA LAUNCH](/static/img/consul/namespaces/consul-namespace-dropdown.png)
|
|
|
|
|
|
|
|
|
|
### DNS Interface
|
|
|
|
|
|
|
|
|
|
~> **Note:** To default to the `namespace` parameter in the DNS query, you must
|
|
|
|
|
set the `prefer_namespace` option to `true` in the [agent's configuration]().
|
|
|
|
|
The new query structure will be, `service.namespace.consul`. This will disable
|
|
|
|
|
the ability to query by datacenter only. However, you can add both namespace and
|
|
|
|
|
datacenter to the query, `service.namespace.datacenter.consul`.
|
|
|
|
|
|
|
|
|
|
To discover the location of service instances, you can use the DNS interface.
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
$ dig 127.0.0.1 -p 8500 wordpress.service.app-team.consul
|
|
|
|
|
<output should show one service>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
If you don’t specify a namespace in the query, you will get results from the
|
|
|
|
|
default namespace.
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
$ dig 127.0.0.1 -p 8500 wordpress.service.consul
|
|
|
|
|
<output should show no services>
|
|
|
|
|
```
|
2020-04-06 20:27:35 +00:00
|
|
|
|
|
2020-02-18 17:34:21 +00:00
|
|
|
|
### Consul HTTP API
|
|
|
|
|
|
|
|
|
|
The Consul HTTP API is more verbose than the DNS API; it allows you to discover
|
|
|
|
|
the service locations and additional metadata. To discover service information
|
|
|
|
|
within a namespace, add the `ns=` query parameter to the call.
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
curl http://127.0.0.1:8500/v1/catalog/service/wordpress?ns=app-team
|
|
|
|
|
<output shows one service>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Summary
|
|
|
|
|
|
|
|
|
|
In this guide, you registered two services: the WordPress service in the
|
|
|
|
|
app-team namespace and the MySQL service in the `default` namespace. You then
|
|
|
|
|
used the Consul CLI to discover services in both namespaces.
|
|
|
|
|
|
|
|
|
|
You can use ACLs to secure access to data, including services, in namespaces.
|
|
|
|
|
After ACLs are enabled, you will be able to restrict access to the namespaces
|
2020-04-06 20:27:35 +00:00
|
|
|
|
and all the data registered in that namespace.
|