搭建单节点etcd的备份与恢复
1.创建密钥
步骤1:下载安装cfssl工具
下载地址:
https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
下载到/usr/local/bin/里,然后分别命名为cfssl 、cfssl-certinfo 、cfssljson。
[root@vms21 ca]# ls /usr/local/bin/
cfssl cfssl-certinfo cfssljson
[root@vms21 ca]#
给这些文件可执行权限:
[root@vms21 ~]# chmod +x /usr/local/bin/cfssl*
[root@vms21 ~]#
步骤2:编辑ca配置文件
在root家目录下创建一个目录ca并进入到此目录
[root@vms21 ~]# mkdir ca ; cd ca
[root@vms21 ~]#
生成CA配置文件
[root@vms21 ca]# cfssl print-defaults config > ca-config.json
修改成如下内容:
[root@vms21 ca]# cat ca-config.json
{
"signing": {
"default": {
"expiry": "1680h"
},
"profiles": {
"www": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
}
}
}
}
[root@vms21 ca]#
生成CA所需要的证书请求文件:
[root@vms21 ca]# cfssl print-defaults csr > ca-csr.json
改成如下内容:
[root@vms21 ca]# cat ca-csr.json
{
"CN": "k8s",
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "CN",
"ST": "Jiangsu",
"L": "Xuzhou",
"O": "Lduan",
"OU": "cks"
}
]
}
[root@vms21 ca]#
生成CA自签名的证书和私钥
[root@vms21 ca]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
[root@vms21 ca]# ls
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem
[root@vms21 ca]#
这其中ca-key.pem是CA的私钥,ca.pem是CA的证书。
步骤3:生成用户所需要的证书请求文件
[root@vms21 ca]# cfssl print-defaults csr > admin-csr.json
[root@vms21 ca]#
修改成如下内容:
[root@vms21 ca]# cat admin-csr.json
{
"CN": "k8s",
"key": {
"algo": "ecdsa",
"size": 256
},
"hosts": [
"localhost",
"192.168.26.21",
"192.168.26.22",
"192.168.26.23"
],
"names": [
{
"C": "CN",
"ST": "Jiangsu",
"L": "Xuzhou",
"O": "Lduan",
"OU": "cks"
}
]
}
[root@vms21 ca]#
步骤4:生成由CA签发的私钥和证书
[root@vms21 ca]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www admin-csr.json | cfssljson -bare admin
[root@vms21 ca]#
步骤5:把所生成的证书、私钥及CA的证书拷贝到/ca2目录里
[root@vms21 ca]# mkdir /ca2
[root@vms21 ca]# cp admin-key.pem admin.pem ca.pem /ca2/
[root@vms21 ca]# cd
[root@vms21 ~]#
2.安装并配置etcd
步骤1:安装etcd
[root@vms21 ~]# yum install etcd -y
已加载插件:fastestmirror
...
[root@vms21 ~]#
步骤2:配置etcd
编辑/etc/etcd/etcd.conf,内容如下:
[root@vms21 ~]# cat /etc/etcd/etcd.conf
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="https://0.0.0.0:2379"
ETCD_NAME="default"
ETCD_TRUSTED_CA_FILE="/ca2/ca.pem"
ETCD_CERT_FILE="/ca2/admin.pem"
ETCD_KEY_FILE="/ca2/admin-key.pem"
ETCD_CLIENT_CERT_AUTH="true"
#[Clustering]
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.26.21:2379"
[root@vms21 ~]#
这里ETCD_LISTEN_CLIENT_URLS指的是,2379监听在哪张网卡上,写0.0.0.0的意思是在所有网卡上都开启2379端口。
ETCD_ADVERTISE_CLIENT_URLS指的是,用于通知集群中的节点,客户端可以通过什么地址能访问到“我”。
这里CLIENT_URLS是客户端访问etcd时的地址,端口为2379
步骤3:修改etcd的启动脚本
修改etcd的启动脚本 /usr/lib/systemd/system/etcd.service
ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd --name=\"${ETCD_NAME}\" --data-dir=\"${ETCD_DATA_DIR}\" --listen-client-urls=\"${ETCD_LISTEN_CLIENT_URLS}\" --cert-file=\"${ETCD_CERT_FILE}\" --key-file=\"${ETCD_KEY_FILE}\" --trusted-ca-file=\"${ETCD_TRUSTED_CA_FILE}\" --client-cert-auth=false"
上述黑体字是新增的。
步骤4:启动etcd
[root@vms21 ~]# systemctl daemon-reload ; systemctl restart etcd
[root@vms21 ~]#
[root@vms21 ~]# export ETCDCTL_API=3
[root@vms21 ~]# etcdctl --endpoints=https://192.168.26.21:2379 --cacert=/ca2/ca.pem --cert=/ca2/admin.pem --key=/ca2/admin-key.pem member list
8e9e05c52164694d, started, default, http://localhost:2380, https://192.168.26.21:2379
[root@vms21 ~]#
因为这里没有对2380做设置,所以记过显示2380是通过http访问而不是https。
步骤5:为了使用的方便,这里做一个别名
[root@vms21 ~]# alias etcdctl="etcdctl --endpoints=https://192.168.26.21:2379 --cacert=/ca2/ca.pem --cert=/ca2/admin.pem --key=/ca2/admin-key.pem"
3.为etcd做快照
步骤1:随变写一个测试数据
[root@vms21 ~]# etcdctl put mykey myvalue
OK
[root@vms21 ~]# etcdctl get mykey
mykey
myvalue
[root@vms21 ~]#
步骤2:给etcd做快照,快照名为etcd.data,保存在当前目录里
[root@vms21 ~]# etcdctl snapshot save etcd.data
Snapshot saved at etcd.data
[root@vms21 ~]#
这样快照里是又mykey=myvalue数据的了。
步骤3:删除这个测试数据
[root@vms21 ~]# etcdctl del mykey
1
[root@vms21 ~]# etcdctl get mykey
[root@vms21 ~]#
现在etcd里是没有mykey=myvalue这个数据了,但是快照里有。所以下面开始练习还原数据。
4.还原etcd
步骤1:首先关闭etcd
[root@vms21 ~]# systemctl stop etcd
[root@vms21 ~]#
步骤2:删除存储目录
[root@vms21 ~]# rm -rf /var/lib/etcd/default.etcd
[root@vms21 ~]#
步骤3:恢复快照
[root@vms21 ~]# etcdctl snapshot restore etcd.data --initial-cluster="default=http://localhost:2380" --name="default" --data-dir=/var/lib/etcd/default.etcd
...输出...
[root@vms21 ~]#
注意,因为我们并没有对2380端口进行加密,所以这里--initial-cluster="default=http://localhost:2380"写的是http不是https。
步骤4:测试数据是否被恢复
[root@vms21 ~]# etcdctl get mykey
mykey
myvalue
[root@vms21 ~]#
可以看到数据已经恢复出来了。