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

  • 参考

    1. 一本全面介绍NATS的书(英): Practical NATS From Beginner to Pro
    2. 安装 NATS
    3. 安装 Docker
    4. NATS on Docker hub
    5. 多台服务器上利用 Docker Swarm 建立 RabbitMQ 集群
  • Settings

    1. 一台电脑上的三个xubuntu虚拟机
    机器IP
    xubuntu110.80.28.46
    xubuntu210.80.28.47
    xubuntu310.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 如下:
    1. nats1, nats2, nats3 节点的客户端连接端口(容器中的4222)分别暴露在 nats-cluster 的4221, 4222, 4223 端口。
    2. 容器的监听端口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 证书可以通用。
    1. route-docker-swarm.json
      {"CN": "nats route","hosts": ["*.my-nats-cluster"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "US","L": "CA","ST": "San Francisco"}]
      }
      
    2. 用 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
    1. 改变了 cluster{} 中route证书。
    2. 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
    1. 改变了nats容器内加载的配置文件(swarm-tls.conf)
    2. 改变了volumes中相应的加载文件
    3. 增加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
    


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部