5 - 备份和恢复
RKE集群可以设置成自动创建etcd快照,在灾难发生时可以通过这些快照进行恢复,这些快照保存在本地目录。
v0.2.0版本可用
RKE还可以将快照上传到S3兼容的后端。此外pki.bundle.tar.gz
文件不再需要,因为v0.2.0使用xxxx.rkestate
来存储Kubernetes集群状态。
rke etcd snapshot-save
命令将从集群中的每个etcd节点保存etcd快照,快照保存在/opt/rke/etcd-snapshots
中。运行该命令时,将创建一个附加容器来获取快照。快照完成后,容器将自动删除。
在v0.2.0之前,RKE保存了证书的备份,名为pki.bundle.tar.gz
,也保存在/opt/rke/etcd-snapshots
中。在v0.2.0之前的版本中,系统恢复需要快照和pki包
文件。
2、本地手动快照示例
快照将保存在: /opt/rke/etcd-snapshots
3、手动快照上传到S3示例
rke etcd snapshot-save --config cluster.yml --name <snapshot-name> \
--s3 --access-key <S3_ACCESS_KEY> --secret-key <S3_SECRET_KEY> \
--bucket-name <s3-bucket-name> --s3-endpoint <s3.amazonaws.com>
快照将保存在:/opt/rke/etcd-snapshots
,同时也将上传到S3。
需要使用额外的配置选项启用etcd-snapshot服务,默认情况下,etcd-snapshot服务为具有etcd角色
的每个节点获取快照,并将它们存储到本地磁盘/opt/rke/etcd-snapshot
目录中。如果有配置S3相关参数,快照也将被上传到S3存储后端。
当集群启用了etcd-snapshot
服务时,可以查看etcd-roll-snapshot
容器日志,以确认是否自动创建备份。
docker logs etcd-rolling-snapshots
time="2018-05-04T18:39:16Z" level=info msg="Initializing Rolling Backups" creation=1m0s retention=24h0m0s
time="2018-05-04T18:40:16Z" level=info msg="Created backup" name="2018-05-04T18:40:16Z_etcd" runtime=108.332814ms
time="2018-05-04T18:41:16Z" level=info msg="Created backup" name="2018-05-04T18:41:16Z_etcd" runtime=92.880112ms
time="2018-05-04T18:42:16Z" level=info msg="Created backup" name="2018-05-04T18:42:16Z_etcd" runtime=83.67642ms
根据您的RKE版本,用于配置自动定时快照的选项可能有所不同。
- v0.2.0以及之后版本
services:
etcd:
backup_config:
interval_hours: 12
retention: 6
access_key: S3_ACCESS_KEY
secret_key: S3_SECRET_KEY
bucket_name: s3-bucket-name
region: ""
endpoint: s3.amazonaws.com
- v0.2.0之前
选项描述Snapshot默认情况下,禁用定时快照服务。要启用该服务,需要在etcd服务
中将其设置为true
。Creation默认情况下,快照服务将每隔5分钟创建一次(5m0s)。Retention默认情况下,所有快照保留24小时。
services:
etcd:
snapshot: true
creation: 5m0s
retention: 24h
重要提示: rke 0.1.x与rke 0.2.x因为的改变,如果集群是通过rke 0.1.x做的备份,那么无法直接使用rke 0.2.x进行数据恢复。如果集群状态正常,可以在恢复之前运行
rke up —config cluster.yml
进行集群状态更新。如果集群状态不正常,那只能通过rke 0.1.x进行恢复。警告: 恢复etcd快照会删除当前的etcd集群并将其替换为新集群。在运行该
rke etcd snapshot-restore
命令之前,应备份集群中的所有重要数据。
1、rke etcd snapshot-restore选项
2、从本地快照还原示例
当从本地快照恢复etcd时,假设快照位于/opt/rke/etcd-snapshots
中。在rke v0.2.0之前的版本中,pki.bundle.tar.gz
文件也应该在相同的位置, 从v0.2.0开始,不再需要这个文件,因为v0.2.0改变了Kubernetes集群状态的存储方式。
当从S3中的快照恢复etcd时,命令需要S3信息,以便连接到S3后端并检索快照。
rke etcd snapshot-restore --config cluster.yml --name snapshot-name \
--s3 --access-key S3_ACCESS_KEY --secret-key S3_SECRET_KEY \
--bucket-name s3-bucket-name --s3-endpoint s3.amazonaws.com
在本例中,Kubernetes集群部署在两个AWS节点上。
1、备份etcd集群
以Kubernetes集群的本地快照为例。从v0.2.0开始,您还可以使用S3选项将此快照直接上传到S3后端。
rke etcd snapshot-save --name snapshot.db --config cluster.yml
2、将快照存储在S3
从v0.2.0开始,不再需要这个步骤,因为RKE在运行rke etcd snapshot-save
命令时,可以通过添加S3选项自动从S3上传和下载快照。
在node2
上获取etcd快照之后,我们建议将该备份保存在持久性位置。其中一个选项是保存快照文件和pki.bundle.tar.gz
文件到S3。
# If you're using an AWS host and have the ability to connect to S3
root@node2:~# s3cmd mb s3://rke-etcd-backup
root@node2:~# s3cmd /opt/rke/etcd-snapshots/snapshot.db /opt/rke/etcd-snapshots/pki.bundle.tar.gz s3://rke-etcd-backup/
为了模拟失败场景,我们关闭node2
。
在恢复etcd并运行rke up
之前,我们需要检索保存在S3上的备份到一个新节点,例如: node3
。从v0.2.0开始,您可以在运行restore
命令时直接从S3检索快照,所以这一步是针对那些没有使用集成S3选项而在外部存储快照的用户。
4、通过备份恢复etcd到新节点上
在更新和恢复etcd之前,您需要编辑cluster.yml
配置文件,添加新节点并设置为etcd
角色,注释掉所有旧节点。
- address: 10.0.0.1
hostname_override: node1
user: ubuntu
role:
- controlplane
- worker
# - address: 10.0.0.2
# hostname_override: node2
# user: ubuntu
# role:
# - etcd
- address: 10.0.0.3
hostname_override: node3
user: ubuntu
role:
- etcd
将新节点添加到cluster.yml
之后。运行rke etcd snapshot-restore
从备份启动etcd
。快照和pki.bundle.tar.gz
文件需要预先放在/opt/rke/etcd-snapshot
目录中。
从v0.2.0开始,如果您想直接从S3检索快照,请添加S3选项。
rke etcd snapshot-restore --name snapshot.db --config cluster.yml
最后,我们需要恢复集群上的操作是让Kubernetes API指向新的etcd
,方法是使用新的cluster.yml
再次运行rke up
rke up --config cluster.yml
通过检查集群上的pod,来确认Kubernetes集群是否正常工作。
> kubectl --kubeconfig=kube_configxxx.yml get pods
NAME READY STATUS RESTARTS AGE
nginx-65899c769f-kcdpr 1/1 Running 0 17s
nginx-65899c769f-pc45c 1/1 Running 0 17s
nginx-65899c769f-qkhml 1/1 Running 0 17s
从v0.1.9
开始,在恢复成功和失败时都会删除rke-bundle-cert
容器。要调试任何问题,您需要查看从rke生成的日志文件
。
在v0.1.8
以及早期版本中,rke-bundle-cert
容器是etcd恢复失败后遗留下来的。如果您在还原etcd快照
时遇到问题,那么在尝试进行另一次还原之前,您可以在每个etcd节点上执行以下操作:
当etcd
备份或恢复成功时,通常会删除rke-bundle-cert
容器。无论什么时候出现问题,都会留下rke-bundle-cert
容器。您可以查看日志或检查容器,看看问题出在哪里。
docker container logs --follow rke-bundle-cert