NATS 5: 使用 docker swarm 建立 nats 集群
NATS 5: 使用 docker swarm 建立 nats 集群
- 建立 docker swarm
- 建立 overly network
- 使用 docker-compose 文件在 docker swarm 上建立nats集群 (无TLS)
- 使用 docker-compose 文件在 docker swarm 上建立nats集群 (有TLS)
- 关闭 docker swarm
- 其他:使用alpine测试域名是否可ping
-
参考
- 一本全面介绍NATS的书(英): Practical NATS From Beginner to Pro
- 安装 NATS
- 安装 Docker
- NATS on Docker hub
- 多台服务器上利用 Docker Swarm 建立 RabbitMQ 集群
-
Settings
- 一台电脑上的三个xubuntu虚拟机
机器 IP xubuntu1 10.80.28.46 xubuntu2 10.80.28.47 xubuntu3 10.80.28.83
建立 docker swarm
- 参考 “多台服务器上利用 Docker Swarm 建立 RabbitMQ 集群” 上同一章节。
建立 overly network
- 需要利用 overly network 的自动 DNS 功能
$ docker network create -d overlay nats-cluster
使用 docker-compose 文件在 docker swarm 上建立nats集群 (无TLS)
- swarm.conf 如下,必须在每个节点的
~/nats/nats-tls-cluster/swarm.conf位置。注意这里集群的地址用的是域名,就是下面 yml 文件中 service 下面的 nats1, nats2, nats3。http_port = 8222 cluster {listen = 6222routes = [nats://nats1:6222nats://nats2:6222nats://nats3:6222] } - docker-compose-swarm.yml 如下:
- nats1, nats2, nats3 节点的客户端连接端口(容器中的4222)分别暴露在 nats-cluster 的4221, 4222, 4223 端口。
- 容器的监听端口8222也类似暴露。
version: "3" services:nats1:image: nats:latesthostname: nats1command: "-c /swarm.conf"volumes:- "~/nats/nats-tls-cluster/swarm.conf:/swarm.conf"ports:- "4221:4222"- "8221:8222"nats2:image: nats:latesthostname: nats2command: "-c /swarm.conf"volumes:- "~/nats/nats-tls-cluster/swarm.conf:/swarm.conf"ports:- "4222:4222"- "8222:8222"nats3:image: nats:latesthostname: nats3command: "-c /swarm.conf"volumes:- "~/nats/nats-tls-cluster/swarm.conf:/swarm.conf"ports:- "4223:4222"- "8223:8222" networks:default:external:name: nats-cluster - 现在默认在当前目录下有
docker-compose-swarm.yml文件,在每个服务器上也有volumes中需要的swarm.conf文件:$ docker stack deploy --compose-file docker-compose-swarm.yml nats Creating service nats_nats1 Creating service nats_nats2 Creating service nats_nats3 - 现在已经成功在docker swarm上启动了nats集群,可以使用docker命令查看一下部署情况:
$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS repl3antbepm nats_nats1 replicated 1/1 nats:latest *:4221->4222/tcp, *:8221->8222/tcp b35tfh7xqzka nats_nats2 replicated 1/1 nats:latest *:4222->4222/tcp, *:8222->8222/tcp wrt3fiws4yt5 nats_nats3 replicated 1/1 nats:latest *:4223->4222/tcp, *:8223->8222/tcp $ docker service ps nats_nats1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS xu1flcdqmzg9 nats_nats1.1 nats:latest xubuntu2 Running Running about an hour ago $ docker service ps nats_nats2 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS xbdao04kky91 nats_nats2.1 nats:latest xubuntu3 Running Running about an hour ago $ docker service ps nats_nats3 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS mkcszsix1jzf nats_nats3.1 nats:latest xubuntu1 Running Running about an hour ago - 也可以登录任意一台节点上的8221, 8222, 8223端口查看每个节点的具体情况,下面是打开url http://10.80.28.47:8221/routez 的示例:
{"server_id": "5NYeDytPMi5TDQjbSocRU7","now": "2019-03-20T02:34:09.6231767Z","num_routes": 2,"routes": [{"rid": 3,"remote_id": "uSoEorGqBwzEWtp3Kbtkgj","did_solicit": true,"is_configured": true,"ip": "10.0.1.100","port": 47254,"pending_size": 0,"in_msgs": 0,"out_msgs": 0,"in_bytes": 0,"out_bytes": 0,"subscriptions": 0},{"rid": 5,"remote_id": "IBchBQ4jLebfvaqPPxeM1r","did_solicit": true,"is_configured": true,"ip": "10.0.1.21","port": 51024,"pending_size": 0,"in_msgs": 0,"out_msgs": 0,"in_bytes": 0,"out_bytes": 0,"subscriptions": 0}] } - 关闭所有节点,准备配置有TLS的nats集群
$ docker service rm $(docker service ls -q)
使用 docker-compose 文件在 docker swarm 上建立nats集群 (有TLS)
- 生成新的 route 证书,注意不能使用 NATS 2 中生成的 route 证书,因为当时直接在节点上部署的,用的是节点所在的局域网,而现在用的是docker swarm overly network。但是 server 和 client 证书可以通用。
route-docker-swarm.json{"CN": "nats route","hosts": ["*.my-nats-cluster"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "US","L": "CA","ST": "San Francisco"}] }- 用 cfssl 生成CA证书:
route-docker-swarm.csr,route-docker-swarm.pem,route-docker-swarm-key.pem。安装 cfssl 和命令中需要的其他文件(ca.pem,ca-key.pem,ca-config.json) 参考 NATS 2 。cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=route route-docker-swarm.json | cfssljson -bare route-docker-swarm
- 新的conf文件:swarm-tls.conf
- 改变了 cluster{} 中route证书。
- routes=[] 中的节点列表必须是完整域名,域名在下面的 yml 中设置。
https_port = 8222 tls {cert_file = './certs/server.pem'key_file = './certs/server-key.pem'ca_file = './certs/ca.pem'verify = truetimeout = 2 } cluster {listen = 6222tls {cert_file = './certs/route-docker-swarm.pem'key_file = './certs/route-docker-swarm-key.pem'ca_file = './certs/ca.pem'timeout = 5}routes = [nats://nats1.my-nats-cluster:6222nats://nats2.my-nats-cluster:6222nats://nats3.my-nats-cluster:6222] } - 新的 yml 文件:docker-compose-swarm-tls.yml
- 改变了nats容器内加载的配置文件(swarm-tls.conf)
- 改变了volumes中相应的加载文件
- 增加services.natsi.networks.defautl.aliases字段来配置完整域名
version: "3" services:nats1:image: nats:latesthostname: nats1command: "-c /swarm-tls.conf"volumes:- "~/nats/nats-tls-cluster/swarm-tls.conf:/swarm-tls.conf"- "~/nats/nats-tls-cluster/certs/server.pem:/certs/server.pem"- "~/nats/nats-tls-cluster/certs/server-key.pem:/certs/server-key.pem"- "~/nats/nats-tls-cluster/certs/ca.pem:/certs/ca.pem"- "~/nats/nats-tls-cluster/certs/route-docker-swarm.pem:/certs/route-docker-swarm.pem"- "~/nats/nats-tls-cluster/certs/route-docker-swarm-key.pem:/certs/route-docker-swarm-key.pem"ports:- "4221:4222"- "8221:8222"networks:default:aliases:- nats1.my-nats-clusternats2:image: nats:latesthostname: nats2command: "-c /swarm-tls.conf"volumes:- "~/nats/nats-tls-cluster/swarm-tls.conf:/swarm-tls.conf"- "~/nats/nats-tls-cluster/certs/server.pem:/certs/server.pem"- "~/nats/nats-tls-cluster/certs/server-key.pem:/certs/server-key.pem"- "~/nats/nats-tls-cluster/certs/ca.pem:/certs/ca.pem"- "~/nats/nats-tls-cluster/certs/route-docker-swarm.pem:/certs/route-docker-swarm.pem"- "~/nats/nats-tls-cluster/certs/route-docker-swarm-key.pem:/certs/route-docker-swarm-key.pem"ports:- "4222:4222"- "8222:8222"networks:default:aliases:- nats2.my-nats-clusternats3:image: nats:latesthostname: nats3command: "-c /swarm-tls.conf"volumes:- "~/nats/nats-tls-cluster/swarm-tls.conf:/swarm-tls.conf"- "~/nats/nats-tls-cluster/certs/server.pem:/certs/server.pem"- "~/nats/nats-tls-cluster/certs/server-key.pem:/certs/server-key.pem"- "~/nats/nats-tls-cluster/certs/ca.pem:/certs/ca.pem"- "~/nats/nats-tls-cluster/certs/route-docker-swarm.pem:/certs/route-docker-swarm.pem"- "~/nats/nats-tls-cluster/certs/route-docker-swarm-key.pem:/certs/route-docker-swarm-key.pem"ports:- "4223:4222"- "8223:8222"networks:default:aliases:- nats3.my-nats-cluster networks:default:external:name: nats-cluster - 启动nats集群
$ docker stack deploy --compose-file docker-compose-swarm-tls.yml nats Creating service nats_nats1 Creating service nats_nats2 Creating service nats_nats3 - 登录任意一台节点上的8221, 8222, 8223端口查看每个节点的具体情况,下面是打开url https://10.80.28.47:8221/routez 的示例(主要这里是https而不是http了):
{"server_id": "XJ8fhvSxniAPf8nZr1qqDy","now": "2019-03-20T08:01:39.358041253Z","num_routes": 2,"routes": [{"rid": 1,"remote_id": "76lYzIYHvnsCwSsATTRyQP","did_solicit": true,"is_configured": true,"ip": "10.0.1.209","port": 37446,"pending_size": 0,"in_msgs": 0,"out_msgs": 0,"in_bytes": 0,"out_bytes": 0,"subscriptions": 0},{"rid": 2,"remote_id": "Z9iZhK6o0yNOC52AHGQWMK","did_solicit": true,"is_configured": true,"ip": "10.0.1.210","port": 44466,"pending_size": 0,"in_msgs": 0,"out_msgs": 0,"in_bytes": 0,"out_bytes": 0,"subscriptions": 0}] } - 关闭所有节点
$ docker service rm $(docker service ls -q)
关闭 docker swarm
- 参考 “多台服务器上利用 Docker Swarm 建立 RabbitMQ 集群” 最后。
其他:使用alpine测试域名是否可ping
- 如果网络不可手动加入,删除重建,增加
--attachable标志$ docker network rm nats-cluster nats-cluster $ docker network create -d overlay nats-cluster --attachable m7fg3fqbagvzb2qewl2keg77g $ docker run -dit --name alpine --network nats-cluster alpine $ docker container exec -it alpine ping nats3.my-nats-cluster PING nats3.my-nats-cluster (10.0.1.207): 56 data bytes 64 bytes from 10.0.1.207: seq=0 ttl=64 time=0.044 ms ^C --- nats3.my-nats-cluster ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.044/0.044/0.044 ms
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
