Consul 学习笔记(二)之生产环境部署

一. 部署

    本次示例中,为了简化部署,仅使用一个数据中心,数据中心三台服务器,分别安装 2 个 consul server 实例,2个 consul client 实例,具体部署图如下:

 

   其中 2个consul server 实例,128 的consul server 默认是初始 leader.129 会配置加入128。

二.  部署

1、创建目录

    在 128、129、130 分别上传 consul 软件包,目录结构如下:

192.168.149.128:

     

 192.168.149.129:

192.168.149.130:

2、上传软件包

    将 从官网下载的软件包(consul_1.8.0_linux_amd64.zip)上传到上述所有服务器的bin目录,并将内容解压到 bin 目录下。

3、配置

1)将 128、129、130 consul server 和 consul client 的端口均通过防火墙

       128:

          consul server

  • http_port=8500
  • serf_lan_port =8301
  • serf_wan_port=8302
  • dns_port=8600

         consul client

  • http_port=8700
  • serf_lan_port =8701
  • serf_wan_port=8702
  • dns_port=8703

     129:

     consul server

  • http_port=8500
  • serf_lan_port =8301
  • serf_wan_port=8302
  • dns_port=8600

   130:

  consul client

  • http_port=8500
  • serf_lan_port =8301
  • serf_wan_port=8302
  • dns_port=8600

2) consul server 配置

    准备 server_start.json文件,128、129 上均部署 consul server,server_start.json的内容分别如下:

{
        "datacenter": "test-datacenter1",
        "data_dir": "/opt/consul/consul/data/",
        "log_file": "/opt/consul/consul/log/",
        "log_level": "INFO",
        "bind_addr": "192.168.149.128",
        "client_addr": "0.0.0.0",
        "node_name": "consul server1",
        "ui": true,
        "server": true
}

3) consul client 配置

  128 上的 consul client 配置,将其直接加入到 128 上的 consul server 中。

{
    "datacenter": "test-datacenter1",
    "data_dir": "/opt/consul/client/data/",
    "log_file": "/opt/consul/client/log/",
    "log_level": "INFO",
    "bind_addr": "192.168.149.128",
    "client_addr": "0.0.0.0",
    "node_name": "consul client1on128",
    "retry_join": ["192.168.149.128:8301"],
    "ports": {
        "dns": 8703,
        "http": 8700,
        "serf_wan": 8702,
        "serf_lan": 8701
    }
}

  130 上的 consul client 配置,将其直接加入到 129 上的 consul server 中。

{
    "datacenter": "test-datacenter1",
    "data_dir": "/opt/consul/client/data/",
    "log_file": "/opt/consul/client/log/",
    "log_level": "INFO",
    "bind_addr": "192.168.149.130",
    "client_addr": "0.0.0.0",
    "node_name": "consul client2 on129",
    "ports": {
        "dns": 8703,
        "http": 8700,
        "serf_wan": 8702,
        "serf_lan": 8701
    },
"retry_join": ["192.168.149.129:8301"] }

4、启动

1) consul server 端

128、129 consul server:

     执行命令:cd /opt/consul/consul

                     bin/consul agent -config-dir=conf

执行结果:

    上图为 128 上的启动效果图

 

     上图为 129 上的启动效果图

发现在 128 启动结果上 其未选举出 leader; 其中 2 处是启动 129 的consul server 时,129 通过 gossip 协议 通过 128 的 8302 加入进来的,但是 3 处显示即使此时加入了 129 的 consul server,通过 raft 协议仍然未选举出 leader。

问题:

a) 现象: 两个 consul server 没有选举出 leader;

    原因: server_start.properties 中缺失:bootstrap_expect 配置项;

    解决办法: 在 128 的配置文件中增加该配置项:"bootstrap_expect=1",128、129 consul server 重启:

  上图 为 128 consul server 结果

 上图为 129 consul server 结果

b) 现象:128 在加入 129 成员时发现 8300 端口访问不通;

    原因:128、129的 8300 端口都没有打开,raft 协议通过 8300 端口进行将server加入到集群中。

    解决办法:通过防火墙命令打开两个服务器上的8300端口。

128、129 的 consul server 重启结果如下:

 上图为 128 consul  server 启动效果图

 上图为 129 consul server 最终启动效果图

结果:

 a) 打开 128 的 UI 界面查看

 b) 打开 129 的 UI 界面查看:

结论:

 1) 经过以上,第一个 consul server的最终配置需要是:

{
    "datacenter": "test-datacenter1",
    "data_dir": "/opt/consul/consul/data/",
    "log_file": "/opt/consul/consul/log/",
    "log_level": "INFO",
    "bind_addr": "192.168.149.128",
    "client_addr": "0.0.0.0",
    "node_name": "consul server1",
    "ui": true,
    "server": true,
    "bootstrap_expect":1
}

第二个 consul server 的最终部署配置需要是:

{
    "datacenter": "test-datacenter1",
    "data_dir": "/opt/consul/consul/data/",
    "log_file": "/opt/consul/consul/log/",
    "log_level": "INFO",
    "bind_addr": "192.168.149.129",
    "client_addr": "0.0.0.0",
    "node_name": "consul server2",
    "ui": true,
    "server": true,
    "start_join":["192.168.149.128:8301"]
}

2) consul server 用到的 http_port serf_lan_portserf_wan_portdns_port aft_port 端口均要通过通过防火墙;

3) 第一个 consul server 实例必须默认存在 bootstrap_expect 配置项,值可为1;否则服务启动不了,通过web访问,会显示 500,后台日志显示:

2020-06-29T20:39:07.071+0800 [ERROR] agent.http: Request error: method=GET url=/v1/internal/ui/nodes?dc=test-datacenter1 from=192.168.149.1:54377 error="No cluster leader"
2020-06-29T20:39:18.831+0800 [ERROR] agent: Coordinate update error: error="No cluster leader"

4) 虽然有默认leader,但是在集群运行过程,会通过raft 协议 和 gossip协议检测 cosnul server 是否在线,是否运行正常,当leader 出现问题,会重新选举 leader。

2) consul client

  128 启动

    执行命令:cd /opt/consul/client                    

                     bin/consul agent -config-dir=conf

 执行结果:

   129 启动

    执行命令:cd /opt/consul/client                    

                     bin/consul agent -config-dir=conf

 执行结果:

 以上表示成功加入 consul server,但是从日志显示,是加入到集群中的所有 consul server 中了。

结果:

 a) 打开 128、129 的 UI 界面查看

 从上图可以看到 两个 client 都加进来了。

 三. 服务注册与发现

    本次为了方便,直接在 128、130 上编写 服务的 json文件,用于 服务发现,通常情况下 服务程序会集成 consul SDK 或者使用 spring boot consul 自动注册到 所属服务器上 的consul client上。

1、web 服务定义的json文件内容如下:

{
  "service": {
    "name": "web",
    "tags": [
      "rails"
    ],
    "port": 80
  }
}

2、将 1 中定义的 web 服务json 文件放到 consul  client 的 conf 目录下(即认为是默认注册的服务)。

3、使用如下命令,重新加载客户端的配置。

   cd /opt/consul/client

   bin/consul reload

4、结果(查看是否注册到 consul server 集群上)

 128、130 的 consul client 日志上都可以看到输出内容,表示注册成功。

 打开 128、129 的 consul server ui 页面,均可以注册的服务

 5、问题

问题现象:在进行 reload 的时候,发现 130 服务器 的reload 失败,而 128 上一直是consul  server 在输出 reload 的相关日志

原因:130128 的 consul client 配置均修改了 httpserf_lanserf_wandns 端口,而 reload 时默认就请求发送到了8500上。

 解决办法:reload 时增加 -http-addr ,指定请求url

原文地址:https://www.cnblogs.com/sandyflower/p/13194974.html