基于etcd集群https通信的实现

2020-03-16 02:31陈洋罗敏常珞
电子技术与软件工程 2020年24期
关键词:配置文件证书客户端

陈洋 罗敏 常珞

(河南医学高等专科学校 河南省郑州市 451191)

1 ETCD介绍

ETCD 是CoreOS 团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。它有以下几个特点:基于HTTP+JSON 的API 让你用curl 就可以访问,简单便捷;可使用SSL 客户认证机制,保证访问的安全性;每个实例每秒支持一千次写操作,效率更高;使用Raft 算法充分实现了分布式,保证了每个节点数据的一致性[2]。

ETCD 集群是一个分布式系统,是一个高度一致的分布式键值存储,它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。为保证数据的一致性,在etcd 集群中,每个节点都维护了一个状态机,且至多存在一个有效主节点。主节点处理所有来自客户端写操作,根据Raft 算法原理,每一次写操作,需要集群中的主节点在内超过半数节点(n/2 +1)根据日志的逻辑时钟和日志编号来判断是否将该日志记录持久化到本地,并将日志输入到状态机,而将结果返回给客户端。通过 Raft 协议保证操作对状态机的改动会可靠的同步到其他节点,从而保证节点数据的一致性。因此节点数越多,效率越低,但作为集群,etcd 节点数量总是大于等于2[10]。

表1:etcd 集群最大容错节点[3]

节点数一般不会选择偶数,主要是因为偶数节点的集群风险更高[3],主要表现在两个方面:其一,在选主过程中,有较大概率出现等额选票,造成选主失败从而触发下一轮选举;其二,偶数节点集群在某些网络分割的场景下无法正常工作。当网络分割发生后,将集群节点对半分割开,按照Raft 协议,此时集群写操作无法使得大多数节点同意,从而导致写失败,使集群无法正常工作。

图1:etcd 集群etcd-4 节点etcd 配置文件

图2:etcd 集群部署成功显示的状态

图3:生成集群配置所需要的证书

图4:实现etcd 集群客户端认证

图5:etcd 集群内部安全认证

通常,按照需求将集群节点部署为3、5 或7 个节点,其可支持的容错节点如表1 所示。

2 ETCD集群部署

本次集群搭建选择3 个节点,节点名称分别是etcd-4 、etcd-5、etcd-6。 etcd 集群的搭建三种方式[4],包括:static、etcd discovery 和DNS discovery。static 是最简单的一种搭建etcd 的方式,它不需要任何额外的服务,只需要知道运行etcd 的所有节点的hostname 或者IP 地址即可。

在Linux 操作系统下,etcd 服务的安装方式有yum 安装和二进制安装。二进制安装需要从github 官方网址https://github.com/etcdio/etcd/releases 中选择合适的版本,下载到本地进行安装部署。二进制部署难度相对而言较大,但容易控制,更有利于后期维护。在实际生产过程中,推荐使用二进制的方式进行安装部署。而yum源安装方式相对简单,安装门槛较低,一般用在测试中。

2.1 安装并启动etcd

本次测试使用yum 源的方式安装,static 方式部署。关于安装etcd 服务所需要的配置信息,可以参考官方提供的最低配置,在这里不再介绍[11]。在所有节点安装etcd 服务,启动服务并加入自起列表,使用etcdctl 访问etcd 并检查验证其状态。如显示got healthy,则说明etcd 服务已经启动成功了:

2.2 集群部署

上述节点只是启动了etcd 服务,并未形成集群。要构建集群,就需要了解etcd 集群的通信方式。集群服务中的通信一般包括两种场景:对外提供服务的通信,发生在集群外部的客户端和集群某节点服务器之间的通信,etcd 服务默认访问2379 端口;集群内部的通信,发生在集群内部节点之间的通信,etcd 服务的默认访问2380端口。

yum 源安装默认配置文件在/etc/etcd/目录中,按照节点IP 地址与集群通信方式,修改配置文件中的参数,如图1 所示。

这里简单对图1 的中配置参数做一下简单说明,如想了解更多,可参考官方文档[6]进行系统学习。

ETCD_NAME:节点名称,集群中唯一; ETCD_DATA_DIR:数据目录ETCD_INITIAL_CLUSTER:集群节点地址;ETCD_INITIAL_CLUSTER_TOKEN:集群标识符,Token 值一样的隶属同一个集群;ETCD_INITIAL_CLUSTER_STATE:加入集群的当前状态,new 是新集群,existing 表示已有集群。

集群的配置信息如节点url、token 均存储在数据目录中,其配置项仅在建立集群时生效。所有集群的改动如:要更新单个成员peerURLs、做一次更新操作、要替代单个节点、添加或删除节点操作等都将使用etcd 自带的 etcdctl 命令行工具[10]来实现;或删除已有数据,重启etcd,这种方式一般用在新建集群时使用。

删除etcd 的数据文件,重启etcd 服务启动成功后,可以在任意一个节点上使用etcdctl 验证集群状态,当显示cluster is healthy,说明集群部署成功,如图2 所示。

3 Etcd集群的安全部署

3.1 CA证书的生成

Etcd 的特点是支持客户端认证的,因此可以使用自签证书进行安全部署[8]。自签证书的工具有openssl、easyrsa 与cfssl 三种[7],用官方推荐的cfssl[5]工具生成证书,官方文档中详细介绍了证书的生成方法,由于篇幅问题,这里不再赘述。着重介绍一下所用的三类认证证书[5]:

client certificate 用于通过服务器验证客户端。例如etcdctl、etcd proxy 或docker 客户端。

server certificate 由服务器使用,并由客户端验证服务器身份。例如docker 服务器或kube-apiserver。

peer certificate 用于集群成员之间认证,供节点之间校验,既认证服务器也认证客户端。

根据etcd 集群节点的IP 地址,替换官方文档中所提供证书配置文件中的IP 地址,生成集群所用到的证书文件,如图3 所示。

在实际生产过程中,为确保根证书密钥(ca.pem、ca-key.pem)的安全性,建议使用单机(可以从图3 看到,是在etcd-4 节点上生成的证书)生成证书,且必须保证生成证书的安全条件。

拷贝根证书的公钥ca.pem 和client、server 以及peer 的私钥、公钥到集群的另外两个节点供认证使用。

建议在实际生产环境中部署etcd 集群时,尽量使用5 个节点部署;或在生成server certificate 时,多预留几个IP 地址,以满足后期扩容、容灾需求。为方便证书管理,客户端与服务器的认证以及集群内部认证都可以使用peer certificate。

3.2 启动客户端认证

通过yum 方式安装的etcd 服务,其默认生成的service 用户名为etcd,而用root 用户生成的证书文件,其属主为root 用户,普通用户不可读。因此,需修改证书文件属主为etcd 或修改证书的权限使普通用户能读取使用。

在所有节点上修改etcd 配置文件,将client 的url 修改为https,并配置相关证书:

ETCD_LISTEN_CLIENT_URLS="https://192.168.1.44:2379,ht tp://127.0.0.1:2379"

ETCD_ADVERTISE_CLIENT_URLS= "https://192.168.1.44:2379"

ETCD_CERT_FILE="/opt/TLS/etcd/server.pem " #服务器证书

ETCD_KEY_FILE="/opt/TLS/etcd/server-key.pem" #服务器私钥

ETCD_CLIENT_CERT_AUTH="true" #启动客户端认证

ETCD_TRUSTED_CA_FILE="/opt/TLS/etcd/ca.pem" #根证书

由上述集群配置更新可知,修改配置文件之后还需要通过etcdctl 命令,实现客户端与服务器的通信,命令如下:

etcdctl --ca-file /opt/TLS/etcd/ca.pem --cert-file /opt/TLS/etcd/client.pem --key-file /opt/TLS/etcd/client-key.pem cluster-health

当显示cluster is healthy 时,说明客户端认证实现https 连接,如图4 所示。

etcd 的客户端与服务器端认证已经部署成功,接下来将实现etcd 集群内部之间https 通信。

3.3 集群相互认证

在所有节点上修改etcd 配置文件,将peer 的url 修改为https,添加peer 相关证书:

ETCD_LISTEN_PEER_URLS="https://192.168.1.44:2380"

ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.1.44:2380"

ETCD_INITIAL_CLUSTER="etcd-4=https:/192.168.1.44:2380,etcd-5=https://192.168.1.45:2380,etcd-6=https://192.168.1.46:2380"

ETCD_PEER_CERT_FILE="/opt/etcd/TLS/etcd/peer.pem"

ETCD_PEER_KEY_FILE="/opt/etcd/TLS/etcd/peer-key.pem"

ETCD_PEER_CLIENT_CERT_AUTH="true"

ETCD_PEER_TRUSTED_CA_FILE="/opt/etcd/TLS/etcd/ca.pem"

配置参数后,删除原有数据,重新启动etcd 服务,实现集群内部之间的https 传输,如图5 所示。

至此,静态etcd 集群内外访问都实现了https 通信。

4 总结

文章通过介绍etcd 的基本概念,从单节点安装服务,到集群成功部署;从证书生成,最后到集群内外都实现基于https 的安全访问,详细的介绍了etcd 集群的搭建过程,具有很强的参考意义。其中,客户端的安全认证为kubernetes 集群中Master 节点中kubeapiserver 组件访问etcd 集群提供了很好的借鉴作用,为高可用kubernetes 集群的安全部署夯实基础。

不足之处:本次安装部署etcd 采用的yum 源的方式进行安装,在实际生产中并不适用,只能做参考使用,但其部署原理是一致的。另外,证明实现https 通信还需要进行抓包测试。

注意,本次部署适用在新建集群,如果是已运行的etcsd 集群,要修改集群内外访问方式,需要修改配置文件并用etcdctl 命令更新,以防止原有数据的丢失。

猜你喜欢
配置文件证书客户端
WJCI 收录证书
CSCD收录证书
收录证书
收录证书
忘记ESXi主机root密码怎么办
县级台在突发事件报道中如何应用手机客户端
孵化垂直频道:新闻客户端新策略
基于Vanconnect的智能家居瘦客户端的设计与实现
打印机设置
客户端空间数据缓存策略