Etcd 集群搭建

本文参考 Systemd 教程Etcd 配置说明

一、简介

Etcd 是 CoreOS 推出的高可用的键值存储系统,主要用于k8s集群的服务发现等,而本身 Etcd 也支持集群模式部署,从而实现自身高可用;

Etcd 构建自身高可用集群主要有三种形式:

  • 静态发现: 预先已知 Etcd 集群中有哪些节点,在启动时直接指定好 Etcd 的各个 node 节点地址
  • Etcd 动态发现: 通过已有的 Etcd 集群作为数据交互点,然后在扩展新的集群时实现通过已有集群进行服务发现的机制
  • DNS 动态发现: 通过 DNS 查询方式获取其他节点地址信息

二、静态发现

2.1、环境准备

以下在 3 台虚拟机上搭建,系统环境为 CentOS7

节点地址
etcd0192.168.1.154
etcd1192.168.1.156
etcd2192.168.1.249

2.2、安装 Etcd

CentOS 官方提供了 Etcd 的rpm,可通过 yum 直接安装,目前 yum 上最新版本为 2.3.7,比较合适;官方最新版本更新到了 3.0.6,鉴于稳定因素,这里使用 2.3.7 搭建

1
yum install etcd -y

2.3、修改 Etcd 配置

yum 安装的 Etcd 默认配置文件在 /etc/etcd/etcd.conf,以下为 etcd0 上的样例(etcd1、etcd2同理):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 编辑配置文件
vim /etc/etcd/etcd.conf
# 样例配置如下

# 节点名称
ETCD_NAME=etcd0
# 数据存放位置
ETCD_DATA_DIR="/var/lib/etcd/etcd0"
# 监听其他 Etcd 实例的地址
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
# 监听客户端地址
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
# 通知其他 Etcd 实例地址
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.154:2380"
# 初始化集群内节点地址
ETCD_INITIAL_CLUSTER="etcd0=http://192.168.1.154:2380,etcd1=http://192.168.1.156:2380,etcd2=http://192.168.1.249:2380"
# 初始化集群状态,new 表示新建
ETCD_INITIAL_CLUSTER_STATE="new"
# 初始化集群 token
ETCD_INITIAL_CLUSTER_TOKEN="mritd-etcd-cluster"
# 通知 客户端地址
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.154:2379,http://192.168.1.154:4001"

2.4、测试

集群搭建好后,在任意节点执行 etcdctl member list 可列所有集群节点信息,如下所示

hexo_etcd_getallnodes

同时可以使用 etcdctl cluster-health 检查集群健康状态

hexo_etcd_checkhealth

三、DNS 动态发现

3.1、创建 DNS 记录

Etcd 在基于 DNS 做服务发现时,实际上是利用 DNS 的 SRV 记录不断轮训查询实现的,所以首先要加入 DNS SRV 记录,以下采用 dnsmasq 作为 dns 服务器,dnsmasq 可参考本博客 10分钟 dnsmasq 搭建

1
2
3
4
5
6
7
8
9
10
11
12
13
# 增加 SRV 记录
vim /etc/dnsmasq.conf
# 增加内容如下
srv-host=_etcd-server._tcp.mritd.me,etcd1.mritd.me,2380,0,100
srv-host=_etcd-server._tcp.mritd.me,etcd2.mritd.me,2380,0,100
srv-host=_etcd-server._tcp.mritd.me,etcd3.mritd.me,2380,0,100

# 然后增加对应的域名解析
vim /etc/dnsmasq.hosts
# 增加内容如下
192.168.1.154 etcd1.mritd.me
192.168.1.156 etcd2.mritd.me
192.168.1.249 etcd3.mritd.me

重启 dnsmasq 测试是否成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 重启
systemctl restart dnsmasq

# 查询 SRV
dig @192.168.1.106 +noall +answer SRV _etcd-server._tcp.mritd.me

_etcd-server._tcp.mritd.me. 0 IN SRV 0 100 2380 etcd2.mritd.me.
_etcd-server._tcp.mritd.me. 0 IN SRV 0 100 2380 etcd1.mritd.me.
_etcd-server._tcp.mritd.me. 0 IN SRV 0 100 2380 etcd3.mritd.me.

# 查询域名解析
dig @192.168.1.106 +noall +answer etcd1.mritd.me etcd2.mritd.me etcd3.mritd.me

etcd1.mritd.me. 0 IN A 192.168.1.154
etcd2.mritd.me. 0 IN A 192.168.1.156
etcd3.mritd.me. 0 IN A 192.168.1.249

3.2、修改 DNS 服务器

Linux 系统默认从 /etc/resolv.conf 配置文件读取 DNS 服务器,为了让 Etcd 能够从 dnsmasq 服务器获取自定义域名解析,要修改3台 Etcd 服务器的 /etc/resolv.conf 文件

1
2
3
4
5
6
7
8
# 编辑 resolv.conf 文件
vim /etc/resolv.conf
# 文件内容如下,保证我们自定义的 dnsmasq 服务器在第一位

# Generated by NetworkManager
search lan lan.
nameserver 192.168.1.106

3.3、配置 Etcd

接下来修改 Etcd 配置文件,开启 DNS 服务发现,主要是删除掉 ETCD_INITIAL_CLUSTER 字段(用于静态服务发现),并指定 DNS SRV 域名(ETCD_DISCOVERY_SRV)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 编辑 etcd 配置文件
vim /etc/etcd/etcd.conf

# 配置样例如下

# 节点名称
ETCD_NAME=etcd1
# 数据存放位置
ETCD_DATA_DIR="/var/lib/etcd/etcd1"
# 监听其他 Etcd 实例的地址
ETCD_LISTEN_PEER_URLS="http://etcd1.mritd.me:2380"
# 监听客户端地址
ETCD_LISTEN_CLIENT_URLS="http://etcd1.mritd.me:2379,http://etcd1.mritd.me:4001"
# 通知其他 Etcd 实例地址
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://etcd1.mritd.me:2380"
# 初始化集群状态,new 表示新建
ETCD_INITIAL_CLUSTER_STATE="new"
# 初始化集群 token
ETCD_INITIAL_CLUSTER_TOKEN="mritd-etcd-cluster"
# 通知 客户端地址
ETCD_ADVERTISE_CLIENT_URLS="http://etcd1.mritd.me:2379,http://etcd1.mritd.me:4001"
# 集群 DNS SRV 域名
ETCD_DISCOVERY_SRV="mritd.me"

3.4、测试

1
2
3
4
5
6
7
8
9
# 由于端口并未绑定到 0.0.0.0,所以需要指定 etcd 服务器
# 静态服务发现是绑定了 0.0.0.0 只是因为懒.....
# 出于安全考虑最好只监听局域网
etcdctl --endpoints "http://etcd1.mritd.me:2379,http://etcd1.mritd.me:4001" member list

# 显示如下
1e306cee69c3e859: name=etcd3 peerURLs=http://etcd3.mritd.me:2380 clientURLs=http://etcd3.mritd.me:2379,http://etcd3.mritd.me:4001 isLeader=false
ee23db1083fd44ac: name=etcd1 peerURLs=http://etcd1.mritd.me:2380 clientURLs=http://etcd1.mritd.me:2379,http://etcd1.mritd.me:4001 isLeader=true
f9de134820e6ec9e: name=etcd2 peerURLs=http://etcd2.mritd.me:2380 clientURLs=http://etcd2.mritd.me:2379,http://etcd2.mritd.me:4001 isLeader=false

四、基于已有集群的服务发现

这种方法感觉和静态服务发现感觉并没有什么卵用……根本达不到所谓的 “服务发现”

4.1、获取集群标识

集群标识可以从已有的 Etcd 集群中创建,Etcd 官方提供了一个创建地址,一下以官方地址做演示,如果从私有集群创建集群标识请自行 Google

1
2
3
4
# 获取集群标识 size 代表要创建的集群大小
curl -w "\n" 'https://discovery.etcd.io/new?size=3'
# 返回如下
https://discovery.etcd.io/f6a252c5240cc89b91fa00dac95d5732

4.2、修改配置

依次编辑3个节点的 Etcd 配置文件,主要指定 ETCD_DISCOVERY 参数为获取的集群标识即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 编辑 etcd 配置文件
vim /etc/etcd/etcd.conf
# 配置样例如下
# 节点名称
ETCD_NAME=etcd1
# 数据存放位置
ETCD_DATA_DIR="/var/lib/etcd/etcd1"
# 监听其他 Etcd 实例的地址
ETCD_LISTEN_PEER_URLS="http://etcd1.mritd.me:2380"
# 监听客户端地址
ETCD_LISTEN_CLIENT_URLS="http://etcd1.mritd.me:2379,http://etcd1.mritd.me:4001"
# 通知其他 Etcd 实例地址
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://etcd1.mritd.me:2380"
# 初始化集群状态,new 表示新建
ETCD_INITIAL_CLUSTER_STATE="new"
# 初始化集群 token
ETCD_INITIAL_CLUSTER_TOKEN="mritd-etcd-cluster"
# 通知 客户端地址
ETCD_ADVERTISE_CLIENT_URLS="http://etcd1.mritd.me:2379,http://etcd1.mritd.me:4001"
# 设置集群标识
ETCD_DISCOVERY="https://discovery.etcd.io/f6a252c5240cc89b91fa00dac95d5732"

4.3、测试

同 DNS 测试方法一样

1
2
3
4
etcdctl --endpoints "http://etcd1.mritd.me:2379,http://etcd1.mritd.me:4001" member list
1e306cee69c3e859: name=etcd3 peerURLs=http://etcd3.mritd.me:2380 clientURLs=http://etcd3.mritd.me:2379,http://etcd3.mritd.me:4001 isLeader=true
ee23db1083fd44ac: name=etcd1 peerURLs=http://etcd1.mritd.me:2380 clientURLs=http://etcd1.mritd.me:2379,http://etcd1.mritd.me:4001 isLeader=false
f9de134820e6ec9e: name=etcd2 peerURLs=http://etcd2.mritd.me:2380 clientURLs=http://etcd2.mritd.me:2379,http://etcd2.mritd.me:4001 isLeader=false

Etcd 集群搭建
https://mritd.com/2016/09/01/set-up-etcd-ha-cluster/
作者
Kovacs
发布于
2016年9月1日
许可协议