在容器环境下,Consul原有的启动后join集群的方式都失效了:
长期以来我们的业务只能采用重启后登录容器,手工执行join命令的方式:
登录consul-0容器,执行命令:
consul join consul-1 consul-2
近期频繁的容器母机调整导致我们的业务需要多次重启,不得不寻找一种自动重建Consul集群的方式。在网上搜索和学习一番后发现,基本没有针对Kubernetes容器环境的自动重建方案。
经过一番折腾后,利用Kubernetes容器集群对容器内域名的支持,找到了解决方案,在consul server启动参数中增加一行:
-retry-join=consul.svc.cluster.local
这里的consul.svc.cluster.local是Kubernetes内的域名,通过多次尝试解析并加入这个域名对应的consul实例的IP,来构建或重建Consul集群。
/ # nslookup consul.svc.cluster.local
nslookup: can't resolve '(null)': Name does not resolve
Name: consul.svc.cluster.local
Address 1: 192.168.10.37 consul-2.consul.svc.cluster.local
Address 2: 192.168.11.195 consul-0.consul.svc.cluster.local
Address 3: 192.168.47.189 consul-1.consul.svc.cluster.local
以下是实际演示,Consul版本1.1.0
启动3个consul server容器后,可以看到已经自动加入了集群:
Node Address Status Type Build Protocol DC Segment
consul-0 192.168.18.187:8301 alive server 1.1.0 2 dc1 <all>
consul-1 192.168.47.189:8301 alive server 1.1.0 2 dc1 <all>
consul-2 192.168.10.36:8301 alive server 1.1.0 2 dc1 <all>
leader也已经被选举出来
[INFO] consul: New leader elected: consul-2
这时候,我们随便重启一个容器(consul-0),使用consul monitor命令观察日志
[INFO] memberlist: Suspect consul-0 has failed, no acks received
[INFO] memberlist: Marking consul-0 as failed, suspect timeout reached (0 peer confirmations)
[INFO] serf: EventMemberFailed: consul-0 192.168.18.187
[INFO] consul: Removing LAN server consul-0 (Addr: tcp/192.168.18.187:8300) (DC: dc1)
---
[INFO] serf: EventMemberJoin: consul-0 192.168.11.195
[INFO] consul: Adding LAN server consul-0 (Addr: tcp/192.168.11.195:8300) (DC: dc1)
可以观察到,换了IP的同名consul容器已经被加入了集群,老IP的consul容器已经被踢出了集群。
Node Address Status Type Build Protocol DC Segment
consul-0 192.168.11.195:8301 alive server 1.1.0 2 dc1 <all>
consul-1 192.168.47.189:8301 alive server 1.1.0 2 dc1 <all>
consul-2 192.168.10.36:8301 alive server 1.1.0 2 dc1 <all>
删除leader容器也是同样的效果,会自动重新选举新的leader并且在新容器重启完毕后,自动加入集群,不过耗时久一点。
以上是基于Consul 1.1.0版本的测试。对于0.7.4版本,同样的配置,有个问题,虽然consul server能自动组成集群,但是在重启容器后,raft不能自动移除老的节点,需要手工移除:
consul operator raft -remove-peer -address="192.168.23.41:8300" -token="xxxx"
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。