什么是etcd?
etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现。etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性。Raft是一个来自Stanford的新的一致性算法,适用于分布式系统的日志复制,Raft通过选举的方式来实现一致性,在Raft中,任何一个节点都可能成为Leader。Google的容器集群管理系统Kubernetes、开源PaaS平台Cloud Foundry和CoreOS的Fleet都广泛使用了etcd。
etcd 集群的工作原理基于 raft 共识算法 (The Raft Consensus Algorithm)。etcd 在 0.5.0 版本中重新实现了 raft 算法,而非像之前那样依赖于第三方库 go-raft 。raft 共识算法的优点在于可以在高效的解决分布式系统中各个节点日志内容一致性问题的同时,也使得集群具备一定的容错能力。即使集群中出现部分节点故障、网络故障等问题,仍可保证其余大多数节点正确的步进。甚至当更多的节点(一般来说超过集群节点总数的一半)出现故障而导致集群不可用时,依然可以保证节点中的数据不会出现错误的结果。
yum install etcd -y
在node1上配置/etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.26.41:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://192.168.26.41:2379"
ETCD_NAME="etcd1"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.26.41:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.26.41:2379"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.26.41:2380,etcd2=http://192.168.26.42:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
在node2上配置/etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.26.42:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://192.168.26.42:2379"
ETCD_NAME="etcd2"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.26.42:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.26.42:2379"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.26.41:2380,etcd2=http://192.168.26.42:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_NAME 节点名称,默认为default
ETCD_DATA_DIR 服务运行数据保存的路径
ETCD_LISTEN_PEER_URLS 监听的同伴通信的地址,比如http://ip:2380,如果有多个,使用逗号分隔。需要所有节点都能够访问,所以不要使用localhost!
ETCD_LISTEN_CLIENT_URLS 监听的客户端服务地址
ETCD_ADVERTIDE_CLIENT_URLS 对外公告的节点客户端监听地址,这个值会告诉集群中其他节点。
ETCD_INITIAL_ADVERTISE_PEER_URLS 对外公告该节点同伴监听地址,这个值会告诉集群中其他节点
ETCD_INITIAL_CLISTER 集群中所以节点的信息
ETCD_INITIAL_CLUSTER_STATE 新建集群的时候,这个值为new;假如加入已经存在的集群,这个值为existing。
ETCD_INITIAL_CLUSTER_TOKEN 集群的ID,多集群的时候,每个集群的ID必须保持唯一。
开启etcd服务
systemctl start etcd; systemctl enable etcd
etcd集群配置完成
把node3加入节点
在已经在集群里节点上执行
etcdctl membet add etd3 http://192.168.26.43:2380
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.26.43:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://192.168.26.43:2379"
ETCD_NAME="etcd3"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.26.43:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.26.43:2379"
ETCD_INITIAL_CLUSTER="etcd2=http://192.168.26.42:2380,etcd1=http://192.168.26.41:2380,etcd3=http://192.168.26.43:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="existing"
开启etcd服务
systemctl start etcd; systemctl enable etcd
此时再使用etcdctl member list命令查看
加入集群成功
测试
在一个节点上写入数据 , 在其他节点上查看数据是否同步
可以看到数据是实时同步的
etcd最新的API版本是v3,与v2相比,v3更高效更清晰。k8s默认使用的etcd V3版本API,ectdctl默认使用V2版本API。要使用v3,设置环境变量export ETCDCTL_API=3临时更改为V3或者vim /etc/profile后在里面添加export ETCDCTL_API=3,然后执行source /etc/profile则永久更改为V3。