202 ETCD集群部署及维护

ETCD 是一个高可用的分布式键值数据库,可用于服务发现。ETCD 采用 raft 一致性算法,基于 Go 语言实现。

01.集群部署基本信息

etcd_version: v3.4.6 etcd_base_dir: /var/lib/etcd

etcd_data_dir: "/var/lib/etcd/default.etcd"

etcd_listen_port: "2379"

etcd_peer_port: "2380"

etcd_bin_dir: /srv/kubernetes/bin

etcd_conf_dir: /srv/kubernetes/conf

etcd_pki_dir: /srv/kubernetes/pki

部署主机:

10.40.58.153

10.40.58.154

10.40.58.116

02.ETCD凭证

创建 ETCD 凭证签发请求文件:

其中hosts请填写部署etcd的主机IP地址, 如果使用域名请将域名一并填写

创建 ETCD 凭证和私钥:

结果将生成以下两个文件

03.部署

下载软件包

使用如下命令初始化etcd的运行环境及下载etcd程序并安装

配置文件维护

节点1

节点2

节点3

分别登录没台节点机器, 使上面的环境变量生效, 执行下面的命令

如果需要etcd api v2 的支持, 请配置enable-v2: true

使用system管理etcd

创建service文件

配置etcd开机启动

用下面的命令启动或者停止etcd

验证查看集群状态

为了方便使用配置etcdctl别名, 配置完成后退出重新登录主机

查看集群状况

output

04.架构及内部机制解析

raft一致性算法

  • 节点数量

    etcd集群节点的数量根据raft一致性算法中quorum的概念, 集群中必须存在(n+1)/2个节点才可以对外提供服务, 如果一个集群中有3个节点, 那么集群可以对外提供服务的最小节点数量为(3+1)/2=2 个, 也就只允许其中一个节点故障

  • 数据写入

    etcd的集群由3个到5个节点组成, 使用raft一致性算法完成一致性协同, 算法选举leader并有leader完成数据的同步和数据的分发, 当leader发生故障时选举出新的leader并由新的leader完成数据的同步, 客户端连接到etcd的集群时只需要连接其中的任意一个节点就可以完成数据的读写

Api介绍

etcd 提供的接口可以划分为5组:

  • PUT(Key. Value)/Delete(Key)

    使用put接口提供Key和Value写入数据

    使用Delete接口提供Key删除数据

  • GET(key)/Get(keyFrom, keyEnd)

    get(key) 查询指定key的value

    get(keyFrom, keyEnd) 指定一个Key的范围进行查询

  • Watch(Key/keyPrefix)0

    使用watch接口可以实时订阅etcd中数据更新

  • Transaction(if/then/else ops).commit()

    etcd提供了事物支持, 可以指定条件满足时执行某些操作

  • Leases: Grant/Revoke/Keepalive

    >

数据的版本控制

全局版本

  • etcd中有个term的概念, 代表的是整个集群leader的任期, 当leader发生切换时term的数值题+1

  • etcd中还有一个revision, revision代表全局数据的版本, 当数据发生变更如: 增、删、改、查都会是revision加一。 当集群的term不发生变化时revision递增

KeyValue数据版本

  • Create_revision, 是keyvalue创建时的revision

  • mod_revision, 对数据进行操作,数据发生变更时的revision

  • version, 是一个计数器, 表示keyvalue被修改了多少次

验证

使用如下指令我们可以获得key的版本信息

执行如下指令进行修改, 修改完成后进行对比

通过如上数据的对比我们可以得出以下结论,由于集群没有进行新的选举所以term的verison没有发生变化, 修改了一次数据以后全局的revision加了1, 数据的create_revision为数据写入时全局的revision, 由于进行了数据的修改所以mod_revision递增+1, 数据修改了两次所以version等于2

05.etcdctl命令详解

etcdctl是etcd的命令行工具, 可以使用此命令和etcd进行交互, 默认etcdctl使用v2的API, 如果需要使用V3 的API请设置环境变量, 命令如下:

数据的写入

数据的查询

  • 指定单个key查询

  • 指定key的范围进行查询

    写入数据

    查询数据

    根据查询的结果我们可以知道查询的结果是不包含结束的key

  • 查询指定前缀的key

  • 查看置顶revision的key

  • 查看集群中所有数据

    06.集群维护

节点增加

增加节点10.40.58.152为新节点, 请先执行 下载软件包进行环境初始化

更新证书

修改证书的csr文件重新生成证书的公钥和私钥, hosts字段添加新的主机IP地址

创建 admin client 凭证和私钥:

结果将生成以下两个文件

复制 TLS 证书和密钥对

重启etcd Cluster

启动新实例

请根据如下命令生成etcd的配置文件, 完成后请根据使用system管理etcd配置systemd, 并启动节点

分别登录没台节点机器, 使上面的环境变量生效, 执行下面的命令

添加实例

节点删除

获取节点的ID

删除member

查看集群的健康状态

数据备份

--snapshot-count:指定有多少事务(transaction)被提交时,触发截取快照保存到磁盘,在v3.2之前的版本,默认的参数是10000条,3.2之后调整为100000条。 这个条目数量不能配置过高或者过低,过低会导致频繁的io压力,过高会导致占用高内存以及会导致etcd GC过慢。建议设置为10W-20W条。

--max-snapshots '5': 最大保留多少快照文件

配置snaphost, 添加如下内容到etcd.yaml文件中, 其中snapshot-count 为了测试设置为10

执行相关提交10次后查看日志发现snapshot已经保存

备份的snap文件存在/var/lib/etcd/default.etcd/member/snap

数据恢复

本文的测试用例为3台节点其中一台节点所有原始文件全部丢失, 查看集群的健康状态如下:

其中10.40.61.116节点状态异常, 我们删掉了data-dir下的所有文件并停止了服务

创建快照

从正在运行的节点上执行如下执行

  • 写入测试数据

  • 生成快照

  • 将快照cp到10.40.61.116主机

恢复快照

验证

Q&A

Q:

A: 上面报错的主要是因为当前集群没有开通api v2的支持, 请在/srv/kubernetes/conf/etcd.yaml 文件中添加v2支持

参考文档

最后更新于

这有帮助吗?