etcd多集群
方式
引导etcd集群的机制有三种:
- 静态
- etcd discovery
- DNS discovery
Discovery
之前的集群演示是通过静态启动的机制引导etcd集群。但许多情况下,在集群成员的IP可能提前未知。
这在使用云提供商或网络使用DHCP时很常见。在这种情况下不是指定静态配置,而是使用etcd集群来引导新的成员,此过程称为发现。
etcd discovery service
discovery url的声明周期
discovery url
用来标识唯一的etcd集群,每个etcd实例共享一个新的discovery url
以引导新集群,而不是重用现有的discovery url
。
此外,discovery url
仅用于集群的初始引导,若要在集群已运行后更改集群成员的资格,需参考运行时重新配置。
自定义etcd发现服务
这种方式就是利用一个已有的etcd集群来引导自身,从而搭建一个新的etcd集群。
生成一个新的发现令牌
1 | [root@jw-etcd01 ~]# UUID=$(uuidgen) |
生成discovery url
1 | [root@jw-etcd01 ~]# curl -X PUT http://172.19.19.122:2379/v2/keys/discovery/${UUID}/_config/size -d value=2 |
将创建一个discovery url
,其中value=2
代表本集群的大小,通常为3、5、7、9...
,我没有多余的机器,所以用两台。
discovery url为
:http://172.19.19.122:2379/v2/keys/discovery/0d8c6714-b4b1-4cc1-8ff4-d276f96d247f
启动
先配置好两个yml文件。
编辑/etc/etcd/conf.yml
文件
1 | name: etcd2 |
1 | name: etcd3 |
启动命令:etcd --config-file=/etc/etcd/conf.yml
从中可以发现,当第一个节点执行命令的时候,会等待另外一台加入,
1 | [root@jw-etcd02 ~]# etcd --config-file=/etc/etcd/conf-discovery1.yml |
当所有成员注册之后启动集群,就构建了一个新的集群了。
查看成员状态:
1 | [root@jw-etcd02 ~]# etcdctl member list |
查看集群状态:
1 | [root@jw-etcd02 ~]# endpoints=172.19.19.124:2379,172.19.19.123:2379 |
公共etcd发现服务
如果没有可用的现有集群,可以使用托管在公共发现服务discovery.etcd.io
,公共的discovery
是通过CoreOS提供的公共discovery
服务申请token。
获取集群标识
1 | [root@jw-etcd01 etcd]# curl https://discovery.etcd.io/new?size=3 |
启动
编辑配置文件
这里如果使用内网走代理的话,要加个代理,不然网络原因一只启动不了。
1 | name: etcd1 |
1 | name: etcd2 |
1 | name: etcd3 |
三台机器执行命令:etcd --config-file=/etc/etcd/conf.yml
1 | [root@jw-etcd03 etcd]# etcd --config-file=./conf-discovery2.yml |
查看成员状态:
1 | [root@jw-etcd01 ~]# etcdctl member list |
查看集群状态:
1 | [root@jw-etcd01 ~]# endpoints=172.19.19.122:2379,172.19.19.124:2379,172.19.19.123:2379 |
DNS SRV Records
etcd
基于dns做服务发现时,实际上利用了dns的srv记录不断轮询查询实现的,
dns srv
:是dns数据库支持的一种资源记录的类型,它记录了哪台计算机提供了哪个服务的简单记录和信息。
这里采用dnsmasq
作为dns服务器。
提前在hostname为etcd03
、ip为172.19.19.124
机器上搭建好一台dns服务器。然后另外两台机器添加这台机器的dns服务器在第一位。
1 | [root@jw-etcd01 ~]# cat /etc/resolv.conf |
增加dns srv记录
服务端
1 | [root@jw-etcd03 ~]# vim /etc/dnsmasq.conf |
客户端
1 | [root@jw-etcd03 ~]# vim /etc/dnsmasq.conf |
增加对应的域名解析
1 | [root@jw-etcd03 ~]# cat /etc/hosts |
重启dnsmasq
1 | systemctl restart dnsmasq |
查询dns srv记录
没有该命令的先安装:yum install bind-utils -y
1 | [root@jw-etcd01 ~]# dig +noall +answer SRV _etcd-server._tcp.hi-etcd.com |
_etcd-server
:代表一个服务,名称应以下划线开头,比如:_ldap
、_ftp
、_smtp
,该标识说明把这台服务器当做响应etcd-server
请求的服务器。_tcp
:本服务使用的协议,名称应以下划线开头,可以是tcp或者udp。topsec-etcd.com
:此记录所在的域名。300
:此记录默认生存的时间,以秒为单位。IN
:标准DNS Internet类。SRV
:将这条记录标识为SRV记录。0
:优先级,如果相同的服务有多条记录,会尝试先连接优先级最低的记录。100
:负载均衡机制,多条srv记录并且优先级也相同,那么会尝试连接权重最高的记录。2380
:此服务使用的端口。etcd1.topsec-etcd.com.
:提供此服务的主机。
查询域名解析结果
1 | [root@jw-etcd01 ~]# dig +noall +answer etcd1.hi-etcd.com etcd2.hi-etcd.com etcd3.hi-etcd.com |
使用dns引导etcd集群
启动
编辑配置文件
1 | name: etcd1 |
1 | name: etcd2 |
1 | name: etcd3 |
三台机器分别执行命令:
1 | etcd --config-file=/etc/etcd/conf-discovery-dns.yml |
查看成员状态:
1 | [root@jw-etcd01 etcd]# etcdctl member list |
查看集群状态:
1 | [root@jw-etcd01 etcd]# endpoints=etcd1.hi-etcd.com:2379,etcd2.hi-etcd.com:2379,etcd3.hi-etcd.com:2379 |