Kubernetes中Consul重启自动加入集群实践

在容器环境下,Consul原有的启动后join集群的方式都失效了:

  1. 启动时配置join IP:IP不固定,无法配置
  2. 启动时配置rejoin:之前的容器已经被销毁,没有rejoin需要的信息

长期以来我们的业务只能采用重启后登录容器,手工执行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"

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏葡萄城控件技术团队

ActiveReports 报表应用教程 (4)---分栏报表

在葡萄城ActiveReports报表中可以实现分栏报表布局样式,可以设置横向分栏、纵向分栏,同时进行分栏和分组设置,统计分栏分组的小计、合计等。在商业报表系统...

2348
来自专栏编程坑太多

『高级篇』docker之DockerSwarm的集群环境搭建(28)

PS:以上就完成高可用的docker swarm的集群环境,其实真心比其他的简单。

1202
来自专栏KaliArch

Kubernetes+Prometheus+Grafana部署笔记

Kubernetes(通常写成“k8s”)Kubernetes是Google开源的容器集群管理系统。其设计目标是在主机集群之间提供一个能够自动化部署、可拓展、应...

3994
来自专栏Hadoop实操

如何编译安装Azkaban服务

Azkaban是一套简单的任务调度服务,是Hadoop工作流引擎调度器之一,整体包括三部分Web Server、DB Server、Executor Serve...

2.1K12
来自专栏云计算教程系列

如何在Ubuntu 18.04上安装Anaconda Python发行版

Anaconda专为数据科学和机器学习工作流程而设计,是一个开源包管理器,环境管理器,以及Python和R编程语言的分发。它通常用于大规模数据处理,科学计算和预...

1.2K7
来自专栏写写代码吃吃瓜

Ubuntu环境下Tornado环境部署

1757
来自专栏一只程序汪的自我修养

手把手教你用Jenkins自动发布Docker

首先,我们要有个Jenkins咯,下载链接:https://jenkins.io/download/

4266
来自专栏云计算教程系列

如何在Ubuntu 18.04上测试与分子的可靠角色

Ansible中的单元测试是确保角色按预期运行的关键。通过允许您指定针对不同环境测试角色的方案,Molecule使此过程更容易。使用Ansible,Molecu...

1201
来自专栏FreeBuf

OpenStack:建立虚拟的渗透测试实验环境 – 安装篇

0x00 概述 对从业渗透测试的人员来说,保持技能更新是非常重要的,而更新技能的过程中,需要大量的去学习、实践和总结,比较传统的学习方式是通过虚拟机安装靶机来练...

3489
来自专栏JadePeng的技术博客

IDEA+PHP+XDebug调试配置

XDebug调试配置 临时需要调试服务器上的PHP web程序,因此安装xdebug,下面简单记录 安装xdebug 下载最新并解压 wget https://...

4217

扫码关注云+社区

领取腾讯云代金券