本文参考 Systemd 教程、Etcd 配置说明
一、简介
Etcd 是 CoreOS 推出的高可用的键值存储系统,主要用于k8s集群的服务发现等,而本身 Etcd 也支持集群模式部署,从而实现自身高可用;
Etcd 构建自身高可用集群主要有三种形式:
- 静态发现: 预先已知 Etcd 集群中有哪些节点,在启动时直接指定好 Etcd 的各个 node 节点地址
- Etcd 动态发现: 通过已有的 Etcd 集群作为数据交互点,然后在扩展新的集群时实现通过已有集群进行服务发现的机制
- DNS 动态发现: 通过 DNS 查询方式获取其他节点地址信息
二、静态发现
2.1、环境准备
以下在 3 台虚拟机上搭建,系统环境为 CentOS7
节点 | 地址 |
---|
etcd0 | 192.168.1.154 |
etcd1 | 192.168.1.156 |
etcd2 | 192.168.1.249 |
2.2、安装 Etcd
CentOS 官方提供了 Etcd 的rpm,可通过 yum 直接安装,目前 yum 上最新版本为 2.3.7,比较合适;官方最新版本更新到了 3.0.6,鉴于稳定因素,这里使用 2.3.7 搭建
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
可列所有集群节点信息,如下所示
同时可以使用 etcdctl cluster-health
检查集群健康状态
三、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
| 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
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
| vim /etc/resolv.conf
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
| vim /etc/etcd/etcd.conf
ETCD_NAME=etcd1
ETCD_DATA_DIR="/var/lib/etcd/etcd1"
ETCD_LISTEN_PEER_URLS="http://etcd1.mritd.me:2380"
ETCD_LISTEN_CLIENT_URLS="http://etcd1.mritd.me:2379,http://etcd1.mritd.me:4001"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://etcd1.mritd.me:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="mritd-etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://etcd1.mritd.me:2379,http://etcd1.mritd.me:4001"
ETCD_DISCOVERY_SRV="mritd.me"
|
3.4、测试
1 2 3 4 5 6 7 8 9
|
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
| 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
| vim /etc/etcd/etcd.conf
ETCD_NAME=etcd1
ETCD_DATA_DIR="/var/lib/etcd/etcd1"
ETCD_LISTEN_PEER_URLS="http://etcd1.mritd.me:2380"
ETCD_LISTEN_CLIENT_URLS="http://etcd1.mritd.me:2379,http://etcd1.mritd.me:4001"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://etcd1.mritd.me:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
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
|