etcd有两种节点,分别为集群节点和代理节点。两种节点在使用上几乎没有区别,这使咱们能够在每台机器上都安装etcd,进而把etcd看成本地服务使用。它们的区别在于内部原理不一样:前端
集群的大小指集群节点的个数。根据 etcd 的分布式数据冗余策略,集群节点越多,容错能力(Failure Tolerance)越强,同时写性能也会越差。 因此关于集群大小的优化,其实就是容错和写性能的一个平衡。 另外,etcd推荐使用奇数做为集群节点个数。由于奇数个节点与和其配对的偶数个节点相比(好比 3节点和4节点对比),容错能力相同,却能够少一个节点。因此综合考虑性能和容错能力,etcd 官方文档推荐的 etcd 集群大小是 3, 5, 7。node
etcd 集群的搭建有三种方式,包括:static方式,etcd discovery方式和DNS discovery。DNS discovery方式在实际生产中不多使用,在这里不做说明。bash
我这里的部署以etcd v3.3.1为例,etcd的安装能够直接使用二进制文件,也可使用yum或apt的方式安装,我这里默认使用二进制的方式安装,且二进制文件存放在/opt/kubernetes/bin目录下。配置文件存放在/opt/kubernetes/cfg目录下。frontend
static方式是最简单的一种搭建etcd的方式。它不须要任何额外的服务,只须要知道准备用来运行etcd的全部节点的hostname或者IP便可。curl
测试的三台机器以下:tcp
HostName | Address | EtcdName |
---|---|---|
etcd1 | 10.5.12.16 | etcd1 |
etcd2 | 10.5.12.17 | etcd2 |
etcd3 | 10.5.12.18 | etcd3 |
etcd1上的/opt/kubernetes/cfg/etcd.conf配置文件以下:分布式
ETCD_NAME=etcd1 ETCD_DATA_DIR="/data/etcd" ETCD_LISTEN_CLIENT_URLS="http://10.5.12.16:2379,http://127.0.0.1:2379" ETCD_LISTEN_PEER_URLS="http://10.5.12.16:2380" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.5.12.16:2380" ETCD_INITIAL_CLUSTER="etcd1=http://10.5.12.16:2380,etcd2=http://10.5.12.17:2380,etcd3=http://10.5.12.18:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_ADVERTISE_CLIENT_URLS="http://10.5.12.16:2379"
其余节点配置基本相同,这里就再也不做详细说明。性能
全部节点上服务启动文件/usr/lib/systemd/system/etcd.service以下:测试
[Unit] Description=Etcd Server After=network.target [Service] Type=simple WorkingDirectory=/var/lib/etcd EnvironmentFile=-/opt/kubernetes/cfg/etcd.conf # set GOMAXPROCS to number of processors ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /opt/kubernetes/bin/etcd" Type=notify [Install] WantedBy=multi-user.target
还须要说明的是,默认etcd采用的是v2接口,在一些特定场景中,须要使用etcd的v3接口。则须要配置以下环境变量:优化
export ETCDETC_API=3
经过以下方式启动:
systemctl daemon-reload systemctl start etcd systemctl enable etcd
启动后,咱们查看etcd进程,以下:
/opt/kubernetes/bin/etcd --name etcd1 --data-dir /data/etcd --listen-client-urls http://10.5.12.16:2379,http://127.0.0.1:2379 --listen-peer-urls http://10.5.12.16:2380 --initial-advertise-peer-urls http://10.5.12.16:2380 --initial-cluster etcd1=http://10.5.12.16:2380,etcd2=http://10.5.12.17:2380,etcd3=http://10.5.12.18:2380 --advertise-client-urls http://10.5.12.16:2379 --initial-cluster-token etcd-cluster --initial-cluster-state new
下面是一些经常使用配置选项的说明:
这些选项,与上面咱们配置文件里的配置一一对应,如ETCD_INITIAL_CLUSTER
等同于--inital-cluster
, ETCD_INITIAL_CLUSTER_STATE
等同于--initial-cluster-state
。
全部以--init开头的配置都是在第一次启动etcd集群的时候才会用到,后续节点的重启会被忽略,如--initial-cluseter参数。因此当成功初始化了一个etcd集群之后,就再也不须要这个参数或环境变量了。
能够在三个节点的前端使用haproxy作反向代理(事实上,这并非必须的,在实际生产中,不多这么作。),haproxy.cfg配置以下:
frontend etcd bind 10.5.12.19:4001 mode tcp option tcplog default_backend etcd log 127.0.0.1 local3 backend etcd balance roundrobin fullconn 1024 server etcd1 10.5.12.16:2379 check port 4001 inter 300 fall 3 server etcd2 10.5.12.17:2379 check port 4001 inter 300 fall 3 server etcd3 10.5.12.18:2379 check port 4001 inter 300 fall 3
不少时候,你只知道须要要搭建一个多大(包含多少节点)的集群,可是并不能事先知道这几个节点的ip,从而没法使用 -initial-cluster 参数。 这个时候,就须要使用discovery的方式来搭建etcd
集群。事实上,这种方式在实际生产环境中,使用的也并很少。
etcd discovery 有两种:
如下的两种配置方式由于不多用于生产,因此我只是验证了第一种方式,第二种方式彻底摘抄于网上其余文档,并未做具体验证,仅供参考。
curl https://discovery.etcd.io/new?size=3 #size=3表示建立一个3节点的集群 # 返回以下结果: https://discovery.etcd.io/96ca21e0510d96442a3689751cb6fdc0
etcd --name etcd1 --data-dir /data/etcd \ --initial-advertise-peer-urls http://10.5.12.16:2380 \ --listen-peer-urls http://10.5.12.16:2380 \ --listen-client-urls http://10.5.12.16:2379,http://127.0.0.1:2379 \ --advertise-client-urls http://10.5.12.16:2379 \ --discovery https://discovery.etcd.io/96ca21e0510d96442a3689751cb6fdc0
若是使用变量的方式,则ETCD_DISCOVERY
等于--discovery
,另外,若是实际启动的etcd节点数大于discovery token建立时指定的size,多余的节点会自动变为proxy节点。
这种方式就是利用一个已有的etcd集群来提供discovery服务,从而建立一个新的etcd集群,假设已有的etcd集群的一个访问地址为myetcd.local,那么首先要在已有的etcd上建立一个特殊的key,以下:
# 其中value=3表示集群的大小,5c007a14875d53d9bf0ef5a6fc0257c817f0fb83则用来作discovery的token curl -X PUT https://myetcd.local/v2/keys/discovery/5c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=3
而后在三个要部署集群的节点上执行以下操做便可:
etcd --name etcd1 --data-dir /data/etcd \ --initial-advertise-peer-urls http://10.5.12.16:2380 \ --listen-peer-urls http://10.5.12.16:2380 \ --listen-client-urls http://10.5.12.16:2379,http://127.0.0.1:2379 \ --advertise-client-urls http://10.5.12.16:2379 \ --discovery https://discovery.etcd.io/5c007a14875d53d9bf0ef5a6fc0257c817f0fb83