一、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",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
编辑csr.json,命令如下:
vi csr.json
内容如下:
{
"CN": "kubernets",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "system"
}
]
}
编辑server-csr.json,命令如下:
vi server-csr.json
内容如下:
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"192.168.145.180",
"192.168.145.181",
"192.168.145.182",
"kubernets.default",
"kubernets.default.svc",
"kubernets.default.svc.cluster",
"kubernets.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "system"
}
]
}
编辑admin-csr.json,命令如下
vi admin-csr.json
内容如下:
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "system:masters",
"OU": "system"
}
]
}
编辑kube-proxy-csr.json,命令如下:
vi kube-proxy-csr.json
内容如下:
{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "system"
}
]
}
8)生成pem证书,命令如下:
cfssl gencert -initca csr.json | cfssljson -bare ca -
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=config.json -profile=kubernetes server-csr.json | cfssljson -bare server
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
9) 保留pem证书,删除其他多余文件,命令如下:
ls |grep -v pem |xargs -i rm {}
4.2.2 安装etcd
1)下载etcd,本次使用3.2.12版本,下载地址如下:
https://github.com/coreos/etcd/releases/tag/v3.2.12
2)上传etcd-v3.2.12-linux-amd64.tar.gz到soft目录下
3)解压etcd-v3.2.12-linux-amd64.tar.gz文件,命令如下:
cd /data/soft
tar -zxvf etcd-v3.2.12-linux-amd64.tar.gz
4)移动etcd执行文件到kubernetes的bin目录下,命令如下:
mv /data/soft/etcd-v3.2.12-linux-amd64/etcd /data/kubernetes/bin/
mv /data/soft/etcd-v3.2.12-linux-amd64/etcdctl /data/kubernetes/bin/
5)创建etcd配置文件,命令如下:
vi /data/kubernetes/cfg/etcd
内容如下:
#[Member]
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.145.180:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.145.180:2379"
#[clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.145.180:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.145.180:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.145.180:2380,etcd02=https://192.168.145.181:2380,etcd03=https://192.168.145.182:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
4.2.3 创建etcd系统服务
创建命令如下:
vi /usr/lib/systemd/system/etcd.service
内容如下:
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=/data/kubernetes/cfg/etcd
ExecStart=/data/kubernetes/bin/etcd \
--name=${ETCD_NAME} \
--data-dir=${ETCD_DATA_DIR} \
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-cluster=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-state=new \
--cert-file=/data/kubernetes/ssl/server.pem \
--key-file=/data/kubernetes/ssl/server-key.pem \
--peer-cert-file=/data/kubernetes/ssl/server.pem \
--peer-key-file=/data/kubernetes/ssl/server-key.pem \
--trusted-ca-file=/data/kubernetes/ssl/ca.pem \
--peer-trusted-ca-file=/data/kubernetes/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
4.2.4 拷贝pem证书
拷贝pem到/kubernetes/ssl下,命令如下:
cp /data/soft/ssl/server*pem /data/soft/ssl/ca*pem /data/kubernetes/ssl/
4.3 etcd slave节点安装
4.3.1 基础准备
1)使用XshellPortable连接到192.168.145.181的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)拷贝master服务器生成的pem证书到slave节点
拷贝ca.pem、ca-key.pem、server.pem、server-key.pem四个文件到slave节点上的/data/kubernetes/ssl目录下。
注意:在master节点生成的PEM证书,拷贝到slave节点上,不能在slave节点再生成,否则会出现加密不一致导致集群无法联通。
4.3.2 安装etcd
1)下载etcd,本次使用3.2.12版本,下载地址如下:
https://github.com/coreos/etcd/releases/tag/v3.2.12
2)上传etcd-v3.2.12-linux-amd64.tar.gz到soft目录下
3)解压etcd-v3.2.12-linux-amd64.tar.gz文件,命令如下:
cd /data/soft
tar -zxvf etcd-v3.2.12-linux-amd64.tar.gz
4)移动etcd执行文件到kubernetes的bin目录下,命令如下:
mv /data/soft/etcd-v3.2.12-linux-amd64/etcd /data/kubernetes/bin/
mv /data/soft/etcd-v3.2.12-linux-amd64/etcdctl /data/kubernetes/bin/
5)创建etcd配置文件,命令如下:
vi /data/kubernetes/cfg/etcd
内容如下:
#[Member]
ETCD_NAME="etcd02"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.145.181:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.145.181:2379"
#[clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.145.181:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.145.181:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.145.180:2380,etcd02=https://192.168.145.181:2380,etcd03=https://192.168.145.182:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
注:在安装slave3的时候,这里面的name名字和urls修改为etcd03和192.168.145.182
4.3.3 创建etcd系统服务
创建命令如下:
vi /usr/lib/systemd/system/etcd.service
内容如下:
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=/data/kubernetes/cfg/etcd
ExecStart=/data/kubernetes/bin/etcd \
--name=${ETCD_NAME} \
--data-dir=${ETCD_DATA_DIR} \
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-cluster=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-state=new \
--cert-file=/data/kubernetes/ssl/server.pem \
--key-file=/data/kubernetes/ssl/server-key.pem \
--peer-cert-file=/data/kubernetes/ssl/server.pem \
--peer-key-file=/data/kubernetes/ssl/server-key.pem \
--trusted-ca-file=/data/kubernetes/ssl/ca.pem \
--peer-trusted-ca-file=/data/kubernetes/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
4.4 启动etcd集群
启动etcd集群,需要对三台执行服务启动。执行命令如下:
systemctl start etcd
查看集群是否启动成功:
cd /data/kubernetes/bin
./etcdctl --ca-file=/data/kubernetes/ssl/ca.pem --cert-file=/data/kubernetes/ssl/server.pem --key-file=/data/kubernetes/ssl/server-key.pem cluster-health
4.5 安装问题处理
1.安装过程中配置出现问题,删除已有的实例,重启启动,命令如下:
systemctl stop etcd
rm -rf /var/lib/etcd/default.etcd
systemctl start etcd
2.如果服务启动失败可以通过如下命令查看具体原因
journalctl -u etcd.service
或者通过查看系统日志,命令如下:
tail /var/log/messages