Consul: установка и базовые операции

Автор: | 02/02/2016
 

consul_logoКраткий HowTo по установке и использованию Consul от  Hashicorp.

Установка выполняется на Ubuntu 14.

Загрузить архив с Consul можно тут>>>.

Полная документация доступна тут>>>.

Установка Consul

Загружаем архив с подходящей сборкой со страницы загрузок>>>:

$ cd /tmp/
$ wget https://releases.hashicorp.com/consul/0.6.3/consul_0.6.3_linux_amd64.zip
$ unzip consul_0.6.3_linux_amd64.zip
Archive:  consul_0.6.3_linux_amd64.zip
  inflating: consul

Копируем исполняемый файл Consul в каталог из $PATH, например – /usr/local/bin:

$ sudo cp consul /usr/local/bin/

Проверяем:

$ consul -h
usage: consul [--version] [--help] <command> [<args>]

Available commands are:
    agent          Runs a Consul agent
    configtest     Validate config file
    event          Fire a new event
...

Запуск Consul-агента

Больше информации – тут>>>.

Запускаем агент в режиме разработки:

$ consul agent -dev

В случае ошибки вида:

$ ==> Starting Consul agent...
==> Error starting agent: Failed to get advertise address: Multiple private IPs found. Please configure one.

Добавьте опцию -bind с указанием IP, на котором будет работать Consul:

Получить IP можно так:

$ getip=$(ip a s | grep -E 'inet.*eth1' | awk '{print $2}' | cut -d"/" -f 1)

Запускаем:

$ consul agent -dev -bind $getip
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
         Node name: 'vagrant-ubuntu-trusty-64'
        Datacenter: 'dc1'
            Server: true (bootstrap: false)
       Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)
      Cluster Addr: 10.11.100.41 (LAN: 8301, WAN: 8302)
    Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
             Atlas: <disabled>

==> Log data will now stream in as it occurs:

    2016/02/01 10:40:49 [INFO] serf: EventMemberJoin: vagrant-ubuntu-trusty-64 10.11.100.41
    2016/02/01 10:40:49 [INFO] serf: EventMemberJoin: vagrant-ubuntu-trusty-64.dc1 10.11.100.41
...

Проверяем доступные ноды:

$ consul members
Node                      Address            Status  Type    Build  Protocol  DC
vagrant-ubuntu-trusty-64  10.11.100.41:8301  alive   server  0.6.3  2         dc1

Более полная информация:

$ consul members -detailed
Node                      Address            Status  Tags
vagrant-ubuntu-trusty-64  10.11.100.41:8301  alive   build=0.6.3:c933efde,dc=dc1,port=8300,role=consul,vsn=2,vsn_max=3,vsn_min=1

Или с помощью API:

$ curl localhost:8500/v1/catalog/nodes
[{"Node":"vagrant-ubuntu-trusty-64","Address":"10.11.100.41","CreateIndex":3,"ModifyIndex":4}]

С помощью DNS:

$ dig @127.0.0.1 -p 8600 vagrant-ubuntu-trusty-64.node.consul

; <<>> DiG 9.9.5-3ubuntu0.7-Ubuntu <<>> @127.0.0.1 -p 8600 vagrant-ubuntu-trusty-64.node.consul
...
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14279
...

;; QUESTION SECTION:
;vagrant-ubuntu-trusty-64.node.consul. IN A

;; ANSWER SECTION:
vagrant-ubuntu-trusty-64.node.consul. 0	IN A	10.11.100.41
...

Добавление служб

Про сервисы больше информации тут>>>. – read here https://www.consul.io/docs/agent/services.html

Создадим директорию для файлов конфигурации:

$ sudo mkdir /etc/consul.d

Установим какой-то сервис, например – Apache HTTP:

$ sudo apt-get install apache2

Добавляем файл настроек для проверки сервиса – /etc/consul.d/apache2.json:

$ cat /etc/consul.d/apache2.json
{"service":
	{
	"name": "apache2",
	"tags": ["httpd"],
	"port": 80
	}
}

Перезапускаем агент, указав опцию -config-dir:

$ consul agent -dev -bind $getip -config-dir /etc/consul.d
...
    2016/02/01 11:01:28 [INFO] agent: Synced service 'apache2'
...

Проверяем все сервисы с помощью API:

$ curl -s localhost:8500/v1/catalog/services | python -m json.tool
{
    "apache2": [
        "httpd"
    ],
    "consul": []
}

Только один добавленный сервис:

$ curl -s localhost:8500/v1/catalog/service/apache2 | python -m json.tool
[
    {
        "Address": "10.11.100.41",
        "CreateIndex": 5,
        "ModifyIndex": 5,
        "Node": "vagrant-ubuntu-trusty-64",
        "ServiceAddress": "",
        "ServiceEnableTagOverride": false,
        "ServiceID": "apache2",
        "ServiceName": "apache2",
        "ServicePort": 80,
        "ServiceTags": [
            "httpd"
        ]
    }
]

Обратите внимание – при проверке всех сервисов – URI содержит “/catalog/services/“, а для проверки одного – “/catalog/service/“.

Проверка при помощи DNS-запроса:

$ dig @127.0.0.1 -p 8600 apache2.service.consul

; <<>> DiG 9.9.5-3ubuntu0.7-Ubuntu <<>> @127.0.0.1 -p 8600 apache2.service.consul
...
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60121
...

;; QUESTION SECTION:
;apache2.service.consul.		IN	A

;; ANSWER SECTION:
apache2.service.consul.	0	IN	A	10.11.100.41
...

Хранилище KEY/VALUE

Больше информации – тут>>> и тут>>>.

Проверяем имеющиеся данные в хранилище:

$ curl -v http://localhost:8500/v1/kv/?recurse
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8500 (#0)
> GET /v1/kv/?recurse HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8500
> Accept: */*
>
< HTTP/1.1 404 Not Found
< X-Consul-Index: 1
< X-Consul-Knownleader: true
< X-Consul-Lastcontact: 0
< Date: Mon, 01 Feb 2016 11:16:44 GMT
< Content-Length: 0
< Content-Type: text/plain; charset=utf-8
<
* Connection #0 to host localhost left intact

404 ошибка – т.к. в хранилище нет никаких данных.

Добавим несколько:

$ curl -X PUT -d 'test' http://localhost:8500/v1/kv/web/key1
$ curl -X PUT -d 'test' http://localhost:8500/v1/kv/web/key2?flags=42
$ curl -X PUT -d 'test'  http://localhost:8500/v1/kv/web/sub/key3

Получаем их обратно:

$ curl -s -v http://localhost:8500/v1/kv/?recurse | python -m json.tool
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8500 (#0)
> GET /v1/kv/?recurse HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8500
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< X-Consul-Index: 46
< X-Consul-Knownleader: true
< X-Consul-Lastcontact: 0
< Date: Mon, 01 Feb 2016 11:20:33 GMT
< Content-Length: 294
<
{ [data not shown]
* Connection #0 to host localhost left intact
[
    {
        "CreateIndex": 43,
        "Flags": 0,
        "Key": "web/key1",
        "LockIndex": 0,
        "ModifyIndex": 43,
        "Value": "dGVzdA=="
    },
    {
        "CreateIndex": 44,
        "Flags": 42,
        "Key": "web/key2",
        "LockIndex": 0,
        "ModifyIndex": 44,
        "Value": "dGVzdA=="
    },
    {
        "CreateIndex": 46,
        "Flags": 0,
        "Key": "web/sub/key3",
        "LockIndex": 0,
        "ModifyIndex": 46,
        "Value": "dGVzdA=="
    }
]

Получаем один ключ:

$ curl -s -v http://localhost:8500/v1/kv/web/key1 | python -m json.tool
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8500 (#0)
> GET /v1/kv/web/key1 HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8500
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< X-Consul-Index: 43
< X-Consul-Knownleader: true
< X-Consul-Lastcontact: 0
< Date: Mon, 01 Feb 2016 11:21:25 GMT
< Content-Length: 97
<
{ [data not shown]
* Connection #0 to host localhost left intact
[
    {
        "CreateIndex": 43,
        "Flags": 0,
        "Key": "web/key1",
        "LockIndex": 0,
        "ModifyIndex": 43,
        "Value": "dGVzdA=="
    }
]

Удалить его можно так:

$ curl -s -v -X DELETE http://localhost:8500/v1/kv/web/key1
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8500 (#0)
> DELETE /v1/kv/web/key1 HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8500
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< Date: Mon, 01 Feb 2016 11:22:16 GMT
< Content-Length: 4
<
* Connection #0 to host localhost left intact

Проверяем:

$ curl -s -v http://localhost:8500/v1/kv/web/key1 | python -m json.tool
...
< HTTP/1.1 404 Not Found
...

Удалим все данные:

$ curl -s -v -X DELETE http://localhost:8500/v1/kv/web/?recurse
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8500 (#0)
> DELETE /v1/kv/web/?recurse HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8500
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< Date: Mon, 01 Feb 2016 11:23:11 GMT
< Content-Length: 4
<
* Connection #0 to host localhost left intact

Проверяем:

$ curl -s -v http://localhost:8500/v1/kv/?recurse
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8500 (#0)
> GET /v1/kv/?recurse HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8500
> Accept: */*
>
< HTTP/1.1 404 Not Found
< X-Consul-Index: 61
< X-Consul-Knownleader: true
< X-Consul-Lastcontact: 0
< Date: Mon, 01 Feb 2016 11:23:36 GMT
< Content-Length: 0
< Content-Type: text/plain; charset=utf-8
<
* Connection #0 to host localhost left intact

Для изменения имеющего ключа – выполняем PUT:

$ curl -X PUT -d 'test' http://localhost:8500/v1/kv/web/key1
true
$ curl -s http://localhost:8500/v1/kv/web/key1 | python -m json.tool
[
    {
        "CreateIndex": 67,
        "Flags": 0,
        "Key": "web/key1",
        "LockIndex": 0,
        "ModifyIndex": 67,
        "Value": "dGVzdA=="
    }
]

Проверяем.:

$ curl -s http://localhost:8500/v1/kv/web/key1 | python -m json.tool | grep Value | cut -d":" -f 2 | tr -d """ | tr -d " " | base64 --decode
test

Обновляем:

$ curl -X PUT -d 'NEWtest' http://localhost:8500/v1/kv/web/key1
true

И еще раз проверяем:

$ curl -s http://localhost:8500/v1/kv/web/key1 | python -m json.tool | grep Value | cut -d":" -f 2 | tr -d """ | tr -d " " | base64 --decode
NEWtest

Веб-интерфейс Consul

Для доступа к web-ui – перезапускаем агент с опцией -ui.

По умолчанию ui будет слушать localhost. Добавим опцию -client, что бы указать IP для интерфейса:

$ consul agent -dev -bind $getip -config-dir /etc/consul.d -ui -client=$getip
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
         Node name: 'vagrant-ubuntu-trusty-64'
        Datacenter: 'dc1'
            Server: true (bootstrap: false)
       Client Addr: 10.11.100.41 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)
      Cluster Addr: 10.11.100.41 (LAN: 8301, WAN: 8302)
    Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
             Atlas: <disabled>

==> Log data will now stream in as it occurs:

    2016/02/01 11:35:59 [INFO] serf: EventMemberJoin: vagrant-ubuntu-trusty-64 10.11.100.41
    2016/02/01 11:35:59 [INFO] serf: EventMemberJoin: vagrant-ubuntu-trusty-64.dc1 10.11.100.41
    2016/02/01 11:35:59 [INFO] raft: Node at 10.11.100.41:8300 [Follower] entering Follower state
    2016/02/01 11:35:59 [INFO] consul: adding LAN server vagrant-ubuntu-trusty-64 (Addr: 10.11.100.41:8300) (DC: dc1)
    2016/02/01 11:35:59 [INFO] consul: adding WAN server vagrant-ubuntu-trusty-64.dc1 (Addr: 10.11.100.41:8300) (DC: dc1)
...

Открываем http://10.11.100.41:8500/ui/:

Screen Shot 2016-02-01 at 13.46.52

Готово.

Аналогичный пост по Vaultтут>>>.

Vault + Consulтут>>>.