概述

etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。

etcd作为服务发现系统,有以下的特点:

简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单
安全:支持SSL证书验证
快速:根据官方提供的benchmark数据,单实例支持每秒2k+读操作
可靠:采用raft算法,实现分布式系统数据的可用性和一致性

etcd项目地址:https://github.com/coreos/etcd/

kubernetes中的使用

目前etcd是作为kubernetes集群当中的存储后端

在kuernetes中etcd涉及到的安全相关的主要有:

  • etcd支持备份恢复机制,防止数据被误删导致数据丢失
  • 用户的敏感信息建议放在secret类型的资源中,该类型资源是加密存储在etcd中的
  • etcd支持https, kube-apiserver访问etcd使用https协议

在kubernetes中的配置:

Client -> Server

1
2
3
4
5
6
7
8
9
10
11
12
client-transport-security:
# 通道以TLS协议加密
ca-file: '/etc/etcd/ssl/etcd-ca.pem'
cert-file: '/etc/etcd/ssl/etcd.pem'
key-file: '/etc/etcd/ssl/etcd-key.pem'

# 服务端会认证客户端证书是否受信任CA签发
client-cert-auth: true
trusted-ca-file: '/etc/etcd/ssl/etcd-ca.pem'

# 是否系统自动生成证书
auto-tls: true

Server -> Server

1
2
3
4
5
6
7
8
9
10
11
12
peer-transport-security:
# 通道以TLS协议加密
ca-file: '/etc/etcd/ssl/etcd-ca.pem'
cert-file: '/etc/etcd/ssl/etcd.pem'
key-file: '/etc/etcd/ssl/etcd-key.pem'

# 服务端会认证客户端证书是否受信任CA签发
peer-client-cert-auth: true
trusted-ca-file: '/etc/etcd/ssl/etcd-ca.pem'

# 是否系统自动生成证书
auto-tls: true

etcd的备份

对于 API 3 备份与恢复方法
官方 v3 admin guide
在使用 API 3 时需要使用环境变量 ETCDCTL_API 明确指定。
在命令行设置:

1
$ export ETCDCTL_API=3

备份数据:

1
$ etcdctl --endpoints=[localhost:2379] snapshot save snapshot.db

恢复:

1
$ etcdctl snapshot restore snapshot.db --name m3 --data-dir=/home/etcd_data

恢复后的文件需要修改权限为 etcd:etcd
–name:重新指定一个数据目录,可以不指定,默认为 default.etcd
–data-dir:指定数据目录
建议使用时不指定 name 但指定 data-dir,并将 data-dir 对应于 etcd 服务中配置的 data-dir

etcd 集群都是至少 3 台机器,官方也说明了集群容错为 (N-1)/2,所以备份数据一般都是用不到,但是鉴上次 gitlab 出现的问题,对于备份数据也要非常重视。