一、etcd简介
etcd 是一个分布式键值对存储系统,由coreos 开发,内部采用 raft 协议作为一致性算法,用于可靠、快速地保存关键数据,并提供访问。通过分布式锁、leader选举和写屏障(write barriers),来实现可靠的分布式协作。etcd集群是为高可用、持久化数据存储和检索而准备。
"etcd"这个名字源于两个想法,即 unix “/etc” 文件夹和分布式系统"d"istibuted。 “/etc” 文件夹为单个系统存储配置数据的地方,而 etcd 存储大规模分布式系统的配置信息。因此,"d"istibuted 的 “/etc” ,是为 “etcd”。
etcd 以一致和容错的方式存储元数据。分布式系统使用 etcd 作为一致性键值存储系统,用于配置管理、服务发现和协调分布式工作。使用 etcd 的通用分布式模式包括领导选举、分布式锁和监控机器活动。
虽然 etcd 也支持单点部署,但是在生产环境中推荐集群方式部署。由于etcd内部使用投票机制,一般 etcd 节点数会选择 3、5、7等奇数。etcd 会保证所有的节点都会保存数据,并保证数据的一致性和正确性。
二、etcd优点
etcd作为一个受到ZooKeeper与doozer启发而催生的项目,除了拥有与之类似的功能外,更专注于以下四点:
简单:安装配置简单,而且提供了 HTTP API 进行交互,使用也很简单
安全:支持 SSL 证书验证
快速:根据官方提供的 benchmark 数据,单实例支持每秒 2k+ 读操作
可靠:采用 raft 算法,实现分布式系统数据的可用性和一致性
三、工作原理
从etcd的架构图中我们可以看到,etcd主要分为四个部分:
第1部分是HTTP Server: 用于处理用户发送的API请求,以及其它etcd节点的同步与心跳信息请求。
第2部分是Store:用于处理etcd支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是etcd对用户提供的大多数API功能的具体实现。
第3部分是Raft:Raft强一致性算法的具体实现,是etcd的核心。
第4部分是WAL:Write Ahead Log(预写式日志),是etcd的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd就通过WAL进行持久化存储。在WAL中,所有的数据提交前都会事先记录日志。Snapshot是为了防止数据过多而进行的状态快照;Entry表示存储的具体日志内容。
通常,一个用户的请求发送过来,会经由Http Server转发给Store,以进行具体的事务处理。如果涉及到节点修改,则交给Raft模块进行状态变更、日志记录;然后,再同步给别的etcd节点,以确认数据提交;最后,进行数据提交,再次同步。
四、集群部署
4.1服务器列表
服务器名称 服务器IP 服务器端口
master 192.168.145.180 2379、2380
slave1 192.168.145.181 2379、2380
slave2 192.168.145.182 2379、2380
4.2 etcd master节点安装
4.2.1 生成pem证书
1)使用XshellPortable连接到192.168.145.180的22端口,输入用户名:root,密码:******。
2)建立需要的文件目录,命令如下:
cd /data
mkdir soft
cd soft
mkdir /data/soft/cfssl
mkdir /data/soft/ssl
mkdir /data/kubernetes/
mkdir /data/kubernetes/{
bin,cfg,ssl}
cd /data/soft/cfssl
3)下载cfssl文件,命令如下:
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
4)给刚刚下载的三个文件进行授权,命令如下:
chmod +x cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64
5)移动三个文件到系统目录,命令如下:
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
6)进入ssl目录,开始生成,命令如下:
cd /data/soft/ssl
7)创建pem证书配置文件,命令如下:
cfssl print-defaults config > config.json
cfssl print-defaults csr > csr.json
cfssl print-defaults csr > server-csr.json
cfssl print-defaults csr > admin-csr.json
cfssl print-defaults csr > kube-proxy-csr.json
编辑config.json,命令:
vi config.json
内容如下:
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"expiry": "8760h",
"usages": [
"signing",