Consul

单机部署

Ubuntu 20.04

下载 consul 并配置到系统快捷方式

mkdir -p /storage/app/consul
cd /storage/app/consul
wget https://cdn.jansora.com/lib/consul/consul
chmod 755 /storage/app/consul/consul

配置到系统快捷方式

ln -sv /storage/app/consul/consul /usr/bin/consul

配置到 systemd

新建配置目录 mkdir -p /etc/consul.d

新建consul 服务 vim /etc/systemd/system/consul.service 写入以下内容

[Unit]
Description=Consul agent
Documentation=https://www.consul.io/docs/
After=network-online.target
Wants=network-online.target

[Service]
Environment="DAEMON_ARGS=-data-dir=/var/lib/consul  --bind=127.0.0.1 -config-dir=/etc/consul.d -server -ui -client 0.0.0.0 -bootstrap-expect=1 -node=consul  -bind=127.0.0.1 -client=0.0.0.0"
EnvironmentFile=-/etc/default/%p
ExecStart=/usr/bin/consul agent $DAEMON_ARGS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

KillSignal=SIGINT

#AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
PrivateDevices=true
PrivateTmp=true
ProtectSystem=full
ProtectKernelTunables=true

[Install]
WantedBy=multi-user.target

使配置生效

systemctl daemon-reload 

配置开机启动 consul

systemctl enable consul

启动

systemctl start consul

日志会打印在 /var/log/syslog 下, 可以据此定位

集群搭建

节点信息

为保证 consul 高可用,请至少三个节点

modeip
server192.168.0.111
server192.168.0.112
server192.168.0.113

节点配置信息

注意点: 只需要第一个节点开启 Web UI 即可, 且第一个的 bootstrap 为 true

consul1/config.json

{
  "datacenter": "dc1",
  "data_dir": "/app/data",
  "log_level": "INFO",
  "node_name": "consul1",
  "server": true,
  "ui": true,
  "bootstrap": true,
  "bind_addr": "192.168.0.111",
  "client_addr": "192.168.0.111",
  "retry_join": ["192.168.0.111","192.168.0.112", "192.168.0.113"],
  "retry_interval": "3s",
  "enable_debug": false,
  "rejoin_after_leave": true,
  "enable_syslog": false
}

consul2/config.json

{
  "datacenter": "dc1",
  "data_dir": "/app/data",
  "log_level": "INFO",
  "node_name": "consul2",
  "server": true,
  "ui": false,
  "bootstrap": false,
  "bind_addr": "192.168.0.112",
  "client_addr": "192.168.0.112",
  "retry_join": ["192.168.0.111","192.168.0.112", "192.168.0.113"],
  "retry_interval": "3s",
  "enable_debug": false,
  "rejoin_after_leave": true,
  "enable_syslog": false
}

consul3/config.json

{
  "datacenter": "dc1",
  "data_dir": "/app/data",
  "log_level": "INFO",
  "node_name": "consul3",
  "server": true,
  "ui": false,
  "bootstrap": false,
  "bind_addr": "192.168.0.113",
  "client_addr": "192.168.0.113",
  "retry_join": ["192.168.0.111","192.168.0.112", "192.168.0.113"],
  "retry_interval": "3s",
  "enable_debug": false,
  "rejoin_after_leave": true,
  "enable_syslog": false
}

构建 Docker 镜像

config.json 通过挂载目录映射, 例如 -v /root/storage/docker/consul/data/consul1:/app

FROM jansora/base:v1
RUN apt update && apt install consul -y
CMD ["consul", "agent", "-config-file=/app/config.json"]

创建 Docker 网络

配置一个桥接网络, 以后所有依赖 consul 的应用都可以使用此网络, 比如 dubbo

docker network create -d bridge --subnet=192.168.0.0/24 --gateway=192.168.0.254 --ip-range=192.168.0.0/24 app

启动集群

第一个节点 暴露 Web UI

docker run -d --name=consul1 --network app --restart always --ip 192.168.0.111  -v /root/storage/docker/consul/data/consul1:/app  -p 8500:8500 jansora/consul:v1
docker run -d --name=consul2 --network app --restart always --ip 192.168.0.112  -v /root/storage/docker/consul/data/consul2:/app jansora/consul:v1
docker run -d --name=consul3 --network app --restart always --ip 192.168.0.113  -v /root/storage/docker/consul/data/consul3:/app jansora/consul:v1

mac

docker run -d --name=consul1 --network app --restart always --ip 192.168.0.111  -v ~/mapping/storage/docker/consul/data/consul1:/app  -p 8500:8500 jansora/consul:v1
docker run -d --name=consul2 --network app --restart always --ip 192.168.0.112  -v ~/mapping/storage/docker/consul/data/consul2:/app jansora/consul:v1
docker run -d --name=consul3 --network app --restart always --ip 192.168.0.113  -v ~/mapping/storage/docker/consul/data/consul3:/app jansora/consul:v1

检查日志

root@jansora:~# docker logs consul1
==> WARNING: Bootstrap mode enabled! Do not enable unless necessary
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
         Node name: 'consul1'
        Datacenter: 'dc1'
            Server: true (bootstrap: true)
       Client Addr: 192.168.0.111 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)
      Cluster Addr: 192.168.0.111 (LAN: 8301, WAN: 8302)
    Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
             Atlas: <disabled>

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

    2020/12/12 15:09:47 [INFO] raft: Node at 192.168.0.111:8300 [Follower] entering Follower state
    2020/12/12 15:09:47 [INFO] serf: Ignoring previous leave in snapshot
    2020/12/12 15:09:47 [INFO] serf: Ignoring previous leave in snapshot
    2020/12/12 15:09:47 [INFO] serf: EventMemberJoin: consul1 192.168.0.111
    2020/12/12 15:09:47 [INFO] serf: Ignoring previous leave in snapshot
    2020/12/12 15:09:47 [INFO] serf: Ignoring previous leave in snapshot
    2020/12/12 15:09:47 [INFO] serf: EventMemberJoin: consul1.dc1 192.168.0.111
    2020/12/12 15:09:47 [INFO] serf: Attempting re-join to previously known node: consul3: 192.168.0.113:8301
    2020/12/12 15:09:47 [INFO] consul: adding LAN server consul1 (Addr: 192.168.0.111:8300) (DC: dc1)
    2020/12/12 15:09:47 [WARN] serf: Failed to re-join any previously known node
    2020/12/12 15:09:47 [INFO] consul: adding WAN server consul1.dc1 (Addr: 192.168.0.111:8300) (DC: dc1)
    2020/12/12 15:09:47 [INFO] agent: Joining cluster...
    2020/12/12 15:09:47 [INFO] agent: (LAN) joining: [192.168.0.111 192.168.0.112 192.168.0.113]
    2020/12/12 15:09:47 [ERR] agent: failed to sync remote state: No cluster leader
    2020/12/12 15:09:47 [INFO] serf: EventMemberJoin: consul3 192.168.0.113
    2020/12/12 15:09:47 [INFO] serf: EventMemberJoin: consul2 192.168.0.112
    2020/12/12 15:09:47 [INFO] serf: Re-joined to previously known node: consul3: 192.168.0.113:8301
    2020/12/12 15:09:47 [INFO] consul: adding LAN server consul3 (Addr: 192.168.0.113:8300) (DC: dc1)
    2020/12/12 15:09:47 [INFO] consul: adding LAN server consul2 (Addr: 192.168.0.112:8300) (DC: dc1)
    2020/12/12 15:09:47 [INFO] agent: (LAN) joined: 3 Err: <nil>
    2020/12/12 15:09:47 [INFO] agent: Join completed. Synced with 3 initial agents
    2020/12/12 15:09:48 [INFO] raft: Removed ourself, transitioning to follower
    2020/12/12 15:09:48 [INFO] raft: Removed ourself, transitioning to follower
    2020/12/12 15:10:07 [INFO] agent: Synced service 'consul'

consul systemd 配置

[Unit]
Description=Consul agent
Documentation=https://www.consul.io/docs/
After=network-online.target
Wants=network-online.target

[Service]
Environment="DAEMON_ARGS=-data-dir=/var/lib/consul --bind=192.168.2.101 -config-dir=/etc/consul.d -server -ui -client 0.0.0.0 -bootstrap-expect=1 -node=consul -advertise=192.168.2.101 -bind=0.0.0.0 -client=0.0.0.0"
EnvironmentFile=-/etc/default/%p
ExecStart=/usr/bin/consul agent $DAEMON_ARGS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
User=consul
KillSignal=SIGINT

#AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
PrivateDevices=true
PrivateTmp=true
ProtectSystem=full
ProtectKernelTunables=true

[Install]
WantedBy=multi-user.target

常用功能

注销服务

Login in to the consul machine,and issue the command as follow:

consul services deregister -id={Your Service Id}

评论栏