1. 做什么事情?
consul作为一个服务发现的工具在国内外都收到欢迎, 它的多数据中心是其他如zookerper工具所不能比的, 本文的目的是搭建一个准产品环境下的consul cluster 作为产品测试和教学演示, cluster所用到的服务器有Docker提供,运行14.0的Ubuntu操作系统.
cluster详细:
节点名称 | server/client | ip |
---|---|---|
server1 | server agent | 172.17.0.2 |
server2 | server agent | 172.17.0.3 |
server3 | server agent | 172.17.0.4 |
client1 | client agent | 172.17.0.5 |
cluster简介:
集群将由4个consul节点, 其中三个是server,一个是client, 其中client节点会暴露一些端口方便我们检查集群情况和查看consul ui.
2. 材料准备
-
一台服务器: 这台服务器已经安装了Docker, 是4个consul的宿主机, 查看集群情况也在这台服务器上执行而不是进入Docker Container内部查看因为有UI界面
-
4个节点配置文件(.json)+4个运行脚本文件(.sh):
cat client1.json
{
"data_dir": "/opt/consulclient",
"log_level": "INFO",
"node_name": "client1",
"server": false,
"ui_dir": "/opt/consul/web",
"http_api_response_headers": {
"Access-Control-Allow-Origin": "*"
},
"addresses": {
"http": "0.0.0.0"
},
"start_join": ["172.17.0.2", "172.17.0.3", "172.17.0.4"]
}
cat runClient1.sh
consul agent -config-file=/wk/consul/client1.json
cat server1.json
{
"data_dir": "/opt/consul",
"log_level": "INFO",
"node_name": "server1",
"server": true,
"bind_addr": "172.17.0.2",
"bootstrap": true,
"retry_join": ["172.17.0.2", "172.17.0.3", "172.17.0.4"]
}
cat runServer1.sh
consul agent -config-file=/wk/consul/server1.json -ui-dir=/opt/consul/web
cat server2.json
{
"data_dir": "/opt/consul",
"log_level": "INFO",
"node_name": "server1",
"server": true,
"bind_addr": "172.17.0.3",
"retry_join": ["172.17.0.2", "172.17.0.3", "172.17.0.4"]
}
cat runServer2.sh
consul agent -config-file=/wk/consul/server2.json
cat server3.json
{
"data_dir": "/opt/consul",
"log_level": "INFO",
"node_name": "server1",
"server": true,
"bind_addr": "172.17.0.4",
"retry_join": ["172.17.0.2", "172.17.0.3", "172.17.0.4"]
}
cat runServer3.sh
consul agent -config-file=/wk/consul/server3.json
- consul docker image: 准备一个安装好consul的 docker image,里面安装了consul和consul ui, 命名为consul 如下图:
注意该image中有一个wk文件夹也是需要的, 这里当成一个工作目录存放外部资源
3. 操作流程
创建共享目录供Docker Container使用:
在准备的服务器上创建一个/share/consul目录, 这个存放上述的8个材料文件, 这些目录最后会被共享到容器, 容器中的consul agent会在这个目录下找, 在之后的操作可以看到该目录被共享到了容器中的wk目录下.
顺序运行如下命令:
docker run --name=server1 -itd -v /share:/wk consul sh /wk/consul/runServer1.sh
docker run --name=server2 -itd -v /share:/wk consul sh /wk/consul/runServer2.sh
docker run --name=server3 -itd -v /share:/wk consul sh /wk/consul/runServer3.sh
docker run --name=client1 -itd -p 8500:8500 -v /share:/wk consul sh /wk/consul/runClient1.sh
4. 检查结果
因为在client1中开放了端口所以可以在宿主机上检查集群具体两个检查如下:
- 查看集群成员:curl -s http://localhost:8500/v1/agent/members | python -m json.tool
[
{
"Addr": "172.17.0.3",
"DelegateCur": 4,
"DelegateMax": 5,
"DelegateMin": 2,
"Name": "server2",
"Port": 8301,
"ProtocolCur": 2,
"ProtocolMax": 5,
"ProtocolMin": 1,
"Status": 1,
"Tags": {
"build": "0.7.4:'1c442cb",
"dc": "dc1",
"id": "ad134d56-ab5d-d130-0488-0ab65f5504ad",
"port": "8300",
"role": "consul",
"vsn": "2",
"vsn_max": "3",
"vsn_min": "2"
}
},
{
"Addr": "172.17.0.5",
"DelegateCur": 4,
"DelegateMax": 5,
"DelegateMin": 2,
"Name": "client1",
"Port": 8301,
"ProtocolCur": 2,
"ProtocolMax": 5,
"ProtocolMin": 1,
"Status": 1,
"Tags": {
"build": "0.7.4:'1c442cb",
"dc": "dc1",
"id": "ad134d56-ab5d-d130-0488-0ab65f5504ad",
"role": "node",
"vsn": "2",
"vsn_max": "3",
"vsn_min": "2"
}
},
{
"Addr": "172.17.0.4",
"DelegateCur": 4,
"DelegateMax": 5,
"DelegateMin": 2,
"Name": "server3",
"Port": 8301,
"ProtocolCur": 2,
"ProtocolMax": 5,
"ProtocolMin": 1,
"Status": 1,
"Tags": {
"build": "0.7.4:'1c442cb",
"dc": "dc1",
"id": "ad134d56-ab5d-d130-0488-0ab65f5504ad",
"port": "8300",
"role": "consul",
"vsn": "2",
"vsn_max": "3",
"vsn_min": "2"
}
},
{
"Addr": "172.17.0.2",
"DelegateCur": 4,
"DelegateMax": 5,
"DelegateMin": 2,
"Name": "server1",
"Port": 8301,
"ProtocolCur": 2,
"ProtocolMax": 5,
"ProtocolMin": 1,
"Status": 1,
"Tags": {
"bootstrap": "1",
"build": "0.7.4:'1c442cb",
"dc": "dc1",
"id": "ad134d56-ab5d-d130-0488-0ab65f5504ad",
"port": "8300",
"role": "consul",
"vsn": "2",
"vsn_max": "3",
"vsn_min": "2"
}
}
]
- 查看consul ui: 在浏览器打开http://localhost:8500/ui/