使用docker安装consul

  • 查找consul
  1. docker search consul
  • 下载consul
  1. docker pull consul
  • 下载指定版本的consul
  1. docker pull consul:1.4.2

启动consul

  • 启动示例(server-leader模式)
  1. docker run -d --name consul_server1 -p 8400:8400 -p 8500:8500 -p 8600:53/udp -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' consul agent -server -bind=127.0.0.1 -bootstrap-expect=1 -node=consul_server1 -ui -client 0.0.0.0
  • 参数说明

    • docker 程序参数说明:

      • -d 以守护进程方式运行(后台)
      • —name docker app 容器名,未指定,则随机生成
      • -p 端口暴露,容器内部服务端口与物理机端口映射格式;说明:物理机端口:容器内部服务端口
      • -e 系统环境变量
    • consul 服务参数说明:

      • CONSUL_LOCAL_CONFIG consul服务配置, 参数内容:Json格式
      • -server 指定启动模式为server
      • -bind 集群内部各节点通讯地址
      • -bootstrap-expect 集群服务,标识datacenter需要参与选举集群节点数, 一旦指定该参数,则集群服务只会在节点数符合预期值,服务才能启动
      • -node 节点名字
      • -ui 启用内置Consul管理界面
      • -client 客户端绑定地址,默认为127.0.0.1
  • 启动示例(server模式)
  1. docker run -d --net=host -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' consul agent -server -bind=127.0.0.1 -retry-join=127.0.0.1 -bootstrap-expect=3
  • 参数说明

    • —net 标志指定希望在哪个网络上运行该容器
    • -retry-join 指定要加入那个节点,启动集群服务, 单节点可不指定
  • 启动示例(client模式)
  1. docker run -d --net=host -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' consul agent -bind=127.0.0.1 -retry-join=127.0.0.1
  • 查看集群状态
  1. docker exec -t node1 consul members

consul使用

注册服务

  • 调用 curl http://consul:8500/v1/agent/service/register PUT 注册一个服务.
  • request body:
  1. {
  2. "ID": "userServiceId", //服务id
  3. "Name": "userService", //服务名
  4. "Tags": [ //服务的tag,自定义,可以根据这个tag来区分同一个服务名的服务
  5. "primary",
  6. "v1"
  7. ],
  8. "Address": "127.0.0.1",//服务注册到consulIP,服务发现,发现的就是这个IP
  9. "Port": 8000, //服务注册consulPORT,发现的就是这个PORT
  10. "EnableTagOverride": false,
  11. "Check": { //健康检查部分
  12. "DeregisterCriticalServiceAfter": "90m",
  13. "HTTP": "http://www.baidu.com", //指定健康检查的URL,调用后只要返回20Xconsul都认为是健康的
  14. "Interval": "10s" //健康检查间隔时间,每隔10s,调用一次上面的URL
  15. }
  16. }
  • 示例:
  1. 请求:
  1. curl http://172.17.0.4:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '{
  2. "ID": "userServiceId",
  3. "Name": "userService",
  4. "Tags": [
  5. "primary",
  6. "v1"
  7. ],
  8. "Address": "127.0.0.1",
  9. "Port": 8000,
  10. "EnableTagOverride": false,
  11. "Check": {
  12. "DeregisterCriticalServiceAfter": "90m",
  13. "HTTP": "http://www.baidu.com",
  14. "Interval": "10s"
  15. }
  16. }'
  1. 响应:
  1. HTTP/1.1 200 OK
  2. Vary: Accept-Encoding
  3. Date: Wed, 20 Feb 2019 02:28:33 GMT
  4. Content-Length: 0

发现服务

  • 调用curl http://127.0.0.1:8500/v1/catalog/service/userService GET 发现一个服务
  • 示例:
  1. 请求:
    curl http://172.17.0.4:8500/v1/catalog/service/userService
  2. 响应:
  1. [
  2. {
  3. "Address": "172.17.0.4",
  4. "CreateIndex": 880,
  5. "ID": "e6e9a8cb-c47e-4be9-b13e-a24a1582e825",
  6. "ModifyIndex": 880,
  7. "Node": "node3",
  8. "NodeMeta": {},
  9. "ServiceAddress": "127.0.0.1",
  10. "ServiceEnableTagOverride": false,
  11. "ServiceID": "userServiceId",
  12. "ServiceName": "userService",
  13. "ServicePort": 8000,
  14. "ServiceTags": [
  15. "primary",
  16. "v1"
  17. ],
  18. "TaggedAddresses": {
  19. "lan": "172.17.0.4",
  20. "wan": "172.17.0.4"
  21. }
  22. }
  23. ]

存储配置

  • 示例:
  1. 定义值
  1. curl -X PUT -d 'test' http://127.0.0.1:8500/v1/kv/web/key1?flags=42
  1. 修改值
  1. curl -X PUT -d 'newval' http://127.0.0.1:8500/v1/kv/web/key1?flags=734

发现配置

获取特定的值

  1. curl -s http://127.0.0.1:8500/v1/kv/web/key1 | python -m json.tool

集群搭建

以部署3个节点的集群为例

  • 前期准备

    • 部署3个节点

      • 节点名自定,示例为: c1,c2,c3
    • 在当前目录分别新建三个目录c1,c2,c3
    • 分别在c1,c2,c3目录创建目录config,data
  • 启动第一个节点 c1
  1. sudo docker run --name=c1 -v ${pwd}/c1/config:/consul/config -v ${pwd}/c1/data:/consul/data -p 8500:8500 consul agent -server -client=0.0.0.0 -bind=0.0.0.0 -dev
  • 设置其他节点需要加入服务的IP

    • 控制台输出具体IP说明c1启动成功
  1. IP=$(sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' c1); echo $IP
  • 启动其他节点 c2,c3
  1. sudo docker run --name c2 -v ${pwd}/c2/config:/consul/config -v ${pwd}/c2/data:/consul/data consul agent -server -bind=0.0.0.0 -join=$IP
  1. sudo docker run --name c3 -v ${pwd}/c3/config:/consul/config -v ${pwd}/c3/data:/consul/data consul agent -server -bind=0.0.0.0 -join=$IP
  • 访问管理界面 http://localhost:8500

    • 看到三个节点注册成功

配置权限

集群模式权限配置

启用ACL配置

集群搭建->以部署3个节点的集群为例章节的集群服务为示例

  • 停止server节点c1
  • 启用ACL

    • $(pwd)/c1/config/新增配置文件master-token.json
    • 内容:json { "acl_master_token":"d9f1928e-1f84-407c-ab50-9579de563df5", "acl_datacenter":"dc1", "acl_default_policy":"deny", "acl_down_policy":"deny" }
  1. - `acl_master_token`: 自生成
  2. - 在线: [https://1024tools.com/uuid](https://1024tools.com/uuid)
  3. - Linux为例可以使用系统的`uuidgen`生成,其他系统自行研究
  4. - 其他参数值,根据示例填写即可, 各个参数说明参见 [https://www.consul.io/docs/agent/options.html](https://www.consul.io/docs/agent/options.html)
  • 重新启动server节点
  • 此时加入c1的agent如果没有配置acl,则会看到下面的sync失败信息
  1. 2019/02/26 07:11:32 [DEBUG] raft-net: 172.17.0.4:8300 accepted connection from: 172.17.0.3:56894
  2. 2019/02/26 07:11:32 [INFO] consul: New leader elected: b23c446d3390
  3. 2019/02/26 07:11:33 [WARN] agent: Node info update blocked by ACLs
  4. 2019/02/26 07:11:46 [WARN] agent: Coordinate update blocked by ACLs
  5. 2019/02/26 07:12:12 [WARN] agent: Coordinate update blocked by ACLs
  6. 2019/02/26 07:12:28 [WARN] agent: Coordinate update blocked by ACLs
  7. 2019/02/26 07:12:51 [WARN] agent: Coordinate update blocked by ACLs
  • 为其他agent节点的创建token,用于加入集群进行Token认证

    • 通过API接口进行创建,其中X-Consul-Token 为先前生成的uuid值
    • 请求:curl \ --request PUT \ --header "X-Consul-Token: d9f1928e-1f84-407c-ab50-9579de563df5" \ --data \ '{ "Name": "Agent Token", "Type": "client", "Rules": "node \"\" { policy = \"write\" } service \"\" { policy = \"read\" }" }' http://127.0.0.1:8500/v1/acl/create
  • 响应:{ "ID": "0a4381bb-80d2-85fa-6ffa-1c2a9948d421" }
  • 在c1节点更新节点Token

    • 通过API接口进行更新,其中X-Consul-Token 为先前生成的uuid值

      • Token:为上一步请求,响应生成的ID
        1. curl \
        2. --request PUT \
        3. --header "X-Consul-Token: d9f1928e-1f84-407c-ab50-9579de563df5" \
        4. --data \
        5. '{
        6. "Token":"0a4381bb-80d2-85fa-6ffa-1c2a9948d421"
        7. }' http://10.0.90.35:8500/v1/agent/token/acl_agent_token
  • 停止其他节点,并为其他agent设置acl

    • 分别在对应agent节点目录下的config创建配置文件acl.json
    • acl.json内容:{ "acl_datacenter": "dc1", "acl_down_policy": "extend-cache", "acl_agent_token": "0a4381bb-80d2-85fa-6ffa-1c2a9948d421" }
  • 重新启动其他节点

设置策略

  • 说明

  • 示例

    • 在管理界面ACL->Policies新建策略
    • New Policy -> Name

      • 填写策略名:如:test
    • New Policy -> Rules

      • 填写符合HCL要求的策略,如:

        • 针对服务service:service "spring-boot-admin-service" { policy = "write" } service "spring-api-gateway" { policy = "write" }
  1. - 针对节点 node:```

node “spring-boot-admin-service-node-1” { policy = “write” }

  1. - 针对配置, K/V配置

key “” { policy = “read” } key “foo/“ { policy = “write” } ```

设置ACL

常见问题

  • consul KV 备份与恢复

参考资料